2017-03-21 3 views
3

Was ist der Unterschied zwischen 'git merge' und 'git fetch'? Ich habe einige Probleme mit diesen beiden Befehlen. Ich weiß nicht wann ich das eine oder andere benutzen soll.Unterschied zwischen Git Merge und Git fetch?

+1

'git fetch' aktualisiert Ihr lokales Repository mit Commits, die seit dem letzten Abruf zum Server hinzugefügt wurden, während' git merge' versuchen wird, zwei parallele Entwicklungspfade zu kombinieren. Sie sind völlig verschieden. Haben Sie darüber nachgedacht, eines der vielen Tutorials auf git oder das Pro Git Buch (verfügbar [online] (https://git-scm.com/book/en/v2) kostenlos) zu lesen? –

Antwort

2

UPDATE - Gut, meine Merge-Diagramme waren die ganze Zeit falsch. ist eine Zusammenführung nicht den „anderen“ Zweig Ref bewegen ...


git fetch ist über Daten von einem Remote-Repository abgerufen werden.

git merge ist über die Kombination von Arbeit aus mehreren Linien der Arbeit (in der Regel lokale Zweige, aber siehe unten).

git pull (Ich weiß, dass Sie nicht über pull fragten aber bei mir tragen) ist eine Abkürzung, die wie fetch Daten aus dem entfernten abruft, dann merge s in Ihren aktuellen Zweig der entsprechende Linie der Arbeit von der Fernbedienung (falls ist eins, die "Tracking-Informationen" bestimmt dies.)

So sagen Sie zum Beispiel, Sie haben eine Remote-Repo mit einem einzigen Zweig (master) mit 5 commits.

'origin' repo 

A --- B --- C --- D --- E <--(master) 

Vor einiger Zeit hatten Sie dieses Repo geklont; zu der Zeit war nur der erste Commit (A) drin. Sie haben dann einen neuen Zweig erstellt (branch1) und haben ein wenig Arbeit geleistet, indem Sie einen neuen Commit (L) für diesen Zweig erstellt haben. Zuletzt hatten Sie Änderungen von der Fernbedienung übernommen; mehr darüber, wie das später funktioniert, aber jetzt sagen wir nur, dass Sie Ihre master um B aktualisiert haben.

local repo 

A --- B <--(master)(origin/master) 
\ 
    L <-- (branch1) 

Beachten Sie, dass zusätzlich zu Ihrer lokalen Niederlassung Refs (master und branch1) Sie einen Remote-Zweig Referenz haben (origin/master), die für jetzt, das gleiche wie master sein geschieht.

Nun, wenn Sie Ihre lokale Repo aktualisieren möchten alle Daten vom Ursprung enthalten, aber ohne etwas Verschmelzung, würden Sie sagen,

git fetch 

und dann haben Sie

 C --- D --- E <--(origin/master) 
    /
A --- B <--(master) 
\ 
    L <-- (branch1) 

Das ist ein Abruf - holen Sie sich die Daten von der Fernbedienung.

Der Hauptgrund, warum Sie explizit nach einem merge fragen, wäre, Ihre Arbeit von branch1 mit Ihrer master zu kombinieren.So

git checkout master 
git merge branch1 

(dann lösen möglicherweise Konflikte), und Sie jetzt

 C --- D --- E <--(origin/master) 
    /
A --- B --- M <--(master) 
\  /
    L ------- <--(branch1) 

(Unter Umständen haben - in denen nur einer der Zweige Änderungen enthält, die nicht in der anderen sind - eine Zusammenführung kann über "fast forward" erfolgen, aber das gilt nicht hier, da jeder Zweig hatte Änderungen - dh die Zweige hatten divergierte.Es gibt auch eine andere Technik namens Rebasing, die manchmal verwendet werden kann, um Zweige zu kombinieren, aber das ist eine andere Dose von Würmern ...)

Das ist also der Unterschied zwischen fetch und merge - sehr unterschiedliche Operationen, die verschiedene Dinge tun. Aber ich erwähnte auch pull welche Art von kombiniert die beiden. Wenn Sie eine pull tun, zieht es zuerst Änderungen von der Remote (falls Sie nicht vollständig mit fetch aktualisiert haben), und wenn der aktuelle Zweig einen entsprechenden Remote-Zweig hat, führt es sie zusammen.

# still on master 
git pull 

gibt so etwas wie

 C --- D --- E --- N <--(master)(origin/master) 
    /    /
A --- B --------------- M 
\     /
    L ------------------- <--(branch1) 

(Beachten Sie, dass, während ich normalerweise diese Diagramme zeichnen, so dass die „gerade Linie“ in eine Zusammenführung kommt, ist das „erste parent“, in diesem Fall, dass war für N unangenehm sein, aber das zeigt die allgemeine Commit-Topologie ...)

Zurück, als ich sprach über "ziehen Änderungen", um B in Ihrem lokalen Vertreter zu bekommen o, es wäre wahrscheinlich getan worden git pull

1

git fetch wird den Quellbaum herunterladen, um nach Änderungen zu suchen, und git merge verbindet Ihren aktuellen Zweig mit einem anderen Zweig.

Verwandte Themen