2014年2月7日 星期五

長時間沒有merge的branch要如何在master已有多個commit後安全的將delta匯入(以git版本控制為例)==>你要的是rebase

我所面臨的情境是這樣的,最開始是clone了一個project下來自己改自己用,沒想過要push回remote repo,然後時間飛快過了一年,驚覺master的子版本已經跳了3次,已經不知道要怎麼merge起了。

參考 wiki對merge的解釋 ,可以了解,由於使用了"共祖"的觀念(嗯…怎麼有點演化生物學的感覺),經由 diff3  / three-way merge 的使用,各段程式碼中,三者皆同的部分是不用更動的,兩兩相同時,只有本地分直不同者也是不用更動,只有遠端不同時則使用遠端版本,只有共祖不同時則發出衝突訊息。只要本地及遠端的變更沒有重疊到,基本上都能合併出正確的程式碼。由於:

git pull = git fetch + git merge (所以想要看 diff report 的話就不能直接 pull,要先fetch,再diff,再pull)

所以原則上會使用一次到位的 git pull 指令。但是請參考 "使用 git rebase 避免無謂的 merge" 這篇文章,顯然當我們手上開發的 feature 和 master 沒有什麼重疊的時候,一堆因為與遠端 merge 進而產生出來的節點會讓線圖太複雜,此時 rebase 是一個更清爽的解決方案,它減少了每次因為 merge 而產生出來的那個 dummy 節點。 wiki 上也對這個過程作了一些解釋,基本上就是說,每個 commit 間的 patch 都會同步進行調整演算,讓 rebase 能得到正確的結果。所以下達以下指令:

git pull --rebase

要指定非預設repo/branch時則應下達以下指令:

git pull --rebase repo branch

ps.更詳細的操作可參考 pro git ,簡要列表可參考 版本控制系統 Git 精要 ,branch 圖解還可以參考這篇, rebase 還可以參考這篇 和更詳細的Git-rebase 小筆記
ps2.更複雜的情況,有不止一個 repo 時,diff的方式可參考這篇 ,典型的衝突解決方式參考這篇 和 這篇

20171010更新:

這篇 gitbook 寫得很簡潔,大約500字而已,趕時間可以快速瀏覽一下


沒有留言:

張貼留言