Réorganisation des commits

Je travaille actuellement sur une twig et je veux que certains s’engagent à fusionner dans d’autres twigs:

abcdefg (branchA) / --oxxxxxxxxxx (master) \ xxxxx (branchB) 

(Les lettres indiquent les commits, et les “x” ne sont pas pertinents.)

Cependant, j’ai remarqué que ce serait une bonne idée de mettre en commun certains commits. Je veux “concaténer” commettre a, d, e et g en un seul patch et le valider en master. Les validations b et f devraient aller comme on s’engage à branchB. Y a-t-il une bonne façon de réussir?

La commande que vous recherchez est git rebase , en particulier l’option -i/--interactive .

Je suppose que vous voulez laisser commit c sur la twig A et que vous voulez vraiment déplacer les autres commits vers les autres twigs, plutôt que de fusionner, car les fusions sont simples. Commençons par manipuler la twig A.

 git rebase -i ^ branchA 

Le ^ signifie le commit précédent, donc cette commande dit de rebaser la twig A en utilisant le commit avant “a” comme base. Git vous présentera une liste des commits dans cette gamme. Réorganisez-les et dites à git de les écraser:

 pick c ... pick a ... squash d ... squash e ... squash g ... pick b squash f 

Maintenant, l’histoire devrait ressembler à ceci:

  c - [a+d+e+g] - [b+f] (branchA) / --oxxxxxxxxxx (master) 

Maintenant, prenons le commit b + f nouvellement écrasé pour branchB.

 git checkout branchB git cherry-pick branchA # cherry-pick one commit, the tip of branchA 

Et pareil pour a + d + e + g pour master:

 git checkout master git cherry-pick branchA^ 

Enfin, mettez à jour la twig afin qu’elle pointe vers c:

 git branch -f branchA branchA^^ 

Nous devrions maintenant avoir:

  c (branch A) - [a+d+e+g] - [b+f] (dangling commits) / --oxxxxxxxxxx-[a+d+e+g] (master) \ xxxxx-[b+f] (branchB) 

Notez que si vous souhaitiez déplacer plusieurs commits entre twigs, vous pouvez utiliser à nouveau le rebase (de manière non interactive):

 # create a temporary branch git branch fromAtoB branchA # move branchA back two commits git branch -f branchA branchA~2 # rebase those two commits onto branchB git rebase --onto branchB branchA fromAtoB # merge (fast-forward) these into branchB git checkout branchB git merge fromAtoB # clean up git branch -d fromAtoB 

Enfin, un avertissement: il est tout à fait possible de réorganiser les commits de telle manière que certains ne s’appliquent plus proprement. Cela peut être dû au fait que vous avez choisi un mauvais ordre (placer un correctif avant la validation en introduisant la fonctionnalité corrigée); dans ce cas, vous voudrez abandonner la rebase ( git rebase --abort ). Sinon, vous devrez résoudre intelligemment les conflits (comme vous le faites avec les conflits de fusion), append les correctifs, puis lancer git rebase --continue à avancer. Ces instructions sont également fournies par le message d’erreur imprimé lorsque le conflit se produit.

Si vous ne souhaitez réorganiser que les deux derniers commits , vous pouvez vous git reorder cet alias: https://stackoverflow.com/a/33388211/338581

Git rebase est ce que vous voulez. Découvrez l’option –interactive.

git rebase --interactive

Liens: