Lassen Sie uns --ontofür den Moment überspringen . upstreamund branchsind ziemlich einfach und tatsächlich eine Art Nachahmung checkoutund branch- das zweite Argument ist optional:
git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>
(Abgesehen, die Namen dieser Argumente rebase, „stromaufwärts“ und „Zweig“ sind nicht sehr aussagekräftig IMO Ich denke an sie in der Regel wie peachoftree. <start>Und <end>, das ist , wie ich sie verwenden werden: git rebase <start> <end>)
Wenn der zweite Zweig weggelassen wird, entspricht das Ergebnis fast dem ersten Auschecken dieses Zweigs und dem anschließenden Ausführen dieses Zweigs, als hätten Sie diesen Zweig nicht angegeben. Die Ausnahme ist branch, dass sich Ihr aktueller Zweig nicht ändert:
git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end> && git rebase <start>
Um zu verstehen, was rebasebeim Aufrufen geschieht, habe ich es zunächst als eine besondere Art der Zusammenführung betrachtet. Es ist nicht wirklich, aber es hat geholfen, als ich anfing, Rebase zu verstehen. Um das Beispiel von peachoftree auszuleihen:
A--B--F--G master
\
C--D--E feature
Ein git merge masterErgebnis in diesem:
A--B--F-----G master
\ \
C--D--E--H feature
Während a git rebase master(während auf dem Zweig feature!) Daraus resultiert:
A--B--F--G master
\
C'--D'--E' feature
In beiden Fällen featureenthält jetzt Code von beiden masterund feature. Wenn Sie nicht aktiviert sind feature, können Sie mit dem zweiten Argument als Verknüpfung zu diesem Argument wechseln: Es git rebase master featurewird dasselbe wie oben ausgeführt.
Nun zum Special --onto. Der wichtige Teil, an den Sie sich erinnern sollten, ist, dass der Standardwert verwendet wird, <start>wenn nichts angegeben ist. Wenn ich oben --ontospeziell spezifiziere , würde dies zu demselben Ergebnis führen:
git rebase --onto master master
git rebase --onto master master feature
(Ich verwende es nicht --ontoohne Angabe, <end>nur weil es einfacher ist, es mental zu analysieren, obwohl ich dachte, dass diese beiden gleich sind, wenn sie bereits aktiviert sind feature.)
Um zu sehen, warum dies --ontonützlich ist, finden Sie hier ein anderes Beispiel. Nehmen wir an, ich war eingeschaltet featureund habe einen Fehler bemerkt, den ich dann behoben habe - aber featureaus masterVersehen verzweigt hatte :
A--B--F--G master
\
C--D--E feature
\
H--I bugfix
Ich möchte diese Commits "verschieben", bugfixdamit sie nicht mehr abhängig sind feature. Bei jeder Art von Zusammenführung oder Neuausrichtung, die oben in dieser Antwort gezeigt wird, werden die drei featureCommits zusammen mit den beiden bugfixCommits verwendet.
Zum Beispiel git rebase master bugfixist falsch. Der Bereich <start>um <end>geschieht von allen Commits umfassen feature, die auf der Oberseite der wiedergegeben werden master:
A--B--F--G master
\ \
\ C'--D'--E'--H'--I' bugfix
\
C--D--E feature
Was wir eigentlich wollen, ist die Bandbreite der Commits feature, bugfixdie zusätzlich abgespielt werden sollen master. Dafür ist das vorgesehen --onto- Angabe eines anderen "Wiederholungs" -Ziels als der "Start" -Zweig:
git rebase --onto master feature bugfix
A--B--F--G master
\ \
\ H'--I' bugfix
\
C--D--E feature