Manchmal haben wir einen Upstream, der einen Zweig, von dem wir abhängig sind, neu basiert / zurückgespult hat. Dies kann ein großes Problem sein und zu chaotischen Konflikten führen, wenn wir nachgelagert sind.
Die Magie ist git pull --rebase
Ein normaler Git-Pull ist im Großen und Ganzen so etwas (in all diesen Beispielen verwenden wir eine Fernbedienung namens origin und einen Zweig namens foo):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
Auf den ersten Blick könnte man denken, dass ein Git Pull - Rebase genau das tut:
git fetch origin
git rebase origin/foo
Dies hilft jedoch nicht, wenn die Upstream-Rebase ein "Squashing" beinhaltet (was bedeutet, dass sich die Patch-IDs der Commits geändert haben, nicht nur ihre Reihenfolge).
Was bedeutet, dass Git Pull - Rebase ein bisschen mehr als das tun muss. Hier ist eine Erklärung, was es tut und wie.
Angenommen, Ihr Ausgangspunkt ist folgender:
a---b---c---d---e (origin/foo) (also your local "foo")
Die Zeit vergeht und Sie haben einige Verpflichtungen zusätzlich zu Ihrem eigenen "foo" eingegangen:
a---b---c---d---e---p---q---r (foo)
In einem Anfall von unsozialer Wut hat der vorgelagerte Betreuer nicht nur sein "Foo" neu begründet, sondern sogar ein oder zwei Kürbisse verwendet. Seine Commit-Kette sieht jetzt so aus:
a---b+c---d+e---f (origin/foo)
Ein Git-Pull an diesem Punkt würde zu Chaos führen. Sogar ein Idiot holen; git rebase origin / foo würde es nicht schneiden, da Commits "b" und "c" auf der einen Seite und Commit "b + c" auf der anderen Seite zu Konflikten führen würden. (Und ähnlich mit d, e und d + e).
Was git pull --rebase
in diesem Fall bedeutet, ist:
git fetch origin
git rebase --onto origin/foo e foo
Dies gibt Ihnen: