2013-09-06 1 views
1

J'ai la situation suivante dans mon référentiel git pour le moment.Comment faire pour bifurquer deux branches git autour fusion échouée

HEAD -- 0 -- 1 -- ... -- 3 -- 5 master 
     \-- 2 -- ... -- 4 --/ branch-1 

La branche "branche-1" a été dérivée du maître il y a quelque temps (voir commit 5).

Lors de la validation 0, je voulais la fusionner de nouveau au maître, mais toutes les modifications qui s'étaient produites dans le maître entre les commits 1 et 3 ont été remplacées. Création efficace

0 -- 2 -- ... -- 4 -- 5 master 

Étant donné que mes collègues n'ont pas pu continuer leur travail sur cet état, j'ai annulé la validation de fusion. J'ai donc défini HEAD comme étant le même que 1. La commande utilisée serait "git revert -m 2 0". Mais maintenant, j'aimerais que mes modifications soient à nouveau fusionnées. Cette fois j'espère que ça va réussir. Je dois créer quelque chose comme:

-2 -- HEAD -- 0 -- 1 -- ... -- 3 -- 5 master 
    \   \-- 2 -- ... -- 4 --/ 
    \--- -1 ------/ 

Ce serait un commit -1 qui évite la fusion a échoué 0 et remonte dans l'état propre que j'avais (l'état propre, j'atteint par le retour) avant la fusionner. Toutefois, essayer simplement de fusionner 2 en HEAD ne fonctionne pas. Je pense que c'est parce qu'ils sont déjà fusionnés à 0.

Répondre

1

Le problème est que vous avez utilisé git revert au lieu de git reset --HARD. git revert crée un nouveau commit qui reprend les modifications de la validation précédente. git reset fait la même chose, mais pas en créant un nouveau commit, mais en jetant le commit défectueux. À cause de cela, le commit défectueux est toujours dans votre histoire.

Fusionner 2 à HEAD ne fonctionne pas, parce que vous essayez de fusionner avec votre propre histoire. C'est comme essayer de fusionner 4 en 2.

Ce que vous devez faire est de jeter 0 et d'en créer un nouveau.

Tout d'abord, maître réinitialisé à 1 en utilisant:

git reset --HARD 1 

Ensuite, atteindre un état propre, fusion-prêt là-bas (vous pouvez le faire engage si vous avez besoin).

Après cela, faites-1 branche sûr des points à 2:

git checkout branch-1 
git reset --HARD 2 

Atteindre un environnement propre, l'état de fusion-prêt là aussi. Ensuite, les fusionner les deux:

git checkout master 
git merge branch-1 

Vérifiez le résultat de la fusion. Si cela n'a pas fonctionné comme vous le souhaitez, recommencez en réinitialisant à nouveau master et branche-1. Si vous ne parvenez pas à fusionner, vous pouvez également essayer une rebase.Cela aplatir votre histoire à un tel regard:

2' -- .. -- 4' -- 1 -- .. -- 3 -- 5 

Après avoir fusionné ou Rebasé les deux branches ensemble, vous pouvez changer la base des modifications qui ont été introduites après la revenue commit (Remplacer 2' par la plus récente validation de la nouvelle fusion/rebasage vous avez créé, ne pas utiliser la tête comme il changera une fois la commande est exécutée):

git rebase 2' -2 

Après cela, votre histoire doit ressembler à ça:

-2' -- .. -- 2' -- .. -- 4' -- 1 -- .. -- 3 -- 5 

Ou, si vous avez fusionné au lieu de rebasculer:

-2' -- .. -- 0' -- 1 -- ... -- 3 -- 5 
       \ -- 2 -- ... -- 4 --/