147 votes

git selective revert local changes from a file

Dans mon dépôt git qui suit un dépôt svn, j'ai apporté un certain nombre de modifications à un seul fichier.

Maintenant, je veux revenir sur ces changements (comme svn revert), mais seulement sur certaines parties du fichier.

Je veux être en mesure de visualiser les différences sur le fichier, d'écarter (revenir) les changements que je ne veux pas et de conserver les changements que je veux.

le site

git add -i 

La commande semble avoir une option pour le faire mais je ne veux pas encore le faire.

307voto

Daniel Stutzbach Points 20026

Je crois que vous pouvez le faire plus simplement avec :

git checkout -p <optional filename(s)>

De la page de manuel :

   −p, −−patch
       Interactively select hunks in the difference between the <tree−ish>
       (or the index, if unspecified) and the working tree. The chosen
       hunks are then applied in reverse to the working tree (and if a
       <tree−ish> was specified, the index).
       This means that you can use git checkout −p to selectively discard
       edits from your current working tree.

91voto

Paolo Capriotti Points 2874

Vous pouvez le faire directement avec git checkout -p . Voir La réponse de Daniel Stutzbach ci-dessous.


Ancienne réponse (avant checkout -p a été introduit) :

Vous pouvez le faire comme ça :

git add -i

(sélectionnez les morceaux que vous voulez garder)

git commit -m "tmp"

Maintenant, vous avez un commit avec seulement les changements que vous voulez garder, et le reste est unstaged.

git reset --hard HEAD

À ce stade, les modifications non validées ont été supprimées, vous avez donc un répertoire de travail propre, avec les modifications que vous voulez conserver validées en haut.

git reset --mixed HEAD^

Cela supprime le dernier commit ('tmp'), mais garde les modifications dans votre répertoire de travail, non indexées.

EDIT : remplacé --soft con --mixed pour nettoyer la zone de transit.

3voto

Greg Hewgill Points 356191

Tu pourrais courir git diff sur le fichier, sauvegarder le diff résultant, l'éditer pour supprimer les changements que vous avez faire que vous voulez sauvegarder, puis passez-le dans patch -R pour annuler les différences restantes.

git diff file.txt >patch.tmp
# edit patch.tmp to remove the hunks you want to keep
patch -R <patch.tmp

2voto

Kent Fredric Points 35592

On dirait que vous voulez

 git revert --no-commit $REVSISON 

Vous pouvez alors utiliser

 git diff --cached

pour voir quel changement sera fait avant de valider (car le retour en arrière est juste une validation dans le sens inverse qui réplique l'inverse d'un changement dans le passé).

Si vous étiez avec un dépôt Git pur, vous pourriez éventuellement, en fonction de vos objectifs, utiliser le rebasement interactif ( git rebase -i ) pour revenir au commit que vous n'avez pas aimé et l'éditer rétroactivement pour que les changements que vous n'aimez pas n'aient jamais eu lieu, mais c'est généralement seulement pour les cas suivants SAVOIR vous ne voudrez plus jamais le revoir.

1voto

Charles Bailey Points 244082

En relisant la question, on dirait que vous voulez revenir sur les changements qui sont dans votre arbre de travail et non sur les changements qui ont été précédemment livrés, mais certaines des autres réponses donnent l'impression que ma lecture est peut-être erronée. Pouvez-vous clarifier ?

Si les modifications ne concernent que votre copie de travail, le moyen le plus simple est de mettre en scène les modifications que vous souhaitez conserver :

git add -i <file>

Ensuite, jetez les modifications que vous ne voulez pas conserver en vérifiant la version index :

git checkout -- <file>

Ensuite, déstockez les changements si vous ne voulez pas encore les stocker :

git reset -- <file>

Cette recette n'annule que les changements sélectionnés dans le fichier (ou les fichiers que vous spécifiez) et ne crée pas de commit temporaire qui doit ensuite être annulé.

Si vous voulez appliquer de manière sélective seulement certaines des modifications effectuées dans les commits précédents, vous pouvez d'abord réinitialiser un fichier à un état de commit précédent :

git reset <commit_before_first_unwanted_change> -- <file>

Ensuite, vous pouvez suivre la recette précédente de git add -i <file> pour mettre en scène les changements que vous souhaitez conserver, git checkout -- <file> pour jeter les changements non désirés et git reset -- <file> pour "déstabiliser" les changements.

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