Der Befehl, den Sie suchen, ist git rebasespeziell die -i/--interactiveOption.
Ich gehe davon aus, dass Sie Commit C in Zweig A belassen möchten und dass Sie wirklich bedeuten, dass Sie die anderen Commits in die anderen Zweige verschieben möchten, anstatt sie zusammenzuführen, da Zusammenführungen unkompliziert sind. Beginnen wir mit der Manipulation von Zweig A.
git rebase -i <SHA1 of commit a>^ branchA
Das ^bedeutet das vorherige Festschreiben, daher sagt dieser Befehl, Zweig A mit dem Festschreiben vor "a" als Basis neu zu gründen. Git präsentiert Ihnen eine Liste der Commits in diesem Bereich. Ordne sie neu und sag git, er soll die passenden zerquetschen:
pick c ...
pick a ...
squash d ...
squash e ...
squash g ...
pick b
squash f
Jetzt sollte die Geschichte so aussehen:
c - [a+d+e+g] - [b+f] (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
Nehmen wir nun das neu gequetschte Commit b + f für branchB.
git checkout branchB
git cherry-pick branchA # cherry-pick one commit, the tip of branchA
Und das gleiche für a + d + e + g für Master:
git checkout master
git cherry-pick branchA^
Aktualisieren Sie abschließend branchA so, dass es auf c zeigt:
git branch -f branchA branchA^^
Wir sollten jetzt haben:
c (branch A) - [a+d+e+g] - [b+f] (dangling commits)
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master)
\
x-x-x-x-x-[b+f] (branchB)
Beachten Sie, dass Sie bei mehreren Commits, die Sie zwischen Zweigen verschieben möchten, Rebase erneut verwenden können (nicht interaktiv):
# 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
Zum Schluss noch ein Haftungsausschluss: Es ist durchaus möglich, Commits so neu zu ordnen, dass einige nicht mehr sauber gelten. Dies kann daran liegen, dass Sie eine schlechte Reihenfolge gewählt haben (indem Sie vor dem Festschreiben einen Patch einfügen, um die gepatchte Funktion einzuführen). In diesem Fall möchten Sie die rebase ( git rebase --abort) abbrechen . Andernfalls müssen Sie die Konflikte intelligent beheben (genau wie bei Zusammenführungskonflikten), die Korrekturen hinzufügen und dann ausführen git rebase --continue, um fortzufahren. Diese Anweisungen werden auch durch die Fehlermeldung bereitgestellt, die gedruckt wird, wenn der Konflikt auftritt.