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?

130
git
demandé sur asmeurer 2009-12-30 22:00:27

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.

218
répondu Brian Campbell 2010-01-03 17:55:06
git diff > patchfile

Ensuite, modifiez le fichier patch et supprimez les parties que vous ne voulez pas annuler, puis:

patch -R < patchfile
17
répondu octoberblu3 2016-01-20 10:48:54

Vous pourriez faire

git checkout master -- path/to/file

Pour chaque fichier que vous souhaitez réinitialiser.

5
répondu Drew Hoskins 2009-12-30 19:07:15

Que diriez-vous de

  1. Sauvegardez les fichiers affectés avec les modifications de l'index
  2. utiliser git add -p pour ajouter uniquement les modifications que vous souhaitez à l'index.
1
répondu Abizern 2009-12-30 19:05:43

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
1
répondu Jonathan Leffler 2010-01-04 14:03:10

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 .
1
répondu G-Wiz 2017-05-23 12:34:38

Vous pouvez faire git checkout et lui donner le nom des noms des parties que vous voulez annuler.

0
répondu Andrew 2009-12-30 19:03:46