2012-04-27 198 views
6

任何人都可以解釋這一點,即使遠程存儲庫在記?git pull --rebase,git rebase和git merge之間的區別

+1

沒有'git commit --rebase';你的意思是'git pull --rebase'?或者,'git svn dcommit --no-rebase'? (首先錯過了git-svn標籤) – torek 2012-04-27 05:49:40

+0

感謝您指出錯誤..我更新了這個問題! – 2012-04-27 06:04:58

回答

7

git pull --rebase是當你想把你的開發分支變成最新的時候的方法 - 這些分支通常不會發布給其他人(除了看看它),所以重寫歷史不是問題,你真的不想在這樣的分支中合併等等。

git merge執行合併;有關詳細信息,請參閱聯機幫助頁 - 指令中有大量的選項,這些選項在此處解釋太多。

git rebase執行重新摺疊,即重寫歷史。它會將你的提交到與其他分支不同的地方,臨時刪除它們,從其他分支申請缺少的提交,然後重新提交你的提交。 git rebase也有一個交互模式,您可以刪除/修改/組合(擠壓)某些提交。

看看http://learn.github.com/p/rebasing.html的一些漂亮的關於底座如何工作的圖表。

+0

注意:git 2.8(2016年3月)將允許'git pull --rebase = interactive command'。請參閱http://stackoverflow.com/a/29717607/6309。 – VonC 2016-01-27 09:37:58

6

git rebase允許您將分支從已分化的位置分離出來,並將其重新插入其他分支的頂部。相反,git merge只是合併來自當前分支中另一個分支的更改,而無需重新插入歷史記錄。

如果沒有衝突,結果是合併和變基之間是相同的,但歷史上是不同的:

(merge branch on master): 
master --A--B--C--E 
       /
branch   --D 

(rebase branch onto master): 
master  --A--B--C--D' 

在第一種情況下的合併將創建branch分支合併爲master,從而創造合併提交,E。在第二種情況下,D只需重新插入master,創建另一個提交,D'

git pull --rebase將從遠程獲取更改,並重新綁定(重新插入)您的更改。它會直接記錄您所做的不在遠程的更改,並從最後一次更改開始重播它們。