我什么时候应该停止致力于掌握新项目?


26

每当一个新项目开始时,通常首先要直接向master提交,直到获得“稳定”的东西,然后再开始在分支中工作才有意义。

至少,这是我通常的做法。有没有办法立即从第二次提交开始分支?以这种方式这样做有意义吗?显然,“ Initial Commit”将始终处于主状态,但是在那之后,我何时才知道是为新功能创建分支的合适时间?

Answers:


23

立即。

关键是主人的政策是什么。通常,使用git时,Master上的分支策略是可构建的稳定版本。有时,Master是“主线”,在合并到Release分支之前,分支是从分支中合并而成的。这是两种不同的角色/策略方法。

人们在项目过程中更改分支机构的角色或策略通常是错误的来源。单独的开发人员更容易将这些更改传达给贡献者,但是试图让十几位程序员都认识到“ Master现在是1.0,请分支功能,而不是所有人都推动它”

我谈到了上面的政策方法。Master的政策是它是可构建的稳定版本。检入微小的增量更改意味着您始终没有可构建的稳定文件。不检查较小的更改会违背“大量的较小(但完整)的检入”,这通常是最好的策略(并且易于分支,鼓励这样做)。

从基于角色的角度来看,您首先是作为主线,发布,维护开发角色的主角色,然后在开发和维护角色转移到分支机构的道路上走了下来。这再次意味着对主服务器允许的内容进行更改,并且可能会使贡献者混淆事物的归属。它也可以(稍微)混淆分支历史,鼓励进行大的提交,这意味着更大和更难理解的合并。

从一开始就简单,一致地确定分支机构的角色和策略。

分支模式中可以看到这种“政策变化分支”。每个分支都有其作用的想法可以在Advanced SCM Branching Strategies中阅读。这两个都是很好的读物。


3
我大部分都同意这一点,但我不只是说buildable,而是说可释放的(稳定的)。母版不应包含仅用于构建的代码,而应包含经过全面测试的代码。您应该能够随时从大师那里撤出,并确信不会有任何严重的缺陷。
Aaronaught 2014年

我完全同意Aaronaught的观点,因为恕我直言,它完全有可能(和最佳实践)以一种从一种可构建状态过渡到另一种状态的过程始终只是很小的增量更改而已,而绝不是一个大的增量。
布朗

1
@MichaelT我已经多次见过'dev'分支,但是之前从未听说过它们是在“早期大师”的背景下进行解释的。我想我会用这个,谢谢。
Droogans 2014年

13

通常在两种情况下,您通常要开始使用分支:

  • 当您或您的团队必须启动一个新功能,而该功能极有可能不被添加到下一个版本(可能是有史以来的第一个版本)时,然后在单独的功能分支中开始开发

  • 当您必须提供针对最新版本的严重错误的修复程序,并且您想要创建一个仅包含这些修复程序但不包含新开发(可能不稳定)功能的新错误修复程序版本时

对于此类决策,从您拥有程序的第一个可编译/可运行版本的角度出发,始终以“新功能”或“错误修正”的方式进行思考是有帮助的。

迈克尔·费瑟斯(Michael Feathers)在他的着名书中列出了进行更改的四个原因,但我通常会在“新功能分支”(针对非功能性功能)下放置“优化资源”,而在“新功能分支”下也多数时候将“改进设计”放在“新功能分支”下,因为IMHO绝不应该在不旨在简化特定功能实现的情况下改进设计。


12

如果你遵循混帐流 -和,坦率地说,我觉得你疯了,如果你使用Git和使用分支模型-那么你应该永远不会承诺master,直到你真正准备好公开发布。

您的第一次提交master应该是一个空的存储库。您的下一个提交master应该是develop分支或临时发布分支的合并提交,并且应该是稳定的,经过测试的,并且可以进行部署(如果是应用程序)或公共分发(如果是库)。

还有其他分支模型的Git,但其中大部分都被从旧的集中式SCM模型得出的,并可能导致在DVCS环境的严重问题。您不必实际使用git-flow扩展,也不必全部使用那些release / hotfix / feature分支,但是裸露的骨骼是developand master,并且不稳定的代码进入了develop


您甚至不需要第一个提交master。请记住,mastergit没什么特别的,它不需要在那里。您可以只拥有一个开发分支,直到要发布为止。
Miles Rout

2
@MilesRout:虽然原则上是正确的,但是除非分支已经存在,否则您无法合并,并且该过程指示对master的每次提交都应为非快进合并。除非我错过了什么,否则初始空提交的唯一替代方法是将master分支到任意develop提交或release分支,这意味着他们将共享同一提交,这是您应该想到的避免。
Aaronaught

1
啊,那确实是一个好点。+1发表和发表评论。
Miles Rout 2014年

1

Thoughtworks的Neal Ford提倡在分支上使用功能切换,以避免出现“合并地狱”的问题。考虑一下这样一种情况,其中两个程序员每天从主分支忠实地合并,其中一个在几周内进行了相当大的更改然后提交。另一个程序员很可能最终会陷入合并地狱。为了避免这个问题,福特建议通过每天只拥有一个分支并对其进行承诺来“使痛苦前进”(众所周知的敏捷属性)。通过功能开关添加了其他功能,这些功能开关会在功能经过全面测试之前将其禁用。

这种方法似乎在实现连续交付的环境中效果最好,因为提交问题会立即被发现。


1

自从这个问题的最后答案已经过去了两年,我认为现在的故事发生了变化。对我来说,答案是“只要您使用源代码控制来跟踪版本”。

详细说来,如今使用源代码控制跟踪项目版本并不总是有效。(例如,使用npm管理依赖关系并使用'^'指定语义版本)在这种情况下,每次构建时项目工件都会更改,而不必每次都对应于源代码更改。为了应对此类新挑战,一些团队选择已经构建了保存在工件控制系统(例如,JFrog Artifactory)中的“工件”以用于跟踪项目版本。

显然,当您已经有工件版本控制时,您不会从GIT分支中提取“生产代码”并将其构建/部署到生产中,而是向工件控制系统咨询以直接运行的版本进行部署。在这种情况下,“释放分支”的概念突然失去了其含义。每当您的团队决定不将git分支与发行版本相关联时,直接提交/推送到master再次成为明智的选择:每当克隆回购协议时,它就会作为默认分支出现,因此自动给出了广为接受且易于传达的语义变化。但是,正如已接受的答案所建议的那样,您可能应该为包括master在内的分支分配角色,并将这些分支仅用于那些特定角色。

最后,我要进一步走一步,建议在只有少数核心提交者的项目中使用master作为开发分支。我的团队就是这种情况,大多数微服务商店也可能如此。提交母版可消除更改流程的沟通,并在处理多个sprint的功能时可能避免“合并”。此外,master分支中的代码甚至不必“工作”,自动化的构建/测试过程将告诉您出了什么问题,并且无论如何,很容易检查git历史记录并联系破坏了构建/测试的作者:-)


0

我将采取一个激进的立场:在每个想法上分支。首先在git分支中便宜,一个分支的主要成本是记住它的用途。我也同意对master的第一个承诺是发布候选。我建议从概念证明分支开始。证明您的概念后,可以将其与空的devel分支合并或重写,具体取决于您的首次尝试有多好。从这一点开始,您会从devel分支出每个错误,功能,抽象等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.