2013-09-21 3 views
213

Ich begann mit Git irgendwann zurück und verstehe die Feinheiten nicht vollständig. Meine grundlegende Frage ist hier, um den Unterschied zwischen einer git pull und git pull --rebase herauszufinden, seit dem Hinzufügen der --rebase Option scheint nicht etwas ganz anderes zu tun: macht nur einen Zug.Unterschied zwischen Git ziehen und Git Pull - Rebase

Bitte helfen Sie mir den Unterschied zu verstehen.

+6

Bezogen: [Wann sollte ich git pull --rebase verwenden?] (Http://stackoverflow.com/q/2472254/456814). –

+2

Mögliches Duplikat von [git pull VS git fetch git rebase] (http://stackoverflow.com/questions/3357122/git-pull-vs-git-fetch-git-rebase) –

+0

Nützlicher Link: https: // www. atlassian.com/git/tutorials/rewriting-history/gitrebase –

Antwort

236

git pull = git fetch + git merge gegen Tracking-Upstream-Zweig

git pull --rebase = git fetch + git rebase gegen Tracking-Upstream-Zweig

Wenn Sie wissen wollen, wie git merge und git rebase unterscheiden, read this.

+8

Es ist erwähnenswert, dass 'git pull --rebase' dasselbe ist wie' git fetch' und 'git rebase' ist im Grunde wie es ist , aber es ist nicht * genau * semantisch äquivalent. Es gibt einige Unterschiede, von denen einige hier erklärt werden. http://gitolite.com/git-pull--rebase – w0rp

+4

Es ist, was ich eine "bequeme Lüge" nennen würde, um einen Ausdruck von Scott Meyers zu leihen. Es ist ein guter Weg, es zu erklären. – w0rp

9

Im sehr einfachstenen Fall von keiner Kollisionen

  • mit rebase: Rebasing Ihrem lokalen Commits ontop von Remote-Head und tut nicht eine Zusammenführung erstellen/Merge
  • ohne/normal begehen: Verschmelzungen und schafft eine Zusammenführung auch

See begehen:

man git-pull

Genauer git pull läuft mit den übergebenen Parametern und Anrufe git merge git fetch die abgerufenen Verzweigungsköpfe in den aktuellen Zweig zu fusionieren. Mit --rebase läuft git rebase anstelle von git merge.

Siehe auch:
When should I use git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing

+3

Und im Falle von Kollisionen? – Rndm

+1

Sie werden aufgefordert, sie manuell zu lösen und dann - weiter mit der Rebase: 'git sdd modified-file; git rebase --fortsetzen oder zusammenführen: 'git addieren geänderte Datei; git commit; 'where' modified-file' ist deine lokale Datei, die du manuell geändert hast/mergetool – drahnr

187

Manchmal haben wir einen Upstream, der einen Zweig, auf den wir angewiesen sind, rebasiert/zurückgespult hat. Dies kann ein großes Problem sein - was zu unsicheren Konflikten für uns führt, wenn wir flussabwärts sind.

Die Magie ist git pull --rebase

Ein normaler git pull ist, so etwas wie dies grob gesagt, (wir eine Fern genannt Herkunft und einen Zweig namens foo in all diesen Beispielen verwenden werden):

# assume current checked out branch is "foo" 
git fetch origin 
git merge origin/foo 

Auf den ersten Blick könnte man denken, dass ein Git-Pull---rebase tut genau dies:

git fetch origin 
git rebase origin/foo 

Aber das wird nicht helfen, wenn der Upstream-rebase jede „squashin beteiligt g "(was bedeutet, dass sich die Patch-IDs der Commits geändert haben, nicht nur ihre Reihenfolge).

Was bedeutet git pull --rebase muss ein bisschen mehr als das tun. Hier ist eine Erklärung, was es macht und wie.

Sagen wir Ihr Ausgangspunkt ist das:

a---b---c---d---e (origin/foo) (also your local "foo") 

Die Zeit vergeht, und Sie haben einige Commits auf Ihre eigene "foo" gemacht:

a---b---c---d---e---p---q---r (foo) 

Inzwischen in einem Anfall von Antisoziale Wut, der Upstream-Betreuer hat nicht nur sein "Foo" neu gefestigt, er hat sogar einen oder zwei Squash benutzt. Seine Commit-Kette sieht jetzt so aus:

Ein Git Ziehen an diesem Punkt würde Chaos führen. Sogar ein git fetch; Git Rebase Herkunft/foo würde es nicht schneiden, weil "b" und "c" auf der einen Seite, und committe "b + c" auf der anderen, würde Konflikt. (Und ähnlich mit d, e und d + e).

Was git pull --rebase der Fall ist, in diesem Fall ist:

git fetch origin 
git rebase --onto origin/foo e foo 

Dies gibt Ihnen:

a---b+c---d+e---f---p'---q'---r' (foo) 

Sie noch Konflikte bekommen können, aber sie werden echte Konflikte (zwischen p/q/r und a/b + c/d + e/f), und keine Konflikte, die durch b/c verursacht werden, die mit b + c usw. in Konflikt stehen.

Antwort entnommen aus (und leicht modifiziert):
http://gitolite.com/git-pull--rebase

+6

Dies ist die beste Antwort. Vielleicht möchten Sie das Endergebnis in 'a --- b + c --- d + e --- f --- p '--- q' --- r '(foo)' ändern, da die Änderungen der Rebase die Hashwerte ändern . – Bastien

+1

Geändert, danke für das Zeigen von @Bastien –

+9

Diese Antwort wurde wörtlich von http://gitolite.com/git-pull-rebase kopiert und eingefügt und sollte die Zuordnung für die Lizenz auf dieser Seite enthalten. – Wildcard

5

Denn dies ist wichtig, den Unterschied zwischen Merge und Rebase zu verstehen.

Rebases sind, wie Änderungen von der Spitze der Hierarchie nach unten gehen und Zusammenführungen sind, wie sie zurück nach oben fließen.

Details siehe - http://www.derekgourlay.com/archives/428

+0

Ich denke, dass Ihre Antwort eine viel einfachere Erklärung bietet, die im Rest der obigen Antworten nicht offensichtlich ist. Vielen Dank. –

+0

Willkommen @Aron C –

30

Angenommen, Sie zwei Commits in Filiale haben:

 D---E master 
    /
A---B---C---F origin/master 

Nach "Git-Pull", wird sein:

 D--------E 
    /  \ 
A---B---C---F----G master, origin/master 

Nach „git Ziehen Sie --rebase ", es wird keinen Zusammenführungspunkt G geben. Beachten Sie, dass D und E unterschiedliche Zusagen werden:

A---B---C---F---D'---E' master, origin/master 
+0

ist es nicht A --- B --- C --- D '--- E' - F? – prgmrDev