Annuler une fusion rapide

J’ai apporté quelques modifications à mon repo git que je souhaite annuler.

Mon repo git ressemblait à ceci:

AB---- master \ / CD * develop 

J’étais sur la twig de develop , j’ai oublié que cela différait de la twig principale, j’ai fait un changement sur le develop , je l’ai fusionné dans master , puis j’ai poussé vers ma télécommande (appelée publish ).

Comme il n’y avait pas de changement sur le maître depuis B (ancêtre commun), git a fait une fusion rapide.

Maintenant, mon repo ressemble à ceci:

 ABCD master, develop, remotes/publish/master, remotes/publish/develop. 

Je voulais revenir sur la dernière fusion, en restaurant master à B.

De ce que j’ai lu dans Comment défaire les derniers commits dans Git? , J’ai utilisé git reset sha-of-B pour restaurer ma twig master à la révision B.

Des questions:

  • Comment puis-je restaurer la version D?
  • Comment puis-je repousser ces modifications à distance / publier?

Si vous réinitialisez le maître de succursale, il ne touchera pas la twig de développement. Afin de repayer tout en ordre, vous devriez 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 
  • imaginez que vous êtes toujours maître où vous avez fusionné et poussé
  • git reset --hard @{1}
    • cela réinitialise la twig “master” à l’endroit où il y avait un pas en arrière sur votre ordinateur (c’est-à-dire à “B”)
  • pour développer ne faites rien, car il devrait toujours être à “D”
  • git push publish develop --force-with-lease=master
    • cela pousse la twig à «développer» de la manière habituelle
    • et il pousse aussi le «maître» de la twig vers l’arrière, avec la permission obtenue via --force-with-lease de manière sûre
    • l’utilisation de --force peut écraser silencieusement le travail des autres, donc je ne l’utilise jamais

Si, apparemment, vous avez été mis au develop lorsque vous avez lancé git reset , c’est ce qui vous a fait mal.

Vous pouvez corriger le develop comme suit:

 git checkout develop git merge --ff-only D 

Maintenant, vous pouvez restaurer le master sur B:

 git checkout master git reset --hard B 

Revenez pour develop et pousser:

 git checkout develop git push develop