git - Git分支命名最佳实践

  显示原文与译文双语对照的内容

我已经使用了一个本地的git仓库与我的组仓库的CVS交互几个月了,现在。 我做了一个近乎神经质的分支,大多数都是合并到我的主干上。 但是命名开始成为一个问题。 如果我有一个任务容易命名用一个简单的标签,但我在三个阶段完成,每个包括自己的分支和合并的情况,那么我可以每次重复分支的名字,但使历史有点混乱。 如果我在名称中得到更具体的信息,每个阶段都有一个单独的描述,那么分支名称就会开始变得冗长和笨拙。

我在这里学习过旧的线程,我可以用名称,换句话说,主题/任务或者类似的方式来开始命名分支。 我可以开始这样做,看看它是否能帮助你更好的组织。

什么是命名git分支的最佳实践?

编辑:没有人真正建议任何命名约定。 当我完成后,我会删除分支。 由于管理不断调整我的优先级,我正好有几个问题。 :) 作为一个例子,我在一个任务中可能需要多个分支,假设我需要将任务中的第一个离散里程碑提交给组仓库的CVS 。 在那一点上,由于我与CVS的不完美交互,我将执行提交,然后杀死那个分支。 ( 如果我试图在那个时候继续使用相同的分支,我看到了太多奇怪的怪异现象。)

时间:

下面是我使用的一些分支命名约定以及它们的原因

分支命名约定

  1. 在分支名称的开头使用分组标记( 单词) 。
  2. 定义和使用短引线标记,以区分对你的工作流程有意义的分支。
  3. 使用斜线分隔分支名的各个部分。
  4. 不要将数字用作前导部件。
  5. 避免long-lived分支的描述性名称过长。

组标记

在分支名称前面使用"分组"标记。


group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

这些组可以命名为与你的工作流相匹配。 我喜欢用短名词做我的。 阅读以获得更清晰的信息。

的简短定义的令牌

选择简短的标记,这样它们不会给每个分支名称添加太多的噪音。 我使用这些:


wip Works in progress; stuff I know won't be finished soon
feat Feature I'm adding or expanding
bug Bug fix or experiment
junk Throwaway branch created to experiment

这些令牌中的每一个都可以用来告诉你每个分支所属的工作流部分。

听起来你在不同的循环中有多个分支。 我不知道你的循环是什么,但我们假设它们是'新建','测试'和'已经验证'。 你可以用这些标记的缩写版本命名分支,总是用相同的方式拼写它们,并提醒你你所在的阶段。


new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

你可以快速判断哪些分支已经到达了每个不同的阶段,你可以使用git的模式匹配选项轻松组合它们。


$ git branch --list"test/*"
test/foo
test/frabnotz

$ git branch --list"*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

使用斜线分隔部分

你可以在分支名称中使用最喜欢的分隔符,但我觉得斜线是最灵活的。 你可能更喜欢使用破折号或者圆点。 但是当你从一个远程的远程文件推送或者获取时,斜线允许你做一些分支重命名。


$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

对于我来说,在我的shell中,斜杠也能更好地扩展( 命令完成) 。 这样配置的方式我可以通过输入部分的第一个字符并按TAB键来搜索不同的sub-parts分支。 然后Zsh给我一个与我输入的令牌部分匹配的分支列表。 这适用于前面的令牌以及嵌入的符号。


$ git checkout new<TAB>
Menu: new/frabnotz new/foo new/bar


$ git checkout foo<TAB>
Menu: new/foo test/foo ver/foo

( Zshell是非常可以配置的命令完成,我也可以配置它来处理破折号,下划线或者点同样的方式。 但我选择不。

它还允许你在许多git命令中搜索分支,例如:


git branch --list"feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

警告:当Slipp指出注释时,斜线会引起问题。 因为分支是作为路径实现的,所以不能有名为"foo"的分支和另一个名为"foo/栏"的分支。 这会让新用户感到困惑。

不使用裸数字

不要使用bare数字( 或者十六进制数字) of作为分支命名方案的一部分。 在引用名称的tab-expansion内,git可以决定数字是sha-1的一部分,而不是分支名。 例如我的问题跟踪程序名称 Bug 带有十进制数字。 我将相关分支命名为CRnnnnn而不是 nnnnn,以避免混淆。


$ git checkout CR15032<TAB>
Menu: fix/CR15032 test/CR15032

如果我试图扩展 15032,git将不确定我是否要搜索sha-1分支名称,以及我的选择会受到一定的限制。

避免长描述性名称

当你查看分支列表时,长分支名称非常有用。 但它能够进去的时候看中的装饰one-line日志,如分支名称的方式能击败的大多数单线或者缩写的可视化部分的日志。

另一方面,长分支名称在"合并提交"中更有帮助,如果你不习惯于手工重写的话。 默认合并提交消息是 Merge branch'branch-name' 。 你可能会发现将合并消息显示为 Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted' 而不是 Merge branch'fix/CR15032'

一个成功的Git分支模型 Driessen有很好的建议。 如果这个分支模型吸引你考虑 的流扩展。 其他的有注释了流

我个人的偏好是在完成主题分支后删除分支名称。

而不是试图使用分支名称解释分支的含义,我开始提交消息的主题在第一次提交与"分支:"分支,包括进一步解释消息的身体如果主题不给我足够的空间。

使用中的分支名称纯粹是指在处理主题分支时引用主题分支的句柄。 一旦这个话题分支上工作已经结束,我摆脱分支的名字,有时标签提交供以后参考。

这使得 git branch的输出更加有用: 它只列出long-lived分支和活跃主题分支,而不是所有分支。

为什么每个任务需要三个分支/合并? 你能详细解释一下?

如果你使用 Bug 跟踪系统,你可以使用 Bug 号码作为分支名称的一部分。 这将使分支名称保持唯一,你可以用简短和描述性的词对它们进行前缀,以使它们保持可读性,例如 "ResizeWindow-43523" 。 当你去清理分支时,它也有助于简化事情,因为你可以查找相关的Bug 。 这就是我通常命名分支的方式。

由于这些分支最终被合并回主控形状,所以在合并后你应该安全地删除它们。 除非你要与 --squash 合并,否则如果你需要,分支的整个历史仍然存在。

注意,见提交e703d7提交 b6c2a0d ( 2014年三月), 现在git 2.0的一部分,你会发现另一个命名约定( 你可以应用到分支) 。

"当你需要使用空格时,使用破折号是一种奇怪的说法,你不能使用空格。
因为 命令行 描述更常用于使用 dashed-multi-words,所以你甚至不希望在这些地方使用空格。

分支名称不能有空格( 查看",在分支名称中字符是非法的? "和 git check-ref-format 手册页) 。

因此,对于每个由multi-word表达式表示的分支名称,使用'-'( 破折号) 作为分隔符是一个好主意。

...