web-dev-qa-db-fra.com

git selectif annule les modifications locales d'un fichier

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 annuler ces changements (comme svn revert), mais seulement des parties du fichier.

Je veux pouvoir voir les différences sur le fichier, rejeter (annuler) les changements que je ne veux pas et conserver les changements que je veux.

le

git add -i 

la commande semble avoir une option pour le faire, mais je ne veux pas encore la mettre en scène.

143
Pradeep

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


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

Vous pouvez le faire comme ceci:

git add -i

(sélectionnez les mecs que vous souhaitez conserver)

git commit -m "tmp"

Vous avez maintenant un commit avec uniquement les modifications que vous souhaitez conserver et le reste n'est pas mis en scène.

git reset --hard HEAD

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

git reset --mixed HEAD^

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

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

88
Paolo Capriotti

Je pense que vous pouvez le faire plus simplement avec:

git checkout -p <optional filename(s)>

Depuis 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.
302
Daniel Stutzbach

Vous pouvez exécuter git diff sur le fichier, enregistrez le diff résultant, modifiez-le pour supprimer les modifications que vous faites souhaitez enregistrer, puis exécutez-le patch -R pour annuler les différences restantes.

git diff file.txt> patch.tmp 
 # éditez patch.tmp pour supprimer les morceaux que vous souhaitez conserver 
 patch -R <patch.tmp
3
Greg Hewgill

On dirait que tu veux

 git revert --no-commit $REVSISON 

Vous pouvez ensuite utiliser

 git diff --cached

pour voir quel changement sera effectué avant de valider (car le retour est juste un commit dans une direction avant qui reproduit l'inverse d'un changement dans le passé)

Si vous étiez avec un référentiel Git pur, vous pourriez éventuellement, selon vos objectifs, utiliser un rebase interactif (git rebase -i) pour revenir au commit que vous n'avez pas aimé et éditer le commit rétroactivement afin que les changements que vous n'aimez pas ne se produisent jamais, mais c'est généralement seulement pour si vous CONNAISSEZ vous ne voudrez plus jamais le revoir.

2
Kent Fredric

En relisant la question, il semble que vous souhaitiez annuler les modifications qui se trouvent dans votre arbre de travail et non les modifications qui ont été précédemment validées, mais certaines des autres réponses donnent l'impression que ma lecture peut être erronée. Pouvez-vous clarifier?

Si les modifications se trouvent uniquement dans votre copie de travail, la façon la plus simple de procéder consiste à mettre en scène les modifications que vous souhaitez conserver:

git add -i <file>

Jetez ensuite les modifications que vous ne souhaitez pas conserver en consultant la version d'index:

git checkout -- <file>

Décompressez ensuite les modifications si vous ne souhaitez pas encore les mettre en scène:

git reset -- <file>

Cette recette annule uniquement les modifications sélectionnées du fichier (ou des fichiers que vous spécifiez) et ne crée aucune validation temporaire qui doit ensuite être annulée.

Si vous souhaitez appliquer de manière sélective uniquement certaines des modifications apportées lors des validations précédentes, vous pouvez d'abord réinitialiser un fichier à un état validé 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 modifications que vous souhaitez conserver, git checkout -- <file> pour supprimer les modifications indésirables et git reset -- <file> pour "annuler" les modifications.

1
CB Bailey

Les options de ligne de commande décrites dans les réponses ici sont utiles lorsque le fichier se trouve sur un serveur auquel j'accède via un terminal ssh. Cependant, lorsque le fichier est sur ma machine locale, je préfère la manière suivante:

Ouvrez le fichier dans l'éditeur netbeans (fourni avec le support git). Netbeans met des marques rouges/vertes/bleues aux numéros de ligne pour indiquer où les éléments ont été supprimés/ajoutés/modifiés (respectivement).

Un clic droit sur l'une de ces marques vous donne la possibilité d'annuler cette modification. En outre, vous pouvez cliquer avec le bouton droit sur les marques rouges et bleues pour trouver l'ancienne version dans une fenêtre contextuelle.

0
Abhishek Anand