2010-04-12 184 views
342

我们公司目前正在使用一个简单的中继/发布/修补程序分支模型,并希望建议哪些分支模型最适合您的公司或开发过程。什么Git分支模型适合你?

  1. 工作流/分支模型

    下面是这个我已经看到了三个主要的描述,但它们部分相互矛盾或不远远不够理清后续问题,我们已经遇到(如下所述)。因此,我们的团队迄今默认不是很好的解决方案。你在做更好的事情吗?

  2. 合并VS垫底(纠结VS连续历史)

    如若一个pull --rebase或合并回主线,直到等待你任务完成?我个人倾向于合并,因为这保留了一个任务开始和结束的基础的视觉插图,我甚至更喜欢merge --no-ff这个目的。但是它也有其他的缺点。还有很多没有意识到合并的有用特性 - 它不是commutative(将主题分支合并到主并不意味着将主合并到主题分支中)。

  3. 我要寻找一个自然的工作流程

    有时错误发生,因为我们的程序并不捕获与简单的规则具体情况。例如,早期版本所需的修补程序当然应该基于下游,以便可以将上游合并到所有必需的分支中(这些术语的用法是否足够清楚?)。然而,在开发人员意识到它应该放在更下游之前,修正会让它进入主服务器,并且如果这已经被推动(甚至更糟糕,合并或基于它的东西),那么剩下的选项是樱桃采摘,其相关的风险。你使用了哪些简单的规则? 此外,在这包括一个主题分支的尴尬必然排除其他主题分支(假设它们从共同基线分支)。开发商不希望完成一个功能启动另一个感觉像他们刚刚写的代码是不存在了

  4. 如何避免创建合并(因摘樱桃)的冲突?

    什么似乎是一个确定的方式来创建合并冲突是樱桃选择分支之间,他们不能再合并?在任何一个分支中应用相同的提交还原(如何做到这一点?)可能会解决这种情况?这是我不敢推动大部分基于合并的工作流的原因之一。

  5. 如何分解成局部分支?

    我们意识到,从主题分支组装完成的集成将是非常棒的,但是我们的开发人员经常工作并没有明确定义(有时就像“扯开”一样简单),并且如果某些代码已经进入“misc”这个话题,根据上面的问题,它不能再被带出去吗?你如何处理定义/批准/毕业/发布你的主题分支?

  6. 适当的程序,如代码审查和毕业当然是可爱的。

    但是,我们根本无法将事情解决得足以解决这个问题 - 任何建议? 集成分支机构,插图?

下面是相关问题的列表:(!感谢this PDF)

还检查了什么塑料SCM上task driven development写道,如果塑料是不是你的选择,学习nvie's branching model和他supporting scripts

+1

哈,谢谢,其实......我其实已经阅读了大部分......东西:-)。这是我知道的 - 不是为了解决平庸的解决方案,而是继续寻找完美的东西。通常这是一个错误,但在这种情况下,很多问题都是危险的,而且手头的解决方案太麻烦或者太差,我需要继续寻找。所以我决定列出所有与它有关的问题。 – 2010-04-12 11:47:05

+0

Plastic SCM博客将他们的意见投入到讨论中,至少有深刻的见解:http://codicesoftware.blogspot.com/2010/08/branch-per-task-workflow-explained.html – 2010-12-05 16:51:10

+1

你必须小心使用“合并 - 无ff“,检查这个一些注意事项http://sandofsky.com/blog/git-workflow.html – Doppelganger 2012-08-21 15:01:39

回答

80

最令人不安的特点的新开发者DVCS需要认识到的是关于publication process

  • 你可以导入(读取/拉)你需要
  • 你可以发布(推送)任何任何远程回购(裸)回购你想

从这一点,你可以尊重一些原则,让你更轻松的问题:

  • 只有变基的一个分支,如果它没有被按下(自上次rebase未按下)
  • 只推到裸露的回购协议(强制性的,因为Git1.7)
  • 遵循Linus's advices on rebase and merges

现在:

工作流/分支型号

每个工作流程是那里support a release management process,这是专为每个项目。
我可以添加到你提到的工作流程中:每个开发人员不应该创建一个功能分支,而只需要一个“当前开发人员”分支,因为事实是:开发人员通常不知道他/她的分支会产生什么:一个特征,几个特征(因为它最终变得太复杂了),没有(因为未准备好及时发布),另一个特征(因为原始的特征“变形”),...

只有一个特征“集成商”应该在“中央”回购协议上建立官方特色分支,然后由开发人员提取这些官方分支以重新整合他们适合该功能的部分工作。

合并VS垫底(纠结VS连续史)

我喜欢我的回答你提到( “Workflow description for git usage for in-house development”)

我要寻找一个自然的工作流程

为修复程序,它可以帮助将每个修补程序与来自错误跟踪的故障单关联起来,这有助于开发人员记住在哪里(即在哪个分支上,即专门的“修复”分支)他/她应该进行此类修改。
然后钩子可以帮助保护中央仓库免受未经验证的错误修复或从不应该推送的分支推送。 (这里没有具体的解决方案,所有这些都需要根据您的环境进行调整)

如何避免创建合并冲突(由于樱桃选择)?

Jakub Narębskihis answer中所述,樱桃采摘应该保留在需要它的罕见情况下。
如果你的设置涉及很多樱桃采摘(即“这不是罕见的”),那么有些东西是关闭的。

会在回复中应用相同的提交(如何执行此操作?)

git revert应该注意的是,但效果不理想。

如何分解成局部分支?

只要是尚未推随处可见,开发商应该重组其提交(一旦他/她终于看到了发展需要一个更明确和稳定的形状)的历史进入了一个分支:

    如果(通过明确识别的特征之一)需要
  • 一套连贯的一个分支中提交的
  • 几个分支(见Trimming Git Checkins

适当的程序,如代码审查和毕业?

集成分支(在专用集成)回购可以帮助开发者:

  • 变基上远程集成分支之上他/她的发展(拉--rebase)
  • 本地解决
  • 推动发展到回购
  • 检查与不导致混乱积分;)
+0

谢谢VonC,我会尽快考虑您的答案! – 2010-04-12 12:05:14

+0

@UncleCJ:正如你所看到的,这不完全是对你的“最终问题”的最终答案;) – VonC 2010-04-12 12:06:25

+0

我明白了,我也有一种很好的讽刺感,没关系;-) – 2010-04-12 12:26:19

19

我认为,我可能错了,git最容易被误解的其中一件事是它的分布式特性。这就说明你可以工作的方式颠覆了你的想法,尽管你可以模仿SVN的行为。这个问题几乎是任何工作流程都会做的,这很好,但也有误导性。

如果我对内核开发有所了解(我将专注于此),那么每个人都有自己的用于开发内核的git存储库。有一个版本库,linux-2.6.git,由Torvalds负责,它充当版本库。如果他们希望开始针对“发布”分支开发功能,那么人们会从这里克隆。

其他存储库做了一些发展。这个想法是从linux-2.6进行克隆,根据需要多次分支出来,直到你有一个可用的“新”特性为止。然后,当这些准备就绪时,您可以将其提供给被认为可信的人,他们会将这个分支从您的存储库中提取出来并合并到主流中。在linux内核中,这种情况发生在几个级别(可信中尉),直到达到linux-2.6.git,此时它成为“内核”。

现在,这里是令人困惑的地方。分支名称根本不需要在存储库之间保持一致。所以我可以git pull origin master:vanilla-code并从origin的主人处获得一个分支,位于我的存储库中名为vanilla-code的分支中。提供我知道发生了什么,它确实无关紧要 - 它的分布意义在于,所有存储库都是对等的,而不仅仅是像SVN这样的多台计算机共享。

因此,在考虑这一切:

  1. 我认为它是由每个程序员他们是如何做到的分支。所有你需要的是一个管理版本等的中央资源库。树干可以是head。发布可能是标签或分支,修补程序本身可能是分支。事实上,我可能会以分支形式发布,因此您可以继续修补它们。
  2. 我会合并,而不是rebase。如果你拿一个仓库,克隆它,分支并做一些设备,然后从你的origin中取出,你应该在你的仓库中创建另一个分支,并将最新的master合并到yourbranch中,以便其他人可以用你的修改尽可能少的努力。根据我的经验,很少有必要真正重新设计底板。
  3. 我认为这是理解Git工作方式以及它可以做什么的一个例子。它需要一段时间和很多良好的沟通 - 当我开始与其他开发人员一起使用git时,我才真正开始理解发生了什么,甚至现在,我也不知道有些事情。
  4. 合并冲突很有用。我知道,我知道,你希望这一切都可以工作,但事实是代码的变化,你需要将结果合并成有用的东西。事实上,合并冲突只是更多的编程。我从来没有找到一个简单的解释来处理它们,所以这里是:注意合并冲突的文件,去改变他们应该是的,git add .,然后git commit
  5. 但是很适合。正如我所说过的,每个用户的git存储库都是他们自己可以使用的,分支名称不需要是相同的。例如,如果您有临时存储库,则可以强制实施命名架构,但不需要为每个开发人员提供,只能在发行版本库中使用。
  6. 这是合并阶段。当你考虑代码审查/通过质量测试时,你只能合并到发布分支等。

我希望有所帮助。我意识到VonC刚发布了一个非常类似的解释......我输入的速度不够快!

编辑如何在商业环境中使用git,因为这似乎是有关从评论OP一些进一步的想法:

  • 的发行库,我们把它叫做product.git,是访问由一些负责实际照顾产品本身的高级程序员/技术人员负责。它们类似于维护者在OSS中的角色。
  • 这些程序员可能也部分领导新版本的开发,因此他们也可能自己编写代码并维护varios存储库。他们可能会管理登台存储库以获取真正的新功能,他们也可能拥有自己的存储库。
  • 下面是负责开发个别位的程序员。例如,有人可能会负责UI工作。因此他们管理UI.git存储库。
  • 下面是实际开发功能的日常工作的程序员。

那么会发生什么?那么,每个人从“上游”来源即释放库(它也可能包含前一天开发的最新材料)开始每天都会拉。每个人都直接这样做。这将在他们的存储库中的一个分支上,可能被称为“主”,或者如果你叫我“最新”。程序员然后会做一些工作。这项工作可能是他们不确定的事情,所以他们做一个分支,做这项工作。如果不起作用,他们可以删除分支并返回。如果是这样,他们将不得不合并到他们目前正在从事的主要分支中。我们会说这是一个在latest-ui上工作的UI程序员,所以他做了git checkout latest-ui,然后是git merge abc-ui-mywhizzynewfeature。然后他告诉他的技术主管(UI领导),嘿,我已经完成了这样的任务,从我身上拉下来。所以用户界面的领导确实是git pull user-repo lastest-ui:lastest-ui-suchafeature-abc。 UI领导然后在该分支上查看它,并且说,实际上,这非常好,我将它合并到ui-latest。然后,他可能会告诉他下面的所有人,从他的ui-latest分支或他们提供给他们的任何名字中解脱出来,所以这个功能会被开发者探索。如果团队很高兴,UI主管可能会要求测试主管从他身上撤下并合并更改。这会传播给每个测试它的人(变化的下游),并提交错误报告等。最后,如果该功能通过测试等,最重要的技术线索之一可能会将其合并到当前的程序工作副本中,此时所有的改变然后传播回去。等等。

它不是一种“传统”的工作方式,它被设计为“同行驱动”而不是像SVN/CVS那样的“分层”。实质上,每个人都有提交权限,但只能在本地访问。它可以访问存储库以及将您指定为允许使用层次结构的发行版回放的存储库。

+0

+1,用于“分布式”方面的澄清。 – VonC 2010-04-12 12:19:22

+0

非常感谢您的广泛答复(和投票),我会再读几遍,以便将有用的信息从中抽出。但是,我们是一家公司,而不是开源软件开发委员会;-),我必须帮助开发人员制定更明确的指导方针,而不是“在自己的存储库中随意摆弄”。让我们看看这篇文章的领导地位,我感觉良好的势头,继续前进! – 2010-04-12 12:41:19

+0

@VonC谢谢。 @UncleCJ是真的,但你确实有发布经理等。任何有权访问存储库的人都可以做这些事情。至于发展,为什么不让开发者在合理的范围内自由分支?假如你有一些同意合并的协议,并且你的中央资源库被命名为你喜欢的,那么就没有问题了。话虽如此,一个通用的命名模式并不是一个坏主意。我倾向于为个人分支和分支版本使用首字母缩写版本功能子分支。 – 2010-04-12 13:07:53

8

,我已经用,效果很好的模型如下:

A“福地”回购大家推拉/从,基本上是一个客户端 - 服务器拓扑。

没有主分支,因此没有开发人员可以将任何代码推送到“主线”。

所有的进展都发生在主题分支上。我们使用命名空间名称来轻松检测是谁负责它:jn/newFeature或jn/issue-1234

白板上的分支和看板/ Scrum卡之间也存在近似1对1的映射。

要释放分支,它将被推送到祝福的回购库,并将看板卡移动到准备好审查状态。

然后,如果该分支被审查接受,则它是发布的候选者。

当一组接受的分支合并在一起并使用版本号进行标记时,会发布一个版本。

通过将新标签推向祝福回购,新功能有了新的基础。

为避免合并冲突,请恳请开发者更新(合并)未发布的分支到最新的发行标签。

1

就我个人而言,我试着只在master分支中保留发布就绪代码。

当我在一个新功能或错误修复工作时,我在一个分支中执行此操作。我也在分支进行单元测试。如果一切正常,只有这样我才能合并/重新融入主人。

我尝试使用通用分支的命名规则为好,如:

  • bug修正/ recursive_loop
  • bug修正/ sql_timeout
  • 功能/ new_layout
  • 功能/ enhanced_search