Git Pull VS Git Fetch Vs Git Rebase

294

Eine weitere Frage , die git pullist wie ein git fetch+ git merge.

Aber was ist der Unterschied zwischen git pullVS git fetch+ git rebase?

Michael
quelle
2
Jemand sollte den Link bereinigen ... und ich bin erstaunt, wie viele Stimmen diese andere Frage erhalten hat.
Xenoterracide
13
@xeno: Ich denke, es ist nur eine Zählung, wie viele Leute gehen "Ich hatte diese Frage auch"
Bobobobo
45
Eines Tages werde ich Zeit finden, die Git-Dokumentation wirklich zu lesen, aber bis dahin füge ich meine Stimmen zu diesen Arten von Fragen hinzu
Eran Medan

Antworten:

336

Aus Ihrer Frage sollte ziemlich offensichtlich sein, dass Sie tatsächlich nur nach dem Unterschied zwischen git mergeund fragen git rebase.

Nehmen wir also an, Sie sind im allgemeinen Fall - Sie haben einige Arbeiten an Ihrem Hauptzweig ausgeführt, und Sie ziehen aus den Ursprüngen, die ebenfalls einige Arbeiten ausgeführt haben. Nach dem Abruf sehen die Dinge so aus:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Wenn Sie an diesem Punkt zusammenführen (das Standardverhalten von Git Pull) und davon ausgehen, dass keine Konflikte vorliegen, erhalten Sie Folgendes:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Wenn Sie andererseits die entsprechende Rebase durchgeführt haben, erhalten Sie Folgendes:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

Der Inhalt Ihres Arbeitsbaums sollte in beiden Fällen gleich sein. Sie haben gerade eine andere Geschichte erstellt, die dazu führt . Die Rebase schreibt Ihren Verlauf neu, sodass es so aussieht, als hätten Sie über dem neuen Master-Zweig ( R) von origin festgeschrieben , anstatt dort, wo Sie ursprünglich festgeschrieben haben ( H). Sie sollten den Rebase-Ansatz niemals verwenden, wenn bereits eine andere Person aus Ihrem Hauptzweig gezogen hat.

Beachten Sie schließlich, dass Sie git pullfür einen bestimmten Zweig die Einrichtung von rebase anstelle von merge einrichten können, indem Sie den Konfigurationsparameter branch.<name>.rebaseauf true setzen. Sie können dies auch für einen einzelnen Zug mit tun git pull --rebase.

Cascabel
quelle
39
Was passiert, wenn Sie eine Rebase durchführen, nachdem bereits jemand aus Ihrer Hauptniederlassung gezogen hat? Würde das das Repo brechen?
Didier A.
12
Woher wissen Sie, ob jemand aus Ihrer Hauptniederlassung gezogen hat?
Frank
29
Wenn Sie nicht sicher sind, ob jemand dies nicht getan hat , sollten Sie davon ausgehen, dass dies der Fall ist.
Chris Down
4
Ich habe nur gedacht, dass ich nicht auf das Problem stoße, dass jemand anderes die fraglichen Änderungen vorgenommen hat, es sei denn, Sie verschieben Änderungen auch an einen anderen Ort als origin / master. Meister, es würde überhaupt nichts zu widerlegen geben. Es scheint mir, dass die Warnung wirklich nur in Fällen von Bedeutung ist, in denen Sie etwas Komplexeres als X -> Ursprung / X haben, aber ich könnte mich irren. Wenn jemand ein Szenario kennt, das ich übersehen habe, teilen Sie es bitte mit.
Neverfox
1
@SteveChambers Nein, das ist nicht das Ergebnis. Die Linien stellen einfach die Commit-Abstammung dar, dh A ist das Elternteil von B. Es gibt keine Auswirkungen darauf, ob Q oder B zum ersten Mal in der Zeit waren. Alle diese Vorgänge basieren auf Festschreibungsdiagrammen und nicht auf der Zeit. Rebase transplantiert einfach einige Commits, mit dem Ergebnis, dass ich unabhängig von den Commit-Zeitstempeln gezeigt habe.
Cascabel
9

TLDR:

git pullist wie laufen git fetchdann git merge
git pull --rebaseist wie git fetchdanngit rebase

Als Antwort auf Ihre erste Aussage,

git pullist wie ein git fetch+ git merge.

"In seinem Standardmodus ist Git Pull eine Abkürzung für, git fetchgefolgt von git mergeFETCH_HEAD." Genauer gesagt, git pullläuft git fetchmit den angegebenen Parametern und ruft dann git mergeauf, um die abgerufenen Verzweigungsköpfe mit dem aktuellen Zweig zusammenzuführen. "

(Ref: https://git-scm.com/docs/git-pull )


Für Ihre zweite Aussage / Frage:

"Aber was ist der Unterschied zwischen git pullVS git fetch+ ? git rebase"

Wieder aus derselben Quelle:
git pull --rebase

"Mit --rebase wird git rebase anstelle von git merge ausgeführt."


Nun, wenn Sie fragen wollten

'der Unterschied zwischen mergeund rebase'

Dies wird auch hier beantwortet:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(der Unterschied zwischen der Änderung der Art und Weise, wie der Versionsverlauf aufgezeichnet wird)

harschvchawla
quelle
2
Ich möchte erwähnen, dass "git pull --rebase" die meiste Zeit wie "git fetch then git rebase" ist - aber nicht immer. In einigen Situationen macht "git pull --rebase" etwas mehr. Sehen Sie dieses oft referenzierte Beispiel hier: gitolite.com/git-pull--rebase
Daniel K.
1
Vielen Dank für Ihre Antwort. Ich verstehe wirklich, wie git fetch + git rebaseBefehle von jetzt an funktionieren. Es gibt keinen mehr oder weniger Konflikt auf unserem Git-Baum von jetzt an :)
Travis Le