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?
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
.
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
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
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.
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.
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.
Vous pouvez suivre cette procédure:
git revert -n <*commit*>
(-n
annule toutes les modifications mais ne les valide pas)git add <*filename*>
(nom du/des fichier (s) que vous souhaitez rétablir et valider)git commit -m 'reverted message'
(ajouter un message pour revenir)