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?
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?
Réponses:
La façon la plus propre que j'ai vue de faire cela 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
.
fatal: unrecognized input
-3
drapeau à git apply pour la fusion à trois lorsque le correctif échoue, car je corrige généralement un changement un peu en arrière.
some_file.c
inclut le chemin d' accès au fichier s'il y en a un, sinon vous ne corrigerez rien en silence :)
En supposant que vous pouvez modifier l'historique des validations, voici un flux de travail pour annuler les modifications d'un seul fichier lors d'un commit précédent:
Par exemple, vous souhaitez annuler les modifications dans 1 fichier ( badfile.txt
) dans la validation aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Rebase sur le commit de base, modifie le commit du problème et continue.
1) Démarrez le rebase interactif:
git rebase -i aaa111
2) Marquez la validation du problème pour édition dans l'éditeur en changeant pick
en e
(pour édition):
e aaa222
pick aaa333
3) Annulez les modifications apportées au mauvais fichier:
git show -- badfile.txt | git apply -R
4) Ajoutez les changements et modifiez le commit:
git add badfile.txt
git commit --amend
5) Terminez le rebase:
git rebase --continue
edit
ne montraient pas comme modifiés. Mais le a git show -- badfile.txt | git apply -R
donné la réponse dont j'avais besoin <3
git revert
est pour tout le contenu de fichier dans un commits.
Pour un seul fichier, vous pouvez le script :
#!/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
(Depuis les utilitaires git-shell-scripts de smtlaissezfaire )
Remarque:
une autre méthode 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 le faire
git revert-file <hash> <file-loc>
et faire revenir ce fichier spécifique.
Voir l'essentiel .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
et que ce fichier spécifique soit rétabli. J'ai soulevé cette réponse (même si j'ai dû faire quelques modifications pour fonctionner correctement). Vous pouvez trouver une copie de mon .gitconfig
script édité ici: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
J'utiliserais simplement l' --no-commit
option pour git-revert
, puis supprimerais les fichiers que vous ne voulez pas récupérer de l'index avant de finalement 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
Le premier git-reset
"désactive" tous les fichiers, de sorte que nous puissions ensuite rajouter uniquement le fichier que nous voulons restaurer. La finale git-reset --hard
supprime les fichiers restants que nous ne voulons pas conserver.
Beaucoup plus simple:
git reset HEAD^ path/to/file/to/revert
puis
git commit --amend
puis
git push -f
le fichier est parti et la validation du hachage, du message, etc. est identique.
git checkout -- path/to/file/to/revert
étape? De plus, ce n'est pas vrai que le hachage est le même après coup, non? La dernière phrase pourrait être meilleure comme quelque chose comme: "Le résultat est que le dernier commit est remplacé par un nouveau qui diffère uniquement en ce qu'il ne contient pas les modifications du fichier rétabli."
git reset HEAD^ path/to/file/to/revert/in/commit
La commande ci-dessus retirera 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 (en conséquence, vous obtenez le même fichier que HEAD).
git commit
(Passer --amend
pour modifier le commit.)
git push
Avec cela, le fichier qui est déjà dans le commit est supprimé et restauré.
Les étapes ci-dessus doivent être suivies à partir de la branche où la validation est effectuée.
Vous pouvez suivre cette procédure:
git revert -n <*commit*>
( -n
annuler toutes les modifications mais ne les validera 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)Si vous souhaitez réinitialiser les modifications sur un fichier de votre dernier commit, c'est ce que j'utilise habituellement. Je pense que c'est la solution la plus simple.
Veuillez noter que le fichier sera ajouté à la zone de préparation.
git checkout <prev_commit_hash> -- <path_to_your_file>
J'espère que ça aide :)