remove - git tagging best practices




Neuordnung von Commits (3)

Ich arbeite gerade an einem Zweig und möchte, dass einige Commits in andere Zweige zusammengeführt werden:

    a-b-c-d-e-f-g (branchA)
   /
--o-x-x-x-x-x-x-x-x-x-x (master)
   \
    x-x-x-x-x (branchB)

(Buchstaben bezeichnen Commits, und die "x" sind irrelevante Commits.)

Mir ist jedoch aufgefallen, dass es eine gute Idee wäre, einige Commits zu bündeln. Ich möchte "a", "a", "e" und "g" zu einem Patch verschmelzen und ihn zum Master machen. Commits b und f sollten als eine commit zu b verzweigen gehen. Gibt es einen guten "git'-ish Weg, um es zu erreichen?


Der Befehl, nach dem Sie suchen, ist git rebase , speziell die Option -i/--interactive .

Ich gehe davon aus, dass Sie commit c auf Zweig A belassen möchten und dass Sie wirklich meinen, dass Sie die anderen Commits in die anderen Zweige verschieben möchten, anstatt zu verschmelzen, da Merges einfach sind. Beginnen wir mit der Manipulation von Zweig A.

git rebase -i <SHA1 of commit a>^ branchA

Das ^ bedeutet das vorherige Commit, also sagt dieser Befehl, den Zweig A mit dem Commit vor "a" als Basis neu zu setzen. Git wird Ihnen eine Liste der Commits in diesem Bereich präsentieren. Ordne sie neu an und sag Git, die richtigen zu quetschen:

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 ein + d + e + g für Master:

git checkout master
git cherry-pick branchA^

Aktualisieren Sie abzweigA, 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, wenn Sie mehrere Commits hatten, zwischen den Zweigen wechseln möchten, die 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

Abschließend noch ein Disclaimer: Es ist durchaus möglich, Commits so neu zu ordnen, dass einige nicht mehr sauber zutreffen. Dies könnte daran liegen, dass Sie eine falsche Reihenfolge gewählt haben (indem Sie vor dem Commit einen Patch einfügen, der das gepatchte Feature einführt). In diesem Fall sollten Sie die Rebase ( git rebase --abort ) git rebase --abort . Andernfalls müssen Sie die Konflikte intelligent beheben (genau wie bei Merge-Konflikten), die Fixes hinzufügen und dann git rebase --continue . Diese Anweisungen werden auch durch die beim Auftreten des Konflikts ausgedruckte Fehlermeldung geliefert.


Wenn Sie nur die letzten zwei Commits neu ordnen möchten, können Sie diesen git reorder Alias: https://.com/a/33388211/338581






branch