Git工作stream程:重新发布已发布/共享分支

我们工作的团队热情地采用了rebase工作stream程,但是我们可能会有一点点的失望,这就是这个问题的关键:你是法官。

现在使用pull –rebase对我来说是不容易的。 但是,我们也有大量的function分支,多人工作。 定期地,我们要引入主人正在发生的变化。 传统的智慧会让我们合并,因为它是一个共享的分支。 但是,在我们反思的过程中,我们决定重新devise这些分支机构。 当然这需要大家的合作。 工作stream程如下所示:

1)翻新人员与每个人协调,以确保他们都被检入并推送到function部门,然后要求他们在该部门不再做任何工作,直到他们全部清楚。

2)rebaser将特性分支重定位到master,删除远程特性分支(git push origin:feature),然后推送新的重新发布的特性分支(git push origin feature)

3)rebaser每个人都可以获取更新他们的特性分支,然后删除他们的本地特性分支(git branch -D feature),然后创build一个新的局部特性分支来跟踪远程特性分支。 大家然后得到全部清楚。

这个工作stream程正在工作,部分原因是我们是一个小团队,工作中断很小。 但是,我担心我们正在学习可怜的Git习惯(重新分配一个共享的分支),或者工作stream程不能很好地扩展。

好的,我们的资料库历史很可爱。

你怎么看,Git大师? 我们是在玩火,还是在摇摆合理的工作stream程?

更新

我原来问这个问题已经两年了,从那以后我的工作stream程就改变了。 我们还是经常做git pull --rebase ,所以没有改变。 这是常识,它可以防止所有不美观,迷惑的迷你合并。 (我们主要保持同步,所以git pull --rebase成本git pull --rebase )。

不过,除此之外,偶尔英勇的纠正错误的行动,我们已经过了我们的蜕变疯狂。 合并大部分时间是合理的。 然而,肆意合并是有问题的,并且对两年前我所关心的混乱,混乱的历史做出了贡献。

我们的解决scheme有几个组件

  • 主分支是“原始的”。 主题分支被合并, 一旦他们这样做,主题分支就退休了 。 换句话说,将主题分支合并表示该工作已经准备好进行生产,现在是主分支的一部分。 看看我们的版本历史,很清楚发生了什么事情:主题分支合并到主,这就是。

  • 我们在必要时使用一次性整合分支。 例如,如果我们有主题分支A,B和C,并且他们都不准备集成到主控中,但是我们需要一起testing它们,我们只创build一个QA分支(通常是主分支),然后合并A,B和C英寸在某些时候,QA分支被删除或重新使用。 重点是它并不打算以任何方式永久存在,并且它没有与主分支相同的限制(您可以根据需要多次合并您的主题分支)。 如果历史过于混乱,您可以删除QA分支并重新开始(我们发现这种方法非常自然)。

  • 合并时, 总是使用git merge --no-ff 。 这与我们两年前对“线性犯罪历史”的迷恋有如此巨大的转变,值得评论。 既然我们已经放松了线性提交历史,并且看到合并是好的和有用的,我们已经开始依赖主题分支作为主分支的实际分支 ,而不仅仅是一系列最终与主分支合并的提交。 git merge --no-ff确保总是有合并提交,即使没有必要。

  • 我们对于提交消息和分支有一个很好理解的约定,更重要的是, 它交叉引用了我们的问题跟踪系统 。 我们的问题跟踪系统使用数字问题编号,对于任何function(或缺陷),我们都有一个问题编号(例如1234)。 如果你正在处理这个问题,你会创build一个分支_1234并开始每个提交信息"_1234: doing blah blah" 。 这似乎有些迷恋,但对我们来说,确实有效,大大减less了/消除了混乱。

  • 使用git包装来鼓励工作stream程粘连。 这是我们目前正在进行的工作,但是我们意识到完全有必要防止简单易懂的错误,比如分离错误的东西(当开发者创build了一次性的主题分支时,我们最近发生了一场彻底的灾难QA分支:该主题分支被批准上线,并入…并且一批未被批准上线的更换者被吸入)。 我们的git包装器需要确认,只要你做一些不寻常的事情(比如创build一个除了master以外的分支,创build一个不叫做_NNNN的分支,做一个不以_NNNN开头的提交等等)。 偶尔,我们确实需要做这些事情,所以包装并不妨碍它,但它确实使人们不小心做了不应该做的事情。

这听起来像是太复杂了,不能很好地扩展。 这可能是一个简单的事情,只是定期合并到你的function分支,然后当它合并回到主, 然后你可以先做rebase(去除中间不必要的合并),并合并回到主(大概用--no-ff来产生合并提交)。 这只需要一个人处理rebase,他们不需要进行任何协调,因为没有人需要强制更新任何东西(因为大概是在合并后将被删除,而不是保留在一个重写的状态)。 您也可以决定完全跳过rebase,只保留中间合并,这将更准确地反映您的开发工作stream程,并消除生成不实际构build的提交的风险。