web-dev-qa-db-fra.com

Comment puis-je corriger un commit git annulé?

J'ai commis un tas de changements dans un référentiel, et ils ont été annulés par quelqu'un d'autre (ils compilent sur Windows mais pas sur Linux). Je pense que les modifications sont toujours dans l'histoire, mais comment puis-je récupérer ces modifications, les corriger, puis les soumettre à nouveau?

41
mmr

Avez-vous essayé d'annuler le retour?

Ils ont annulé votre validation en utilisant

git revert <your commit id>

Le retour lui-même est un commit et a son propre id de commit. Alors maintenant, vous devez faire

git revert <the commit id of his revert-commit>
73
Nils Werner

Vous pouvez essayer d'annuler les annulations en utilisant git revert. Vous pouvez également restaurer les fichiers à partir de votre commit à l'aide de git checkout. Ou vous pouvez utiliser git cherry-pick -n pour les réappliquer et les modifier. Vous pouvez créer une nouvelle branche à partir de votre commit où vous appliquez les modifications à l'aide de git branch. Les possibilités sont presque infinies. :)

23
Bombe

Les autres réponses ici concernent comment annuler ou sélectionner vos commits, mais il semble que la question vous demande également de savoir comment trouver vos commits, alors voici quelques conseils à ce sujet.

Si vous exécutez simplement git log vous devriez voir une liste des validations dans l'historique de votre branche actuelle, en commençant par la plus récente. Chaque commit a un identifiant techniquement connu sous le nom d'objet (ou "SHA1sum of the commit") qui ressemble à ceci:

commit d2d434beeb03e4ee648ca7ca2a1ea1ed09077306

... suivi du nom de l'auteur, de la date et d'un résumé des modifications apportées par ce commit. Lorsque vous spécifiez le nom d'objet pour git revert ou git cherry-pick vous pouvez lui donner d2d434beeb03e4ee648ca7ca2a1ea1ed09077306 ou juste assez de caractères depuis le début du nom de l'objet pour être sans ambiguïté (par exemple d2d434bee)

git log a plusieurs options qui peuvent vous aider à retrouver vos commits, comme --before, -S, etc. mais dans ce cas, vous aurez particulièrement besoin de --author=MyLastName.

Un outil graphique git qui peut vous présenter l’historique joliment et qui est disponible sur toutes les plateformes est gitk --all. Si vous cliquez sur un commit que vous souhaitez annuler, vous pouvez copier-coller son nom d'objet à partir du champ "ID SHA1" au milieu de la fenêtre.

2
Mark Longair

Vous pouvez également faire comme une réponse de situation similaire https://stackoverflow.com/a/10415744/704008 de @MarkLongair. La réponse est mieux adaptée pour plusieurs validations et si vous ne voulez pas gâcher le journal git ou l'historique du contrôle de source de revenir en arrière, puis à nouveau de revenir en arrière.

git revert abcd123
git revert --no-commit wxyz789
git commit --amend -m"you edit commit message"

Vous pouvez également avoir concis dans une ligne pour deux ou plusieurs commits de retour comme:

git revert abcd123 wxyz789 --no-commit 
git commit --amend -m"you edit commit message"

... puis rédigez un message de validation approprié décrivant l'effet combiné de l'annulation des deux validations.

Tout cela apparaîtra sous la forme d'un commit unique avec un message donné et non de commit revert multiple dans le journal git ou au-dessus des journaux de contrôle de source (comme l'intégration bitbucket/TFS/JIRA git).

1
Pranav Singh