2013-03-24 339 views

回答

32

git pull --rebasefetch (git fetch)首先更新upstream/master提交。

如果你只是重新編號沒有第一次更新upstream/master,你不會得到相同的結果。

我說明它在 「master branch and 'origin/master' have diverged, how to 'undiverge' branches'?


SnakE提到in the commentsgit pull --rebase是不準確git fetch && git rebase origin/master
請參閱 「what does "git pull --rebase" do?

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

什麼git pull --rebase確實,在這種情況下,就是:

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

這裏:

  • origin/master的是新更新的origin/masterB'
  • B是舊的origin/master(之前獲取更新的話)
  • master是分支上的origin/master

這不同於git fetch在+ git rebase origin/masterpull --rebase命令試圖找出頂部重播其提交的真的當地一些,並且來自上一次獲取的上游。

爲此,它會查看遠程跟蹤分支的reflog(本例中爲origin/master)。此reflog代表origin以「最近的第一個」順序的連續git fetch操作的提示。

對於每個reflog條目(origin/[email protected]{1},然後...{2}等),它會檢查該提交是否是當前分支頭的一個祖先master。只要它找到一個,它就會選擇它作爲rebase的起點(上例中的B)。

+10

所以'git pull --rebase upstream master'類似於'git fetch upstream && git rebase upstream/master'? – Dennis 2013-05-10 04:01:59

+0

@丹尼斯,是的。 – VonC 2013-05-10 06:43:50

+2

其實沒有。想象一下,你拉過歷史「A-B」,並在其上做了一個改變,「A-B-C」。然後其他人修改'B'到'B'',並且推動他們的變化,以便原點現在變成'A-B'-D'。現在,如果你執行'git fetch && git rebase origin/master',那麼rebase將會失敗併發生衝突。然而'git pull --rebase'會解決這個問題並最終以'A-B'-D-C'結尾。 'pull --rebase'地毯下肯定會發生一些魔法。編輯:[prooflink](http://gitolite.com/git-pull--rebase.html) – SnakE 2015-03-17 18:34:48