2010-04-12 4 views
50

Je souhaite annuler les modifications apportées par un commit particulier à un fichier donné uniquement. Puis-je utiliser la commande git revert pour cela?Annuler les modifications apportées à un fichier dans une validation

Une autre façon simple de le faire?

+0

Duplicata de http://stackoverflow.com/questions/215718/reset-or-revert-a-specific-file-to-a-specific-revision-using-git/215768 – koppor

+0

Étrange ... pourquoi le changement après toutes ces années? – VonC

Répondre

90

La façon plus propre que je l'ai vu de faire cela est décrit here

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

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

+2

Boom! Tu es l'homme. – yitznewton

+6

Bien fait. La solution de script est exagérée pour cela. Pourquoi ne peut-il pas être juste git revert sha-1 nom de fichier? –

+0

Nice, mais VonCs n'est pas mauvais non plus. Avec les deux il y a quelque chose à apprendre chaque jour dans git :) – hakre

18

git revert est pour tous les contenus de fichiers dans un commits.

Pour un seul fichier, vous pouvez script it:

#!/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 

(Des git-shell-scripts services publics de smtlaissezfaire)


Note:

Une autre façon est described here si vous avez encore commettez votre modification actuelle.

git checkout -- filename 

git checkout a quelques options pour un fichier, la modification du fichier de HEAD, votre changement écrasant.


Dropped.on.Caprica mentions in the comments:

Vous pouvez ajouter un alias à git afin que vous puissiez faire git revert-file <hash> <file-loc> et ont ce fichier spécifique soit inversé.
Voir this gist.

[alias] 
    revert-file = !sh /home/some-user/git-file-revert.sh 
+0

Juste pour ajouter à la discussion ici, vous pouvez ajouter un alias à git afin que vous puissiez faire 'git revert-file ' et que ce fichier spécifique soit restauré. Je me suis levé de cette réponse (même si j'ai dû faire quelques modifications pour fonctionner correctement). Vous pouvez trouver une copie de mon '.gitconfig' et script édité ici: https://gist.github.com/droppedoncaprica/5b67ec0021371a0ad438 –

+0

@ Dropped.on.Caprica bon point. Je l'ai inclus dans la réponse pour plus de visibilité. – VonC

+0

Merci! J'ai mis un peu à jour votre article pour qu'il corresponde à la bonne utilisation, mais sinon, c'est bon! –

12

Je voudrais simplement utiliser l'option --no-commit à git-revert puis supprimer les fichiers que vous ne voulez pas Reconvertit de l'index avant de finalement commettre. Voici un exemple montrant comment revenir facilement seulement les changements Foo.c dans la deuxième plus récent engagement:

$ 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 

Les premiers git-reset « unstages » tous les fichiers, de sorte que nous pouvons rajouter que le seul fichier que nous vouloir revenir. Le dernier git-reset --hard se débarrasse des fichiers restants que nous ne voulons pas conserver.

15

Si l'on suppose qu'il est autorisé à changer l'engagement historique, voici un flux de travail pour annuler des changements dans un seul fichier dans une version antérieure commettras:

Par exemple, vous voulez annuler des changements dans 1 fichier (badfile.txt) COMMIT aaa222 :

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

Rebase sur la base de commettre, modifier le problème commit, & continuer.

1) Lancer rebasage interactif:

git rebase -i aaa111 

2) Marquer le problème commettras pour modifier dans l'éditeur en changeant pick à e (pour modifier):

e aaa222 
pick aaa333 

3) Revert changements à le mauvais fichier:

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

4) Ajouter les changements & modifier la commettras:

git add badfile.txt 
git commit --amend 

5) Terminer le rebasage:

git rebase --continue 
+0

Je veux juste faire remarquer que cela suppose que vous pouvez modifier l'historique git. Certaines réponses ci-dessus créent une nouvelle validation qui inverse le changement particulier sans modifier l'historique, ce qui n'est pas toujours possible/autorisé. – angularsen

+0

Cette solution était mon choix et a parfaitement fonctionné! Rebase interactif peut faire beaucoup de magie :) Merci! –

1

Beaucoup plus simple:

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

puis

git commit --amend 

puis

git push -f 

le fichier est parti et commettre le hachage, le message, etc est la même chose.

+0

Pour être complet, avez-vous besoin d'une étape 'git checkout - chemin/vers/fichier/vers/retour'? En outre, il n'est pas vrai que le hachage est le même par la suite, non? La dernière phrase pourrait être mieux comme quelque chose comme: "Le résultat est que le dernier commit est remplacé par un nouveau qui ne diffère que dans la mesure où il ne contient pas les modifications apportées au fichier rétabli." – Kevin

Questions connexes