2013-03-24 17 views

Antwort

32

Die git pull --rebase wird fetch (git fetch) zuerst, Aktualisierung upstream/master commits.

Wenn Sie einfach ohne erste Aktualisierung upstream/master rebase, erhalten Sie nicht das gleiche Ergebnis.

ich zeigen es in "master branch and 'origin/master' have diverged, how to 'undiverge' branches'?"


SnakE erwähnt in the comments dass git pull --rebase nicht genaugit fetch && git rebase origin/master ist.
Siehe "what does "git pull --rebase" do?"

(origin/master) 
    | 
A--B--C (master) 
\ 
    B'--D (actual origin/master after changing B and force pushing) 

Welche git pull --rebase hat, in diesem Fall ist:

git fetch origin 
git rebase --onto origin/master B master 

hier:

  • origin/master die neue, aktualisierte origin/master (B') ist
  • B ist die alte origin/master (vor ein upgedatet Fetch)
  • master ist der Zweig auf der origin/master

replay unterscheidet sich diese von git fetch + git rebase origin/master, dass der pull --rebase Befehl, um herauszufinden versucht, welche Commits wirklich Ihrem lokalen sind diejenigen, die von stromaufwärts in einem früheren Fetch gekommen waren.

Um dies zu tun, sieht es sich die Reflog der Remote-Tracking-Zweig (in diesem Fall origin/master). Dieser Reflog stellt die Spitzen der aufeinanderfolgenden Operationen git fetch auf origin in der Reihenfolge "neueste erste" dar.

Für jeden Reflog-Eintrag (origin/[email protected]{1}, dann ...{2} usw.) wird überprüft, ob dieses Commit ein Vorgänger des aktuellen Zweigkopfs master ist. Sobald es einen gefunden hat, wählt es es als Ausgangspunkt für die Rebase (B im obigen Beispiel).

+10

Also ist 'git pull --rebase upstream master 'analog zu' git fetch upstream && git rebase upstream/master'? – Dennis

+0

@Dennis ziemlich, ja. – VonC

+2

Eigentlich nein. Stellen Sie sich vor, Sie haben die Geschichte "A-B" gezogen und eine Änderung darüber vorgenommen, "A-B-C". Dann änderte jemand anders "B" zu "B" und schob ihre Änderungen so, dass der Ursprung jetzt "A-B" -d ist. Wenn Sie nun 'git fetch && git rebase origin/master' ausführen, wird die Rebase mit Konflikten fehlschlagen. Aber 'git pull --rebase' wird es herausfinden und mit 'A-B'-D-C' enden. Unter "pull --rebase" passiert definitiv etwas Magie. Edit: [Korrekturlink] (http://gitolite.com/git-pull--rebase.html) – SnakE