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.
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.
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.
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
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.
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.
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.