J'utilise git en créant une série de branches de fonctionnalité, et en les fusionnant au master quand elles ont fini avec git merge --no-ff
. Cela crée des validations de fusion vides utiles pour identifier les points de début et de fin des branches de fonction précédentes.Un moyen plus rapide de `git rebase --preserve-merges`
Pour gérer plusieurs branches simultanées, ou même des branches imbriquées, j'utilise rebase. Je ne fusionne jamais en arrière, je rebase toujours mes branches sur les derniers commits, test et finalement fusionne avec --no-ff
une fois que tout est fait. Avec les branches imbriquées, je fais la même chose: plusieurs branches sont fusionnées séquentiellement sur la branche principale, qui est elle-même fusionnée au master à la fin. Pour conserver des informations sur les fusions avec des branches imbriquées, j'utilise souvent git rebase --preserve-merges
. Cela fait exactement ce que je veux et je n'ai aucun problème avec mon flux de travail.
Mon problème principal avec git est que git rebase --preserve-merges
est très lent (prenant parfois environ 2 secondes par commit). Après avoir lu What exactly does git's "rebase --preserve-merges" do (and why?) je réalise que git doit effectuer beaucoup de travail pour préserver les fusions, puisque git doit travailler sur des graphes arbitraires. Ce que je me demandais est ceci: puisque mon flux de travail résulte à peu près en un graphique équivalent à un historique linéaire, est-il possible d'effectuer un git rebase --preserve-merge
équivalent d'une manière plus rapide, étant donné que je garantis la "linéarité" de l'histoire avec seule la fusion vide est validée? Cela ne me dérange pas d'utiliser des scripts ou des commandes bizarres, tant que le résultat final est correct.
A-B-C
/ \
(1)--------D-- master
\
\---F-----I-- feature
\/\ /
E G-H
A-B-C E G-H
/ \/\/ \
(2)--------D---F-----I-feature
master
tl; dr: Comment transformer (1) en (2) sachant que l'historique sous-jacent est linéaire, donc git rebase --preserve-merges
n'a pas à faire autant de travail et le fait vite?
Malheureusement je suis sur Ubuntu, donc je ne pense pas que ça dépende de ça. Le dépôt où j'ai eu ce problème en dernier a été utilisé par beaucoup de gens avec une histoire désordonnée, ce qui aurait pu être un facteur dans la lenteur du commandement. Cependant, je ne suis pas d'accord sur le fait que dans mon cas particulier c'est difficile: un simple 'git rebase' le fait correctement très rapidement; ma seule différence serait qu'au lieu de sauter les commits de fusion, il faudrait les copier/recréer. Ça ne devrait pas être si difficile, non? – Svalorzen
Dans un grand dépôt, j'ai vu 'git merge' lui-même prendre 30 minutes. Vraisemblablement, le vôtre n'est pas * gros *, mais répéter une fusion pourrait être le coupable. Comme le rebasage interactif est (ou était surtout, ça commence à changer dans Git) un script shell, vous pouvez le découvrir en mettant le drapeau '-x' et en le regardant fonctionner, pour voir où sont les retards. – torek