2013-09-21 140 views
213

我開始使用git,並沒有完全理解錯綜複雜的情況。我的基本問題在於找出git pullgit pull --rebase之間的差異,因爲添加--rebase選項似乎沒有什麼不同:只是拉一下。git pull和git pull之間的區別--rebase

請幫我理解差異。

+6

相關:[我應該什麼時候使用git pull --rebase?](http://stackoverflow.com/q/2472254/456814)。 – 2014-05-16 20:26:47

+2

[git pull VS git fetch git rebase]可能重複(http://stackoverflow.com/questions/3357122/git-pull-vs-git-fetch-git-rebase) –

+0

有用的鏈接:https:// www。 atlassian.com/git/tutorials/rewriting-history/git-rebase –

回答

236

git pull = git fetch + git merge針對追蹤上游分支

git pull --rebase = git fetch + git rebase對跟蹤上游分支

如果你想知道如何git mergegit rebase不同,read this

+8

值得注意的是,說'git pull --rebase'與'git fetch'和'git rebase'基本上是一樣的,但它並不完全等同於語義。有一些差異,其中一些在這裏解釋。 http://gitolite.com/git-pull--rebase – w0rp

+4

這就是我稱之爲「便利的謊言」,借用Scott Meyers的一句話。無論如何,這是一個很好的解釋方法。 – w0rp

9

在沒有衝突

  • 與底墊中的很大部分簡單的例子:變基您的本地提交ontop的遠程端的和不創建一個合併/合併提交
  • 無/正常:合併和創建一個合併提交

參見:

man git-pull

更確切地說,拉的git git的運行與給定的參數和 電話混帳合併獲取檢索到的分支頭合併到當前 分支。使用--rebase,它會運行git rebase而不是git merge。

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

+3

如果發生碰撞? – Rndm

+1

您將被要求手動解析它們,然後 - 繼續使用rebase:'git sdd modified-file; git rebase --continue'或合併:'git add modified-file; git commit;''其中'modified-file'是您手動修改的本地文件/ mergetool – drahnr

187

有時我們有一個上游,重新啓動/倒回我們依賴的分支。這可能是一個大問題 - 如果我們在下游,會給我們造成凌亂的衝突。

神奇的是git pull --rebase

普通的Git拉是嚴格意義上,這樣的事情(我們將使用在所有這些例子中遠程叫起源和分支名爲foo):

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

乍一看,你可能會認爲,一個git拉--rebase不只是這一點:

git fetch origin 
git rebase origin/foo 

但是,如果上游底墊中任何涉及「squashin不會幫助g「(這意味着提交的patch-id更改,而不僅僅是它們的順序)。

這意味着git pull --rebase必須做的比這更多一點。以下是對它的作用和方式的解釋。

比方說,你的出發點是這樣的:

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

時間的推移,你已經對自己的「foo」的基礎上增加一些提交:

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

同時,在一個合適的反社會憤怒,上游維護者不僅重新啓動了他的「foo」,甚至還使用了一兩個壁球。他的提交鏈現在看起來像這樣:

a---b+c---d+e---f (origin/foo) 

git pull在這一點上會導致混亂。即使是一個git獲取; git rebase origin/foo不會削減它,因爲一方提交「b」和「c」,另一方提交「b + c」會衝突。 (並且與d,e和d + e類似)。

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

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

這給了你:

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

你可能仍然得到衝突,但他們會真正的衝突(在p/q/r和a/b + c/d + e/f之間),而不是由b/c與b + c衝突引起的衝突等。

取自(和稍微修改)

答案:
http://gitolite.com/git-pull--rebase

+6

這是最好的答案。你可能想將最終結果改爲'a --- b + c --- d + e --- f --- p'--- q'--- r'(foo)',因爲底座改變了哈希。 – Bastien

+1

已更改,謝謝指出,@Bastien –

+9

此答案已從http://gitolite.com/git-pull--rebase複製並逐字粘貼,並應在該頁面上包含每個許可證的歸屬。 – Wildcard

5

對於這種重要的是要理解合併衍合和之間的差。

Rebases是變化應該如何通過從層次結構向下的頂部 和合並是他們如何迴流向上。

,詳見 - http://www.derekgourlay.com/archives/428

+0

我認爲你的答案提供了一個更簡單的解釋,在上面的其餘答案中並不明顯。謝謝。 –

+0

歡迎來到@Aron C –

30

假設您在當地的分支機構兩次提交:

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

後 「混帳拉」,將是:

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

後「混帳pull --rebase「,則不會有合併點G.請注意,D和E會成爲不同的提交:

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

不是嗎A --- B --- C --- D'--- E' - F? – prgmrDev

相關問題