Rebaser les trees fusionnés dans Git

J'ai quelque chose de semblable à l'histoire suivante (mais plus compliqué avec plusieurs fusions):

F - G - H - K - L - … / / / I - J - M - … / / A - B - C - D - E - … A′- B′- C′- D′- E′ 

A et A 'sont des trees identiques avec des histoires différentes.

Je souhaite rebaser toutes les validations de twig en validations équivalentes sur la twig principale, en préservant les fusions (probablement en spécifiant manuellement les hachés de l'endroit où les validations équivalentes se trouvent sur l'tree rebasé). Comment puis-je dire à K′ qu'il doit merge avec H′ et J′ ? Ou dois-je recréer manuellement ces commits de fusion?

Si je fais git rebase -p --onto B′ BL il ne s'applique pas proprement. Je pourrais rebaser H sur B′ et M sur D′ , puis recréer la fusion K moi-même, puis rebaser L sur K′ (et ainsi de suite pour d'autres twigs / fusions non montrées) mais ce serait un peu de travail.

J'ai examiné plusieurs autres questions, mais aucune d'entre elles ne comportait de fusion.

Solutions Collecting From Web of "Rebaser les trees fusionnés dans Git"

En supposant que ce n'est pas un référentiel public, ou que d'autres users du référentiel sont d'accord avec une réécriture significative, la manière la plus efficace d'y parvenir est avec git filter-branch . L'un des filters possibles est --parent-filter , qui vous permet de changer la parenté de commits spécifiques, un peu comme greffer ou rebaser une partie de l'tree, mais puisque vous pouvez également passer l'option --all , vous pouvez accomplir l'effet sur plusieurs twigs dans une invocation. Cela pourrait également être accompli avec un --commit-filter ; mais c'est une solution plus générale destinée à changer d'autres aspects des engagements individuels – pas seulement les parents. Vous voudrez probablement aussi utiliser un --tag-name-filter cat pour déplacer les tags dans les parties de l'tree en cours de réécriture.

Donc, la command finale ressemblerait à ceci:

 git filter-branch --parent-filter <somescript> --tag-name-filter cat -- --all 

<somescript> est soit correctement cité / échappé code bash pour replace A par A' pour le commit B (les détails sur la manière dont les informations sont fournies au script et les résultats du script peuvent être trouvés dans git help filter-branch ), ou le nom d'un script shell réel qui accomplit la même chose.

Il y a aussi un peu de nettoyage à faire ensuite – filter-branch laisse vos twigs d'origine en place, mais avec de nouveaux noms ( refs/original/... ) donc vous pouvez récupérer si quelque chose ne semble pas correct. Il ya beaucoup d'informations sur la façon de supprimer les twigs mortes une fois que vous êtes satisfait que la filter-branch fait ce que vous vouliez, et en ré-emballant votre repository pour récupérer l'espace de stockage, donc je ne vais pas répliquer ici …

Avez-vous essayé d'utiliser le rebasage interactif? Fondamentalement, git rebase -i A et git lancera votre éditeur de text avec les commits après A listés. Vous pouvez ensuite déplacer les commits et écraser les commits dans le contenu de votre coeur.