1. 程式人生 > >Git詳解——不喜歡 merge 的分叉?用 rebase

Git詳解——不喜歡 merge 的分叉?用 rebase

有些人不喜歡 merge ,因為在 merge 之後, commit 歷史就會出現分叉,這種分叉再匯合的結構會 讓有些人覺得混亂而難以管理。如果你不希望 commit 歷史出現分叉,可以用 rebase 來代替 merge

 

rebase——在新位置重新提交

rebase ,又是一箇中國人看不懂的詞。這個詞的意思,你如果查一下的話:

 

其實這個翻譯還是比較準確的。 rebase 的意思是,給你的 commit 序列重新設定基礎點(也就是父 commit )。展開來說就是,把你指定的 commit 以及它所在的 commit 串,以指定的目標 commit

為基礎,依次重新提交一次。例如下面這個 merge

git merge branch1

 

如果把 merge 換成 rebase ,可以這樣操作: 

git checkout branch1
git rebase master

 

可以看出,通過 rebase56 兩條 commit s 把基礎點從 2 換成了 4 。通過這樣的方式, 就讓本來分叉了的提交歷史重新回到了一條線。這種「重新設定基礎點」的操作,就是 rebase 的含義。

 

另外,在 rebase 之後,記得切回 master

merge 一下,把 master 移到最新的 commit : 

git checkout master
git merge branch1

 

 

為什麼要從 branch1rebase ,然後再切回 mastermerge 一下這麼麻煩,而不是直接在 master 上執行 rebase

從圖中可以看出, rebase 後的 commit 雖然內容和 rebase 之前相同,但它們已經是不同 的 commit s 了。如果直接從 master 執行 rebase 的話,就會是下面這樣:

 

這就導致 master

上之前的兩個最新 commit 被剔除了。如果這兩個 commit 之前已經在中央倉庫存在,這就會導致沒法 push 了:

 

 

所以,為了避免和遠端倉庫發生衝突,一般不要從 master 向其他 branch 執行 rebase 操 作。而如果是 master 以外的 branch 之間的 rebase (比如 branch1branch2 之間),就不必這麼多費一步,直接 rebase 就好。

 

小結

本節介紹的是 rebase 指令,它可以改變 commit 序列的基礎點。它的使用方式很簡單:

git rebase 目標基礎點

 

需要說明的是, rebase 是站在需要被 rebasecommit 上進行操作,這點和 merge 是不同 的。