154 votes

Annuler une partie des changements non indexés dans git

Comment annuler des parties de mes modifications non indexées dans git mais garder le reste comme non indexé ? La méthode que j'ai trouvée est la suivante :

git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply

Cela fonctionne, mais ce serait bien s'il y avait quelque chose comme git commit --interactive uniquement pour annuler les changements. Y a-t-il de meilleures méthodes ?

256voto

Brian Campbell Points 101107

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 à rétablir. De même, git add -p vous permet de choisir les chasses à ajouter à l'index, et git reset -p vous permet de choisir des chasses individuelles dans la différence entre l'index et HEAD pour revenir en arrière dans l'index.

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

Si vous souhaitez faire un snapshot de votre dépôt git au préalable pour préserver ces changements avant de les annuler, j'aime le faire :

$ git stash; git stash apply

Si vous l'utilisez souvent, vous pourriez vouloir l'aliaser :

[alias]
    checkpoint = !git stash; git stash apply

Rétablir des hunks ou des lignes individuelles peut être encore plus facile si vous utilisez un bon mode d'édition ou un plugin, qui peut fournir un support pour sélectionner directement des lignes à rétablir, comme -p peut parfois être un peu maladroit à utiliser. J'utilise Magit un mode Emacs qui est très utile pour travailler avec Git. Dans Magit, vous pouvez exécuter magit-status trouvez les diffs pour les changements que vous voulez inverser, sélectionnez les lignes que vous voulez inverser (ou mettez simplement le curseur sur les hunks que vous voulez inverser si vous voulez inverser un hunk à la fois au lieu d'une ligne à la fois), et appuyez sur k pour rétablir ces lignes spécifiques. Je recommande vivement Magit si vous utilisez Emacs.

23voto

octoberblu3 Points 11
git diff > patchfile

Puis éditez le patchfile et supprimez les parties que vous ne voulez pas défaire, ensuite :

patch -R < patchfile

5voto

Drew Hoskins Points 3206

Vous pourriez faire

git checkout master -- path/to/file

Pour chaque fichier que vous voulez réinitialiser.

1voto

Abizern Points 52378

Qu'en est-il

  1. Retourner les fichiers affectés avec les changements de l'index
  2. utilice git add -p pour ne rajouter à l'index que les modifications que vous souhaitez.

1voto

Jonathan Leffler Points 299946

Quand j'exécute 'git status', cela dit :

$ git status
# On branch fr/fr.002
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   makefile
#
no changes added to commit (use "git add" and/or "git commit -a")
$

Donc, pour annuler les modifications non mises en page, il me dit d'exécuter :

git checkout -- makefile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X