2016-10-06 1 views
2

Comment conserver 2 branches Git en synchronisation?Synchronisation de 2 branches après fusion git

J'ai actuellement une branche master et une branche gh-pages ainsi que les télécommandes respectives. Les deux, branche master et gh-pages partage le même engagement id chaque fois que je me suis engagé comme suit:

git checkout master 
git commit -am "message" 
git checkout gh-pages 
git merge master 

Mon journal ressemblait si (réalisé avec git log --graph --oneline --all --decorate):

single-tracked-graph

Après un conflit de fusion, qui Je résolus, chaque fusion reçoit son propre engagement en tant que tel:

double-tracked-graph

Ma question est, comment puis-je aligner les 2 branches de sorte que les fusions se produisent comme précédemment sur un seul «graphique-piste»? J'ai essayé de pull selon this answer, mais en vain.

Répondre

1

Il ressemble commettras 50b6dec a été ajouté à la branche gh-pages, et COMMIT e43c01f a été faite sur master en même temps, et c'est ce qui a causé le conflit de fusion. Pour cette raison, gh-pages avait 1 commit que master n'avait pas. Donc, chaque fois que vous avez fusionné après cela, Git n'était pas capable de faire une fusion rapide. (Le avance rapide se fond est ce que vous a donné l'histoire linéaire que vous aviez avant.) Ainsi, la solution est:

git checkout master 
git merge gh-pages 

Pour éviter que cela ne se reproduise à l'avenir, changer votre processus à ceci:

git checkout master 
git commit -am "message" 
git checkout gh-pages 
git merge --ff-only master 

L'indicateur --ff-only annule la fusion avec une erreur si gh-pages possède des validations que ne possède pas master.


Si vous souhaitez réécrire l'historique pour que ce soit comme si cela ne s'était jamais produit, vous pouvez le faire aussi.

Tout d'abord, assurez-vous que vous êtes sur master:

git checkout master 

Maintenant rebase:

git rebase 50b6dec 

Vous devrez résoudre à nouveau ce conflit. Lorsque vous avez terminé, faites:

git rebase --continue 

Lorsque le rebasage est terminé, vous devrez forcer mise à jour origin:

git push --force-with-lease origin master 

Vous devez également déplacer la branche gh-pages.Est-ce que:

git branch -f gh-pages master 
git push --force-with-lease origin gh-pages 

Cela vous donnera une histoire qui ressemble à ceci:

* f218f70' (HEAD -> master) Added Scatterplot functionality to check ratings 
* cb79b79' Squashed bug 
* fcf0d8a' Small change 
* e43c01f' Small change 
* 50b6dec Small change 
* a217267 Small change 

obligatoire avertissement: Depuis un rebasage réécrit l'histoire, cela peut être dangereux/perturbateur pour toute autre personne travaillant sur cette branche. Assurez-vous de communiquer clairement ce que vous avez fait avec toute personne avec qui vous collaborez.

+1

Un grand merci @ScottWeldon pour une réponse géniale et approfondie - résoudre non seulement mon problème principal mais aussi mon problème non-dit en ce qui concerne une histoire propre ... – lve