Annuler une partie des modifications non indexées dans git
Comment annuler des parties de mes changements non indexés dans git mais garder le reste comme non indexé? La façon dont j'ai compris est:
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
seulement pour revenir aux changements. Toutes les meilleures méthodes?
7 réponses
Vous pouvez utiliser git checkout -p
, ce qui vous permet de choisir des morceaux individuels dans le diff entre votre copie de travail et votre index à restaurer. De même, git add -p
vous permet de choisir les beaux mecs pour ajouter à l'index, et git reset -p
vous permet de choisir individuellement les mecs de la diff entre l'index et le CHEF de l'index.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Si vous souhaitez capturer votre dépôt Git à l'avance pour conserver ces modifications avant de les rétablir, j'aime faire:
$ git stash; git stash apply
Si vous utilisez souvent, vous pourriez alias:
[alias]
checkpoint = !git stash; git stash apply
Restaurer des morceaux ou des lignes individuels peut être encore plus facile si vous utilisez un bon mode d'éditeur ou un plugin, qui peut fournir un support pour sélectionner des lignes directement à restaurer, comme -p
peut être un peu maladroit à utiliser parfois. J'utilise Magit , un mode Emacs très utile pour travailler avec Git. Dans Magit, vous pouvez exécuter magit-status
, trouver les diff pour que les modifications que vous souhaitez annuler, sélectionnez les lignes que vous souhaitez revenir (ou simplement mettre le curseur sur les morceaux que vous souhaitez revenir si vous voulez revenir à un morceau à la fois au lieu d'une ligne à la fois), et appuyez sur k
pour revenir à ces lignes spécifiques. Je recommande fortement Magit si vous utilisez Emacs.
git diff > patchfile
Ensuite, modifiez le fichier patch et supprimez les parties que vous ne voulez pas annuler, puis:
patch -R < patchfile
Vous pourriez faire
git checkout master -- path/to/file
Pour chaque fichier que vous souhaitez réinitialiser.
Que diriez-vous de
- Sauvegardez les fichiers affectés avec les modifications de l'index
- utiliser
git add -p
pour ajouter uniquement les modifications que vous souhaitez à l'index.
Quand je lance 'git status' , il 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 agencées, il me dit de courir:
git checkout -- makefile
La réponse de Brian Campbell bloque mon git, version 1.9.2.msysgit.0, pour des raisons inconnues, donc mon approche est de mettre en scène les mecs que je veux garder, de rejeter les changements dans la copie de travail, puis de les défaire.
$ git add -p
... select the hunks to keep
$ git checkout -- .
$ git reset HEAD .
Vous pouvez faire git checkout
et lui donner le nom des noms des parties que vous voulez annuler.