rebase
(和cherry-pick
)和merge
都有它們的優點和缺點。我認爲在這裏merge
,但它是值得理解。 (在這裏尋找一個備用中,公認爲answer枚舉的情況下rebase
是優選的。)
merge
優於cherry-pick
和rebase
爲幾個原因。
- 健壯性。提交的SHA1標識符不僅標識它本身,而且還標識與之前的所有其他提交。這爲您提供了一個保證,即給定SHA1中的存儲庫的狀態在所有克隆中都是相同的。 (理論上)有人沒有機會做出看起來像是一樣的變化,但實際上是破壞或劫持你的存儲庫。你可以挑選個人變化,他們可能是相同的,但你沒有保證。 (作爲次要問題,如果其他人再次選擇同一次提交,那麼新的櫻桃挑選的提交將佔用額外的空間,因爲即使您的工作副本完全相同,它們也會出現在歷史記錄中。)
- 易用性。人們往往很容易理解
merge
工作流程。 rebase
往往被認爲更先進。最好是瞭解這兩者,但不想成爲版本控制專家的人(根據我的經驗,包括許多擅長自己的工作但不想花費額外時間的同事)更容易時間只是合併。
即使合併重的工作流程rebase
和cherry-pick
仍然是有用的特殊情況:
- 一個缺點
merge
是混亂的歷史。rebase
可以防止在您的歷史中散佈大量的提交,就像您定期合併其他人的更改一樣。事實上,這是我使用它的主要目的。你想成爲非常小心,永遠不會rebase
代碼,你已與其他存儲庫共享。一旦某個提交是push
,那麼其他人可能會對其進行承諾,而重新綁定最多會導致上面討論的那種重複。在最糟糕的情況下,最終可能會出現一個非常混亂的存儲庫和微妙的錯誤,需要很長時間才能發現。
cherry-pick
可用於從主題分支中抽取出一小部分變化,這些主題分支基本上決定放棄,但意識到有幾個有用的部分。
至於寧願合併許多變化:它只是簡單得多。一旦開始擁有大量變更集合,就會變得非常繁瑣。 git(以及Mercurial和Bazaar中)的合併解決方案非常好。大部分時間你都不會遇到長期分支融合的重大問題。我通常一次合併所有東西,只有如果我得到大量的衝突,我是否備份並重新運行合併零碎。即使那樣,我也是以大塊的方式做到這一點。作爲一個非常實際的例子,我有一位同事對合並進行了3個月的修改,並且在250000行代碼庫中遇到了9000次衝突。我們所要解決的問題是,一次合併一個月的價值:衝突不會線性增加,並且這樣做會導致遠遠少於少於9000個衝突。這仍然是很多工作,但不是一次嘗試一次就能完成。
實際上,理論上Mallory可能會通過創建具有相同SHA1但不同內容的提交來破壞存儲庫,但實際上可能不會發生。 :) – Bombe 2009-08-07 06:55:08
哈:)我的意思是「理論上賠率很低,你可以依靠它不發生」,但你說得對,它看起來顛倒。 – quark 2009-08-07 14:45:04
您如何看待「merge --squash」? – cmcginty 2009-09-29 04:02:41