web-dev-qa-db-fra.com

Annuler les modifications apportées à un fichier dans une validation

Je souhaite annuler les modifications apportées par un commit particulier à un fichier donné uniquement.

Puis-je utiliser la commande git revert pour cela?

Une autre façon simple de le faire?

91
Lakshman Prasad

La façon la plus propre que j'ai vue de le faire est décrite ici

git show some_commit_sha1 -- some_file.c | git apply -R

Similaire à la réponse de VonC mais en utilisant git show et git apply.

160
mgalgs

En supposant qu'il est correct de modifier l'historique des validations, voici un workflow pour annuler les modifications dans un seul fichier dans une validation antérieure:

Par exemple, vous souhaitez annuler les modifications dans 1 fichier (badfile.txt) dans commit aaa222:

aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit

Rebase sur la validation de base, modifiez la validation du problème et continuez.

1) Démarrez le rebase interactif:

git rebase -i aaa111

2) Marquez le commit du problème pour modification dans l'éditeur en changeant pick en e (pour modification):

e aaa222
pick aaa333

3) Annulez les modifications apportées au mauvais fichier:

git show -- badfile.txt | git apply -R

4) Ajoutez les modifications et modifiez le commit:

git add badfile.txt
git commit --amend

5) Terminez le rebase:

git rebase --continue
24
tee

git revert est pour tout le contenu du fichier dans un commit.

Pour un seul fichier, vous pouvez le scripter :

#!/bin/bash

function output_help {
    echo "usage: git-revert-single-file <sha1> <file>"
}

sha1=$1
file=$2

if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi

(À partir des git-Shell-scripts utilitaires de smtlaissezfaire )


Remarque:

une autre façon est décrite ici si vous n'avez pas encore validé votre modification actuelle.

git checkout -- filename

git checkout a quelques options pour un fichier, modifiant le fichier de HEAD, écrasant votre changement.


Dropped.on.Caprica mentionne dans les commentaires :

Vous pouvez ajouter un alias à git pour pouvoir faire git revert-file <hash> <file-loc> et faire revenir ce fichier spécifique.
Voir ce Gist .

[alias]
  revert-file = !sh /home/some-user/git-file-revert.sh
19
VonC

J'utiliserais simplement le --no-commit option pour git-revert, puis supprimez les fichiers que vous ne souhaitez pas restaurer de l'index avant de le valider. Voici un exemple montrant comment annuler facilement les modifications apportées à foo.c dans le deuxième commit le plus récent:

$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD

La première git-reset "décompresse" tous les fichiers, afin que nous puissions ensuite rajouter uniquement le fichier que nous voulons rétablir. Le final git-reset --hard supprime les restes de fichiers restants que nous ne voulons pas conserver.

12
Dan Moulding
git reset HEAD^ path/to/file/to/revert/in/commit

La commande ci-dessus supprimera le fichier de la validation, mais elle se reflétera dans git status.

git checkout path/to/file/to/revert/in/commit

La commande ci-dessus annulera les modifications (par conséquent, vous obtenez le même fichier que HEAD).

git commit

(Passer --amend pour modifier l'engagement.)

git Push

Avec cela, le fichier qui est déjà dans le commit est supprimé et rétabli.

Les étapes ci-dessus doivent être suivies à partir de la branche où la validation est effectuée.

5
Bharath T S

Beaucoup plus simple:

git reset HEAD^ path/to/file/to/revert

puis

git commit --amend   

et alors

git Push -f

le fichier a disparu et le hachage de validation, le message, etc. est le même.

4
Forrest

Vous pouvez suivre cette procédure:

  1. git revert -n <*commit*> (-n annule toutes les modifications mais ne les valide pas)
  2. git add <*filename*> (nom du/des fichier (s) que vous souhaitez rétablir et valider)
  3. git commit -m 'reverted message' (ajouter un message pour revenir)
  4. après validation, ignorer les autres modifications de fichiers afin que les fichiers restent à jour avec les modifications que vous avez validées avant la restauration
1
Imran Sahil