繁体   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