Mise à jour en juillet 2012 (git 1.7.12+)
Vous pouvez maintenant rebase tous s'engage jusqu'à la racine, et sélectionnez le deuxième commettre Y
d'être écrasé avec le premier X
.
git rebase -i --root master
pick sha1 X
squash sha1Y Y
pick sha1 Z
git rebase [-i] --root $tip
peut maintenant être utilisé pour réécrire toute l'histoire menant à "$tip
" à la racine de la validation.
Voir commettre df5df20c1308f936ea542c86df1e9c6974168472 de Chris Webb (arachsys
).
Origine de la réponse (février 2009)
Je crois que vous trouverez différentes recettes pour que, dans la question "Comment puis-je combiner les deux premières s'engage d'un dépôt git?"
Charles Bailey, à la condition la plus détaillée de la réponse, rappelant qu'un commit est un arbre complet (pas seulement les différences par rapport à un état précédent).
Et voici l'ancien commit (le premier commit") et le nouveau commit (suite de l'écrasement) n'aura pas d'ancêtre commun.
Ce qui signifie que vous ne pouvez pas "commit --amend
" la première s'engager dans de nouvelles, et puis rebase sur le nouveau initiale de commettre l'histoire de la précédente initiale commit (beaucoup de conflits)
(Cette dernière phrase n'est plus vrai avec l' git rebase -i --root <aBranch>
)
Plutôt (avec A
originaux "initial s'engager", et B
un commit besoin d'être écrasé dans le premier):
-
Revenir à la dernière s'engager à ce que nous voulons pour former la première commit (détacher la TÊTE):
git checkout <sha1_for_B>
-
Réinitialisation de la branche pointeur vers la première s'engager, mais en laissant l'index et de l'arbre de travail intact:
git reset --soft <sha1_for_A>
-
Modifier l'arbre initial à l'aide de l'arbre à partir de 'B':
git commit --amend
-
Temporairement balise de cette nouvelle initial s'engager (ou de vous souvenir le nouveau commit sha1 manuellement):
git tag tmp
-
Revenir à l'origine de la branche (à supposer maître pour cet exemple):
git checkout master
-
Relire tous les commits après B sur la nouvelle initiale s'engager:
git rebase --onto tmp <sha1_for_B>
-
Retirez l'étiquette temporaire:
git tag -d tmp
De cette façon, le "rebase --onto
" n'introduit pas de conflits au cours de la fusion, car il rebases histoire faite après le dernier commit (B
) à être écrasé dans le premier (qui était en A
) tmp
(représentant l'écrasé de nouveaux initiale commettre): trivial d'avance rapide, de fusions.
Qui fonctionne pour "A-B
", mais aussi "A-...-...-...-B
" (n'importe quel nombre de validations peuvent être écrasé dans la première de cette façon)