簡體   English   中英

將團隊從 Git Merge 切換到 Rebase

[英]Switching a team from Git Merge to Rebase

我們的研發與兩個中央倉庫合作,最初由非常頑固的聰明人開始,一個使用 rebases,另一個使用 gitflow 和合並。 雖然我很習慣使用合並,而且我看到大多數 github 項目都使用這種模式,但我們面臨着遵守“rebase”的壓力,因為我們正在轉向更有組織的 Gerrit 代碼審查系統,並且許多開發人員正在轉向我們的來自另一個團隊的回購。

所以這里是:手冊頁警告我永遠不要混合變基和合並,現在我必須切換我的整個團隊。 我想知道如何做到這一點而不會給我們的代碼穩定性帶來太大風險。 人們總是有一個或兩個開放的功能分支,並且在開發過程中可能會多次從 dev 合並。 這樣的功能分支是否可以只切換到變基,還是應該在所有功能分支首先合並並且自分叉后在其歷史記錄中不存在合並的分支之后截止日期? 我如何計划這是一個平穩過渡?

我看到混合合並和變基的主要問題是,當您執行變基時,它會“線性化”歷史記錄,並且這對合並提交效果不佳。 但隨着歷史變得更簡單和更容易推理,線性化本身實際上有它自己的優點。

最簡單的策略是確實避免合並 在人們早先會說git merge X do git rebase X的那一刻。

這並沒有那么糟糕,除非您在本地分支中有多個提交並且其中一個在 rebase 時產生合並沖突。 對同一地點的進一步提交可能會一次又一次地產生相同的合並沖突。 在這種情況下的解決方法可能是中止 rebase git rebase --abort並使用git rebase --interactive重新排列本地提交或git rebase --abort本地提交( 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

這種方法的優點是您可以相對安全地共享這樣的分支,而無需人工交流。 合並兩個分支時通常也比在另一個分支上重放一個分支時更容易解決沖突。

我認為您需要理解並使用合並和變基來使用 git(尤其是在 gerrit 中)。

一些例子...

當您將功能分支提升到新的遠程主節點時,您將合並。 這提供了最少的提升工作,並且很容易在例如 gitk 中跟蹤功能開發的歷史。

git fetch
git checkout origin/my_feature
git merge origin/master
git commit
git push origin HEAD:refs/for/my_feature

您將在准備交付提交時進行合並(使用--squash選項,因為master中不允許進行合並提交)。

git fetch
git checkout origin/master
git merge --squash origin/my_feature
git commit
git push origin HEAD:refs/for/master

無論出於何種原因,當交付提交失敗集成並且您需要將其更新為新的遠程主服務器時,您將重新設置基准。

git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM