Bisher ist der verwirrendste Teil von Git die Umbasierung auf einen anderen Zweig. Insbesondere die Befehlszeilenargumente sind verwirrend.
Jedes Mal, wenn ich ein kleines Stück eines Zweigs auf die Spitze eines anderen verzweigen möchte, muss ich die Dokumentation zur Git-Rebase überprüfen. Es dauert ungefähr 5-10 Minuten, um zu verstehen, was jedes der drei Hauptargumente sein sollte.
git rebase <upstream> <branch> --onto <newbase>
Was ist eine gute Faustregel, um mir zu merken, auf welche dieser drei Parameter bei jeder Art von Rebase auf einen anderen Zweig eingestellt werden soll?
Denken Sie daran, dass ich die Dokumentation zu git-rebase immer und immer wieder und immer wieder (und immer wieder) durchgesehen habe, aber es ist immer schwer zu verstehen (wie ein langweiliges wissenschaftliches Whitepaper oder so). An diesem Punkt habe ich das Gefühl, dass ich andere Menschen einbeziehen muss, um es zu verstehen.
Mein Ziel ist es, dass ich niemals die Dokumentation für diese grundlegenden Parameter überprüfen muss. Ich konnte sie mir bisher nicht merken und habe bereits eine Menge Rebases durchgeführt. Es ist also etwas ungewöhnlich, dass ich mir bisher jeden anderen Befehl und seine Parameter merken konnte, aber nicht mit --onto
.
Antworten:
Lassen Sie uns
--onto
für den Moment überspringen .upstream
undbranch
sind ziemlich einfach und tatsächlich eine Art Nachahmungcheckout
undbranch
- das zweite Argument ist optional:(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:Um zu verstehen, was
rebase
beim 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:Ein
git merge master
Ergebnis in diesem:Während a
git rebase master
(während auf dem Zweigfeature
!) Daraus resultiert:In beiden Fällen
feature
enthält jetzt Code von beidenmaster
undfeature
. Wenn Sie nicht aktiviert sindfeature
, können Sie mit dem zweiten Argument als Verknüpfung zu diesem Argument wechseln: Esgit rebase master feature
wird 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--onto
speziell spezifiziere , würde dies zu demselben Ergebnis führen:(Ich verwende es nicht
--onto
ohne Angabe,<end>
nur weil es einfacher ist, es mental zu analysieren, obwohl ich dachte, dass diese beiden gleich sind, wenn sie bereits aktiviert sindfeature
.)Um zu sehen, warum dies
--onto
nützlich ist, finden Sie hier ein anderes Beispiel. Nehmen wir an, ich war eingeschaltetfeature
und habe einen Fehler bemerkt, den ich dann behoben habe - aberfeature
ausmaster
Versehen verzweigt hatte :Ich möchte diese Commits "verschieben",
bugfix
damit sie nicht mehr abhängig sindfeature
. Bei jeder Art von Zusammenführung oder Neuausrichtung, die oben in dieser Antwort gezeigt wird, werden die dreifeature
Commits zusammen mit den beidenbugfix
Commits verwendet.Zum Beispiel
git rebase master bugfix
ist falsch. Der Bereich<start>
um<end>
geschieht von allen Commits umfassenfeature
, die auf der Oberseite der wiedergegeben werdenmaster
:Was wir eigentlich wollen, ist die Bandbreite der Commits
feature
,bugfix
die zusätzlich abgespielt werden sollenmaster
. Dafür ist das vorgesehen--onto
- Angabe eines anderen "Wiederholungs" -Ziels als der "Start" -Zweig:git rebase --onto master feature bugfix
quelle
Nur eine Auffrischung, Rebasing ist hauptsächlich dann gedacht, wenn Ihr Commit-Verlauf linear erscheinen soll, wenn sich zwei Zweige unabhängig voneinander entwickelt haben. Im Grunde wird der Commit-Verlauf neu geschrieben.
so wie ich es gerne mache ist
git rebase --onto <target branch> <start branch> <end branch>
Wo
<target branch>
sich der Zweig befindet, auf den Sie neu gründen,<start branch>
ist normalerweise der Zweig, von dem Sie sich trennen,<end branch>
und<end branch>
der Zweig, auf den Sie sich neu stützen.wenn Sie mit beginnen
und TU
Sie erhalten
Eine weitere gute Sache, die Sie wissen sollten, ist die
<target branch>
Standardeinstellung,<start branch>
sodass Sie dieselbe Rebase wie ausführen könnenWenn Sie weitere Hilfe benötigen, lesen Sie die Anleitung Rebase ohne Tränen
quelle
master
Zweig selbst unverändert lassen. Sie erhalten nur eine Funktion, die sich verzweigt,G--C'--D'--E'
während Siemaster
noch bei anhaltenG
.<target branch>
und wo<start branch>
es anders ist, um den Lesern das Verständnis des allgemeinsten Falls zu erleichtern?