[英]Using git rebase and git merge to set up a good team workflow
我知道有很多類似的問題,但是找不到一個好的答案可以幫助我在我工作的公司中提出一個好的解決方案。 我們不是很多開發人員,但是我想提出一個可擴展的工作流。
這種情況是最常見的情況:存在一個master
分支,它永遠不會收到直接提交。 如果需要執行某些操作,則可以創建feature/personal
分支(通常使用長壽的個人分支比使用胖功能的分支更多)。 一旦對所創建的代碼感到滿意,我想將其重新帶回master
(與此同時, master
又收到了一次提交)。
重要的是要指出, master
和branchX
總是被推到遠程。
因此,為了以圖形方式澄清它,我們處於這種情況下(我將使用C進行提交,使用M進行合並):
branch1 C2---C3---C6---C9--- / master C0---C1---C4---C5---C7---C8
當前使用的工作流程可以被定義合並升/合並向下 :因為我不希望修復主合並沖突,首先我上合並了 master
內branch1
,然后我合並向下 branch1
的master
。
branch1 C2---C3---C6---C9---M1 / /\\ master C0---C1---C4---C5---C7---C8 M2
這樣做,我解決了分支內部的沖突,然后可以將分支合並到master中。
我個人不喜歡這種解決方案,主要有兩個原因:
另一方面,我的同事認為:
我提出的是通用且更直接的“合並前變基”工作流。
一旦我想合並branch1
在master
,第一我變基上,后者是前者,所以我處理我分支的所有沖突; 比我將 branch1
向下合並到master
(如果功能分支有意義,則使用NO-FF,否則使用FF)
branch1 C2---C3---C6 rebase / \\ master C5---C7---C8 M1
但是,此解決方案有一個主要缺點:
由於兩者都與遠程同步,因此需要
git push --force
。 因此,如果某人做錯了事(因為他急着,分心或愚蠢),那么可能會在一秒鍾內損失數周的工作。
另一方面,優點應該是:
您在大型團隊中采用了哪種可擴展的工作流程來保持git歷史的整潔和有意義,另一方面,如何防止git push --force
錯誤之類的潛在災難?
根據我的經驗,一個常見的模型是:
master
分支只能通過拉取請求進行更新(用您的話來說就是向下合並)。 master
分支中,可以將分支重新建立到master
然后拉入請求。 發布要難得多。
我建議研究一下Linux,Git,Node等開源項目如何維護其存儲庫,並將其納入考慮范圍。
如果branchX
(例如branch1
)適合您自己,則可以使用所需的方式:合並前branch1
。
如果branchX
(例如branch1
)適用於所有開發人員,則最好不要使用預設的解決方案,這是主要缺點,因為您說其他開發人員會感到困惑,並且他們可能再也找不到自己的更改了。
有一種可以使用的方法: git merge branch1 --squash
。 假設您的git log是:
branch1 C2---C3---C6---C9---
/
master C0---C1---C4---C5---C7---C8
執行git merge branch1 --squash
,git日志將如下所示:
branch1 C2---C3---C6---C9
/
master C0---C1---C4---C5---C7---C8---M1
這使您的master
分支看起來更清晰。 而且,如果您要開發新功能,則可以直接從master
檢出功能分支。
順便說一句:我需要更正您在當前工作流程中使用的圖表。 將master
合並到branch1
,圖看起來像
C2---C3---C6---C9---M1 branch1
/ /
C0---C1---C4---C5---C7---C8 master
將branch1
合並到master
,默認情況下沒有要創建的提交M2
,它只是快速向前合並。 branch1
, branch1
和master
都指向M1
提交。
C2---C3---C6---C9---M1 branch1, master
/ /
C0---C1---C4---C5---C7---C8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.