84 votes

Annuler une fusion par avance rapide

J'ai fait quelques changements dans mon repo git que je souhaite annuler.

Mon repo git ressemblait à ceci :

A-B----     master
   \   /
    C-D     * develop

J'étais sur le develop a oublié qu'elle différait de la branche master a effectué une modification sur la branche develop , l'a fusionné avec master et ensuite poussé vers ma télécommande (appelée publish ).

Parce qu'il n'y a pas eu de changement sur master depuis B (ancêtre commun), git a fait une fusion rapide.

Maintenant, mon repo ressemble à ceci :

A-B-C-D   master, develop, remotes/publish/master, remotes/publish/develop.

J'ai voulu revenir sur la dernière fusion, en rétablissant master à B.

D'après ce que j'ai lu dans Comment annuler le(s) dernier(s) commit(s) dans Git ? J'ai utilisé git reset sha-of-B pour restaurer mon master à la révision B.

Questions :

  • Comment restaurer develop à la révision D ?
  • Comment puis-je ensuite repousser ces modifications vers remote/publish ?

103voto

Simon Boudrias Points 12696

Si vous réinitialisez la branche master, elle ne touchera pas la branche develop. Pour que tout soit en ordre, il faut faire :

git checkout master
git reset --hard sha-of-B
git checkout develop
git reset --hard sha-of-D
git checkout master
git merge develop --no-ff

31voto

Robert Siemer Points 1323
  • imaginez que vous êtes toujours sur maître où vous avez fusionné et poussé
  • git reset --hard @{1}
    • cela réinitialise la branche "maître" à l'endroit où il se trouvait un pas en arrière sur votre ordinateur (c'est-à-dire à "B")
  • pour développer ne rien faire, car il devrait toujours être à "D"
  • git push publish develop
    • ce qui pousse la branche "développer" de manière habituelle
  • git push publish master --force-with-lease
    • pousse la branche "maître" à l'envers, avec l'autorisation obtenue via --force-with-lease en toute sécurité
    • l'utilisation de --force pourrait en silence écraser le travail d'autres personnes, Je ne l'utilise donc jamais
  • ou les deux opérations de poussée ensemble avec cette syntaxe surprenante :
    • git push publish develop --force-with-lease=master

0voto

mvp Points 29360

S'il semble que vous ayez été contrôlé à develop lorsque vous avez couru git reset et c'est ce qui vous a perturbé.

Vous pouvez réparer develop comme suit :

git checkout develop
git merge --ff-only D

Maintenant, vous pouvez restaurer master retour à B :

git checkout master
git reset --hard B

Revenir à develop et le pousser :

git checkout develop
git push develop

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X