簡體   English   中英

使用git rebase和git merge建立良好的團隊工作流程

[英]Using git rebase and git merge to set up a good team workflow

我知道有很多類似的問題,但是找不到一個好的答案可以幫助我在我工作的公司中提出一個好的解決方案。 我們不是很多開發人員,但是我想提出一個可擴展的工作流。

假設情況(並非如此)

這種情況是最常見的情況:存在一個master分支,它永遠不會收到直接提交。 如果需要執行某些操作,則可以創建feature/personal分支(通常使用長壽的個人分支比使用胖功能的分支更多)。 一旦對所創建的代碼感到滿意,我想將其重新帶回master (與此同時, master又收到了一次提交)。

重要的是要指出, masterbranchX總是被推到遠程。

因此,為了以圖形方式澄清它,我們處於這種情況下(我將使用C進行提交,使用M進行合並):

branch1 C2---C3---C6---C9--- / master C0---C1---C4---C5---C7---C8

目前的工作流程

當前使用的工作流程可以被定義合並升/合並向下 :因為我不希望修復主合並沖突,首先我上合並了 masterbranch1 ,然后我合並向下 branch1master

branch1 C2---C3---C6---C9---M1 / /\\ master C0---C1---C4---C5---C7---C8 M2

這樣做,我解決了分支內部的沖突,然后可以將分支合並到master中。

我個人不喜歡這種解決方案,主要有兩個原因:

  • 它導致一棵非常凌亂的歷史樹
  • 將父分支合並到子分支的聲音對我來說毫無意義

另一方面,我的同事認為:

  • 即使對於非專業的實習同事也很容易理解
  • 由於您保持不變的歷史記錄(與重新設置不同),它導致的錯誤更少

擬議的解決方案

我提出的是通用且更直接的“合並前變基”工作流。

一旦我想合並branch1master ,第一我變基上,后者是前者,所以我處理我分支的所有沖突; 比我 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 ,它只是快速向前合並。 branch1branch1master都指向M1提交。

       C2---C3---C6---C9---M1  branch1, master
      /                    /
C0---C1---C4---C5---C7---C8 

暫無
暫無

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

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