Vous pouvez utiliser git checkout -p
, qui vous permet de choisir des morceaux individuels de la différence entre votre copie de travail et l'index pour revenir. De même, git add -p
vous permet de choisir des morceaux à ajouter à l'index et git reset -p
vous permet de choisir des morceaux individuels de la différence entre l'index et HEAD pour sortir de l'index.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Si vous souhaitez créer un instantané de votre dépôt git au préalable pour conserver ces modifications avant de les annuler, j'aime faire:
$ git stash; git stash apply
Si vous l'utilisez souvent, vous voudrez peut-être lui attribuer un alias:
[alias]
checkpoint = !git stash; git stash apply
La restauration de morceaux ou de lignes individuelles peut être encore plus facile si vous utilisez un bon mode éditeur ou un bon plugin, qui peut fournir un support pour sélectionner directement les lignes à inverser, ce qui -p
peut parfois être un peu maladroit à utiliser. J'utilise Magit , un mode Emacs très utile pour travailler avec Git. Dans Magit, vous pouvez exécuter magit-status
, trouver les différences pour les modifications que vous souhaitez annuler, sélectionner les lignes que vous souhaitez annuler (ou simplement placer le curseur sur les morceaux que vous souhaitez inverser si vous voulez revenir un morceau à la fois au lieu de ligne à la fois) et appuyez sur k
pour inverser ces lignes spécifiques. Je recommande vivement Magit si vous utilisez Emacs.
git checkout
y a aussi un-p
drapeau, qui fait exactement ce que vous demandiez en une seule commande. Toutes mes excuses pour l’ensemble complexe d’étapes précédentes; vous pouvez simplement utilisergit checkout -p
. En ce qui concerne la sauvegarde de choses, avant de faire quelque chose de potentiellement destructeur, je fais souvent ungit stash; git stash apply
(ou crée un alias qui fait cela commegit checkpoint
ou quelque chose) pour enregistrer l'arbre actuel dans une réserve afin que je puisse y revenir si quelque chose ne va pas.git commit -a -m "Backup Commit" --edit; git reset HEAD^
serait mieux, car cela ne salirait pas mon état de cache, que j'utilise peut-être pour autre chose. Ensuite, tant que vous avez le SHA1, vous pouvez le choisir dans les 30 prochains jours. Le --edit vous permet d'ajouter des informations au message de validation pour vous aider à trouver le SHA1 plus tard si vous le souhaitez. D'un autre côté, cela salirait le git reflog, donc je suppose que c'est un compromis basé sur ce que vous faites.git checkout -p
pas appliquer les correctifs à l'index mais de les mettre en scène uniquement?Ensuite, éditez le fichier patch et supprimez les parties que vous ne voulez pas annuler, puis:
la source
patchfile
fière allure dans vim et cela aide vraiment!git apply -R
place depatch
(juste pour rester dans les domaines de git, ou dans l'événement différent quipatch
n'est pas disponible)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Vous pourriez faire
Pour chaque fichier que vous souhaitez réinitialiser.
la source
Que diriez-vous
git add -p
pour ajouter uniquement les modifications souhaitées à l'index.la source
Quand j'exécute 'git status', il dit:
Donc, pour annuler les modifications non organisées, il me dit d'exécuter:
la source
La réponse de Brian Campbell plante mon git, version 1.9.2.msysgit.0, pour des raisons inconnues, donc mon approche est de mettre en scène les morceaux que je veux conserver, d'annuler les modifications dans la copie de travail, puis de désinstaller.
la source
git stash -p
. Vous pourriez fairegit stash -p; git reset --hard; git stash pop
. C'est effectivement la même chose que ce que vous faites sauf que vous n'avez pas à écrire un message de validation.vous pouvez faire
git checkout
et lui donner le nom des parties que vous souhaitez annuler.la source