In git wie unterscheidet sich Fetch von Pull und wie unterscheidet sich Merge von Rebase?

159

Ich kann das einfach nicht verstehen. Ich habe viel im Internet und in Büchern gelesen und etwas bleibt einfach nicht in meinem Kopf. Kann mir bitte jemand die Dummy-Version von Folgendem geben:

  • Git Fetch vs Pull
  • Git Merge vs Rebase
techsjs2013
quelle
23
Ich sympathisiere mit dem Fragesteller. Die Dokumentation und Beratung ist so umfangreich und mögliche Workflow-Permutationen so umfangreich, dass man extrem verwirrt ist. Ein Kopf explodierte gerade und man weiß nicht genau, was man fragen soll, es ist einfach nicht so offensichtlich.
Ed Randall
3
Warum nicht die Pestrella-Antwort als akzeptiert wählen?
Arashsoft
@Arashsoft, weil er seit 2013 nicht mehr gesehen wird
VdeX

Antworten:

414

holen gegen ziehen

fetch Lädt alle Änderungen aus dem Remote-Zweig * herunter, aktualisiert Ihre Repository-Daten, lässt jedoch Ihren lokalen * Zweig unverändert.

pullführt eine fetchund zusätzlich mergedie Änderungen in Ihrer lokalen Niederlassung durch.

Was ist der Unterschied? pullAktualisiert Ihren lokalen Zweig mit Änderungen aus dem gezogenen Zweig. A fetchbringt Ihre lokale Niederlassung nicht voran.

Merge vs Rebase

Angesichts der folgenden Geschichte:

          C --- D --- E lokal
         /.
    A --- B --- F --- G Fernbedienung

mergeverbindet zwei Entwicklungsgeschichten miteinander. Dazu werden die Änderungen wiedergegeben, die in Ihrem lokalen Zweig aufgetreten sind, nachdem dieser über dem Remote-Zweig auseinander gegangen ist, und das Ergebnis in einem neuen Commit aufgezeichnet. Diese Operation behält die Abstammung jedes Commits bei.

Die Wirkung von a mergewird sein:

          C --- D --- E lokal
         / \.
    A --- B --- F --- G --- H Fernbedienung

rebaseÜbernimmt Commits, die in Ihrer lokalen Zweigstelle vorhanden sind, und wendet sie erneut auf die Remote-Zweigstelle an. Diese Operation schreibt die Vorfahren Ihrer lokalen Commits neu.

Die Wirkung von a rebasewird sein:

                  C '- D' - E 'lokal
                 /.
    A --- B --- F --- G Fernbedienung

Was ist der Unterschied? A mergeändert die Abstammung von Commits nicht. A rebase schreibt die Abstammung Ihrer lokalen Commits neu.

*Diese Erklärung wird davon ausgegangen , dass der Stromzweig eine Zweigstelle ist, und daß die Verzweigung als Argument angegeben fetch, pull, merge, oder rebaseist ein Remote - Zweig. Dies ist der übliche Fall. pullBeispielsweise werden alle Änderungen aus dem angegebenen Zweig heruntergeladen , Ihr Repository aktualisiert und mergedie Änderungen in den aktuellen Zweig übernommen.

Pestrella
quelle
30
Dies ist bei weitem die einfachste und beste Erklärung, ohne auf die Debatte hinter jeder Praxis einzugehen. Danke dir!
Jonathan S. Fisher
3
Absolut goldene Antwort
ChaseMoskal
5
Ich wünschte, ich könnte diese Antwort "favorisieren". Vielleicht drucke ich es einfach aus und klebe es an meine Wand.
LarsH
2
Ich würde sagen, die besten der besten Antworten, die ich im Stapelüberlauf habe, Danke
Shahab J
1
Wenn beim Abrufen nur Änderungen vom Remote-Zweig heruntergeladen und die Repository-Daten aktualisiert werden, der lokale Zweig jedoch unverändert bleibt, wozu wird dann abgerufen, wenn das Arbeitsverzeichnis die Änderungen nicht anzeigt / widerspiegelt? Meine Frage war ursprünglich, wie ich die Änderungen sehen kann, die jemand anderes vorgenommen hat, und dann entscheiden kann, ob ich sie in mein Arbeitsverzeichnis einfügen möchte (dh mit den Änderungen anderer Personen experimentieren, um sicherzustellen, dass meine Arbeit dadurch nicht beeinträchtigt wird), aber ich bin es immer noch verwirrt, wie das geht? Sollte ich nur pul und experimentieren / erforschen, und wenn es problematisch war, einen Hard-Reset durchführen?
27

Fetch vs Pull

Git-Abruf aktualisiert nur Ihre Repo-Daten, aber ein Git-Pull führt im Grunde einen Abruf durch und führt dann den gezogenen Zweig zusammen

Was ist der Unterschied zwischen "Git Pull" und "Git Fetch"?


Merge vs Rebase

aus Atlassian SourceTree Blog, Merge oder Rebase :

Durch das Zusammenführen werden zwei Entwicklungslinien zusammengeführt, wobei die Abstammung jeder Commit-Historie erhalten bleibt.

Im Gegensatz dazu vereinheitlicht das erneute Basieren die Entwicklungslinien, indem Änderungen aus dem Quellzweig neu geschrieben werden, sodass sie als untergeordnete Elemente des Zielzweigs angezeigt werden. Dabei wird effektiv so getan, als ob diese Commits die ganze Zeit über über den Zielzweig geschrieben wurden.

Schauen Sie sich auch Learn Git Branching an , ein schönes Spiel, das gerade auf HackerNews veröffentlicht wurde ( Link zu Post ) und viele Tricks zum Verzweigen und Zusammenführen lehrt. Ich glaube, dass es in dieser Angelegenheit sehr hilfreich sein wird.

Felipe Sabino
quelle
danke Felips .. also wenn ich einen Abruf von einer Fernbedienung mache, wird mein Hauptzweig die Updates nicht haben? es klingt auch so, als ob ich mehr Rebase als Merga
Techsjs2013
Rebase vs Merge hängt von Ihrer Absicht ab, wobei zu berücksichtigen ist, dass Rebase den gesamten Commit-Verlauf neu schreibt. Und ja, wenn Sie nur abrufen, wird der Hauptzweig nicht geändert, Sie müssen zusammenführen (oder ziehen), damit er die Remote-Änderungen anwendet
Felipe Sabino
git merge <remote>/<branch>. Wenn Sie beispielsweise der Hauptzweig sind und Ihre Fernbedienung den Ursprung hat, können Sie dies tun git merge origin/master.
Felipe Sabino
es klingt also so, als ob ich immer einen git checkout master git fetch git diff origin / master git rebase origin master machen sollte
techsjs2013
8

Pull vs Fetch :

Ich verstehe das so, dass git pulles einfach git fetchfolgt git merge. Das heißt, Sie rufen die Änderungen von einem Remote-Zweig ab und führen sie dann in den aktuellen Zweig ein.


Merge vs Rebase :

Eine Zusammenführung erfolgt wie im Befehl angegeben. Führen Sie die Unterschiede zwischen dem aktuellen Zweig und dem angegebenen Zweig (in den aktuellen Zweig) zusammen. Dh der Befehl git merge another_branchwird another_branchin den aktuellen Zweig zusammengeführt.

Eine Rebase funktioniert etwas anders und ist irgendwie cool. Angenommen, Sie führen den Befehl aus git rebase another_branch. Git findet zuerst die neueste gemeinsame Version zwischen dem aktuellen Zweig und another_branch. Dh der Punkt, bevor die Zweige auseinander gingen. Dann bewegt git diesen divergierenden Punkt zum Kopf des another_branch. Schließlich werden alle Commits im aktuellen Zweig seit dem ursprünglichen Sägeanschnitt werden wiederholt aus dem neuen Sägeanschnitt. Dies schafft eine sehr saubere Geschichte mit weniger Zweigen und Zusammenführungen.

Es ist jedoch nicht ohne Fallstricke! Da der Versionsverlauf "neu geschrieben" wird, sollten Sie dies nur tun, wenn die Commits nur in Ihrem lokalen Git-Repo vorhanden sind. Das heißt: Tun Sie dies niemals , wenn Sie die Commits auf ein Remote-Repo übertragen haben.

Die Erklärung zur Umbasierung in diesem Online-Buch ist recht gut und enthält leicht verständliche Abbildungen.


Ziehen Sie mit Rebasing statt Merge

Ich benutze Rebase eigentlich ziemlich oft, aber normalerweise ist es in Kombination mit Pull:

git pull --rebase

ruft Remote-Änderungen ab und stützt sie dann neu, anstatt sie zusammenzuführen. Das heißt, es werden alle Ihre lokalen Commits vom letzten Mal, als Sie einen Pull ausgeführt haben, wiedergegeben. Ich finde das viel sauberer als ein normales Ziehen mit dem Zusammenführen, was ein zusätzliches Festschreiben mit dem Zusammenführen erzeugt.

Steinar
quelle
Wenn ich also in einem Zweig arbeite und diesen wieder in den Master einbinden möchte, bevor ich einen Push mache. Ich sollte Master auschecken, dann Rebase Fix bekommen?
Techsjs2013
Ich bin immer noch nicht unter Stand Merge vs Rebase
techsjs2013
Ich denke, die Abbildungen in der Antwort von Pestrella zeigen den Unterschied ganz deutlich. Schauen Sie sich auch Folgendes an : git-scm.com/book/en/Git-Branching-Rebasing - das erklärt es ziemlich anständig (derselbe Link wie der in der Antwort, aber für die Faulen noch einmal angegeben).
Steinar
0

Zusammenführen - Der HEAD-Zweig generiert ein neues Commit, wobei die Abstammung jedes Commit-Verlaufs erhalten bleibt. Der Verlauf kann verschmutzt werden, wenn mehrere Personen, die parallel an demselben Zweig arbeiten, Zusammenführungsverpflichtungen eingehen.

Rebase - Schreibt die Änderungen eines Zweigs in einen anderen neu, ohne ein neues Commit zu erstellen. Der Codeverlauf ist vereinfacht, linear und lesbar, funktioniert jedoch nicht mit Pull-Anforderungen, da Sie nicht sehen können, welche geringfügigen Änderungen jemand vorgenommen hat.

Ich würde es verwenden git merge, wenn ich mich mit funktionsbasierten Workflows beschäftige oder wenn ich mit Rebase nicht vertraut bin. Aber wenn ich eine sauberere, linearere Geschichte möchte, git rebaseist dies angemessener. Weitere Informationen finden Sie in diesem Artikel zum Zusammenführen oder erneuten Basieren .

Nesha Zoric
quelle