Was ist der Unterschied zwischen git merge
und git rebase
?
Was ist der Unterschied zwischen git merge
und git rebase
?
Antworten:
Angenommen , ursprünglich gab es 3 Commits A
, B
, C
:
Dann erstellte Entwickler Dan ein Commit D
und Entwickler Ed ein Commit E
:
Offensichtlich sollte dieser Konflikt irgendwie gelöst werden. Dafür gibt es zwei Möglichkeiten:
MERGE :
Beide Commits D
und E
sind immer noch hier, aber wir schaffen merge commit , M
dass inherits Änderungen von beiden D
und E
. Dies schafft jedoch eine Diamantform , die viele Menschen sehr verwirrend finden.
REBASE :
Wir erstellen ein Commit R
, dessen tatsächlicher Dateiinhalt mit dem M
oben beschriebenen Merge-Commit identisch ist . Aber wir werden das Commit los E
, als ob es nie existiert hätte (bezeichnet durch Punkte - verschwindende Linie). Aufgrund dieser Auslöschung E
sollte es für Entwickler Ed lokal sein und sollte niemals in ein anderes Repository verschoben worden sein. Der Vorteil von Rebase ist, dass die Diamantform vermieden wird und die Geschichte eine schöne gerade Linie bleibt - die meisten Entwickler lieben das!
git merge
verschachtelt keine Commits (aber es könnte so aussehen, wenn man es sich ansieht git log
). Stattdessen git merge
bleiben beide Entwicklungsgeschichten von Dan und Ed intakt, wie es jeweils von einem Standpunkt aus gesehen wurde. git rebase
lässt es so aussehen, als hätte Dan zuerst daran gearbeitet und Ed ist ihm gefolgt. In beiden Fällen (Zusammenführen und erneutes Basieren) ist der tatsächlich resultierende Dateibaum absolut identisch.
Ich liebe diesen Auszug aus 10 Dingen, die ich an Git hasse (er gibt im zweiten Beispiel eine kurze Erklärung für Rebase):
3. Beschissene Dokumentation
Die Manpages sind ein allmächtiges "F *** you" 1 . Sie beschreiben die Befehle aus der Sicht eines Informatikers, nicht eines Benutzers. Ein typisches Beispiel:
git-push – Update remote refs along with associated objects
Hier ist eine Beschreibung für Menschen:
git-push – Upload changes from your local repository into a remote repository
Update, ein weiteres Beispiel: (danke cgd)
git-rebase – Forward-port local commits to the updated upstream head
Übersetzung:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
Und dann haben wir
git-merge - Join two or more development histories together
Das ist eine gute Beschreibung.
1. im Original unzensiert
Persönlich finde ich die Standard-Diagrammtechnik nicht sehr hilfreich - die Pfeile scheinen für mich immer den falschen Weg zu weisen. (Sie zeigen im Allgemeinen auf das "Elternteil" jedes Commits, was in der Zeit rückwärts ist, was seltsam ist).
Um es in Worten zu erklären:
Aus Gründen, die ich nicht verstehe, haben GUI-Tools für Git nie große Anstrengungen unternommen, um Zusammenführungsverläufe sauberer darzustellen und die einzelnen Zusammenführungen zu abstrahieren. Wenn Sie also einen "sauberen Verlauf" wünschen, müssen Sie rebase verwenden.
Ich erinnere mich an Blog-Beiträge von Programmierern, die nur Rebase verwenden, und von anderen, die Rebase nie verwenden.
Ich werde versuchen, dies anhand eines Beispiels mit nur Worten zu erklären. Angenommen, andere Personen in Ihrem Projekt arbeiten an der Benutzeroberfläche und Sie schreiben Dokumentation. Ohne Rebase könnte Ihre Geschichte ungefähr so aussehen:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
Das heißt, Zusammenführungen und UI-Commits werden in der Mitte Ihrer Dokumentations-Commits ausgeführt.
Wenn Sie Ihren Code auf den Master übertragen, anstatt ihn zusammenzuführen, sieht er folgendermaßen aus:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
Alle Ihre Commits befinden sich oben (am neuesten), gefolgt vom Rest der master
Branche.
( Haftungsausschluss: Ich bin der Autor des Beitrags "10 Dinge, die ich an Git hasse", auf den in einer anderen Antwort Bezug genommen wird. )
Obwohl die akzeptierte und am besten bewertete Antwort großartig ist, finde ich es zusätzlich nützlich, den Unterschied nur mit Worten zu erklären:
verschmelzen
Rebase
Zusammenfassung: Wenn möglich, ist Rebase fast immer besser. Erleichterung der Wiedereingliederung in den Hauptzweig.
Weil? ➝ Ihre Feature-Arbeit kann als eine große 'Patch-Datei' (auch bekannt als diff) in Bezug auf den Hauptzweig dargestellt werden, ohne dass mehrere Eltern "erklärt" werden müssen: Mindestens zwei, die aus einer Zusammenführung stammen, aber wahrscheinlich viele weitere, wenn vorhanden waren mehrere Zusammenschlüsse. Im Gegensatz zu Zusammenführungen summieren sich mehrere Rebases nicht. (ein weiteres großes Plus)
Git Rebase ist näher an einer Zusammenführung. Der Unterschied in der Rebase ist:
Das bedeutet, dass alle Ihre lokalen Commits nach allen Remote-Commits bis zum Ende verschoben werden. Wenn Sie einen Zusammenführungskonflikt haben, müssen Sie ihn ebenfalls lösen.
Ich fand einen wirklich interessanten Artikel über Git Rebase vs Merge und dachte daran, ihn hier zu teilen