2011-01-19 5 views
10

Je ne suis pas si expérimenté avec Git et maintenant j'ai un gros problème à tomber sur mes genoux.Annuler une fusion git

Voilà comment ma branche actuelle ressemble:

feature  /---F1-----F2----\ 
      /    \ 
master -----M0-----M1-----M2-----M3-----M4 
      \      /
bugfix  \--B1-----B2-----------/ 

La situation:

Quelqu'un a fait une très mauvaise chose et a poussé une fusion vraiment mauvais (M3). J'ai seulement remarqué la fusion incorrecte quand nos modèles (pas le code source) ne chargeraient pas après que j'ai fusionné B1 et B2 dans M4. Heureusement, je n'ai pas encore poussé M4.

Le problème:

Comment régler les choses à nouveau? Je veux M0, M1, M2, F1, F2, B1 et B2. Mais je ne veux pas M3 et M4 (puisque M4 est évidemment cassé). Si je ai d'abandonner les modifications, puis F1 et F2 peuvent être sacrifiées :)

J'ai regardé git revert mais je ne suis pas sûr que je comprends très bien comment cela fonctionne. Donc ... j'espère vraiment de l'aide pour résoudre ce problème.

Merci d'avance.

Répondre

6

Donc, pour clarifier, ce que vous voulez est-ce, non?

feature  /---F1-----F2 
      /    
master -----M0-----M1-----M2 
      \    
bugfix  \--B1-----B2 

Assurez-vous que le HEAD s feature et bugfix sont encore sur F2 et B2 respectivement.

Modifier: si feature et bugfix sont pas de branches, faites-les branches (stash votre travail si elle est UNCOMMITED):

git checkout F2 
git branch feature 
git checkout B2 
git branch bugfix 

Modifier fin

Remettre ensuite le maître M2 :

git checkout master 
git reset M2 --hard 

(réinitialisation vous fera perdre vos changements locaux, stash les si vous ne voulez pas cela.)

M3 et M4 ne sont pas détruits tout de suite, mais seront finalement. Ils ne devraient pas apparaître dans git log ou gitk.

Ensuite, il est temps de fusionner feature et de créer un M3' correct.

+0

Oui, en quelque sorte, mais "feature", "master" et "bugfix" ne sont pas réellement des branches, je suppose que c'est ce qui prête à confusion. Autrement dit, 3 ppl engagés à leurs propres changements de la branche maîtresse. Un gars a fait une mauvaise fusion et a poussé. J'ai tiré la mauvaise fusion. Maintenant, je veux un moyen d'exclure la mauvaise fusion tout en gardant tous les changements individuels ... – aberrant80

+0

Donc 'feature' et' bugfix' ne sont pas des branches? Sûrement l'auteur de 'feature' a une branche dans son propre repo. Ce que vous devez faire est de réinitialiser votre maître à M2, et demander à l'auteur de 'feature' de faire la même chose (mais assurez-vous qu'il ne perd pas la branche' feature') et refaire la fusion, correctement cette fois. Voir ma mise à jour si vous voulez le faire vous-même. – Gauthier

+0

Avez-vous vraiment un repo sans une branche «master»? – Gauthier