在我看到的混合合併和重新綁定中的主要問題是,當你做一個rebase時,它會將歷史「線性化」,而這對於合併提交併不能很好地工作。但線性化本身實際上具有其自身的優點,因爲歷史變得更簡單並且更容易推理。
最簡單的策略是確實避免合併。在此之前,人們會早些說git merge X
而不是git rebase X
。
這並沒有那麼糟糕,除非在本地分支中有多個提交,並且其中一個提交了rebase時的合併衝突。進一步提交到同一個地點可能會一次又一次地產生相同的合併衝突。在這種情況下,解決方法可能是中止重新分配git rebase --abort
並重新排列本地提交git rebase --interactive
或壓縮本地提交(git reset $(git merge-base HEAD X)
)。之後重複rebase。
在進行rebase之前應特別注意共享分支機構。重訂那些在人力同步將是必需的,許多人可能會傾向於避免不惜一切,見下圖:
另一種方法是接受合併從上游開發過程中和合並後/讓拉之前做壁球請求,例如:
git checkout -b Work
#work...commit...commit..
git merge X
#work...commit...commit..
git merge X
git reset X && git add . && git commit -m 'All my work squashed'
#alternatively the last part might be like this:
git checkout X && git merge --squash Work
這種方法的好處在於,你可以有這樣的分支沒有人際交往的開銷相對安全地共享信息。在合併兩個分支時解決衝突通常比在另一個分支上重放一個分支時更容易。
P.S.希望你們在考慮轉向Gerrit時知道你在做什麼。 –
我希望我對此有發言權,這是一家重要的國際公司,我們從上面獲得了這一要求。到目前爲止,我們一直在使用Atlassian Stash,但我們需要稍微嚴格的代碼審查規則。在某些情況下,Gerrit可能是一種矯枉過正的情況,那是你的建議? – Ira
根據我的經驗,Gerrit傾向於成爲一種失能而非啓用工具。 –