命名git分支的常用做法有哪些示例?

几个月来,我一直在使用一个与我的小组的CVS存储库交互的本地git存储库。我已经创建了几乎神经质的分支数量,谢天谢地,其中大部分都合并回了我的主干。但是命名开始成为一个问题。如果我有一个任务很容易用简单的标签命名,但我分三个阶段完成它,每个阶段都包括自己的分支和合并情况,那么我每次都可以重复分支名称,但这会使历史有点混乱。如果我在名称中更具体,为每个阶段提供单独的描述,那么分支名称开始变得冗长而笨重。

我确实通过这里的旧线程了解到,我可以开始在名称中使用/来命名分支,即主题/任务或类似的东西。我可能会开始这样做,看看它是否有助于保持更好的组织。

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

编辑:实际上没有人提出任何命名约定。当我处理完分支时,我会删除它们。由于管理层不断调整我的优先级,我碰巧有几个分支。:)作为一个为什么我在一个任务上可能需要多个分支的例子,假设我需要将任务中的第一个离散里程碑提交到组的CVS存储库。那时,由于我与CVS的交互不完美,我会执行该提交,然后杀死该分支。(如果我尝试在那一点上继续使用相同的分支,我已经看到了太多与CVS交互的怪异。)

702390 次浏览

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

我没有尝试使用分支名称来解释分支的含义,而是在该分支的第一次提交中以“分支:”开始提交消息的主题行,如果主题没有给我足够的空间,则在消息正文中包含进一步的解释。

我使用的分支名称纯粹是在处理主题分支时引用主题分支的句柄。一旦主题分支的工作结束,我就会摆脱分支名称,有时会标记提交以供以后参考。

这也使得git branch的输出更有用:它只列出了长期分支和活动主题分支,而不是所有分支。

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

如果您使用bug跟踪系统,您可以使用bug编号作为分支名称的一部分。这将使分支名称保持唯一,您可以在它们前面加上一两个简短的描述性单词,以保持它们的可读性,例如"ResizeWindow-43523"。这也有助于在清理分支时使事情变得更容易,因为您可以查找相关的bug。这就是我通常如何命名我的分支。

由于这些分支最终会合并回master,因此在合并后删除它们应该是安全的。除非您与--squash合并,否则分支的整个历史记录在您需要时仍然存在。

Farktronix的建议之后,我们一直在Mercurial中使用类似的Jira票证编号,我计划继续在git分支中使用它们。但我认为票证编号本身可能足够独特。虽然正如Farktronix所指出的那样,在分支名称中包含一个描述性单词可能会有所帮助,但如果你足够频繁地在分支之间切换,你可能不想输入那么多。然后,如果你需要知道分支名称,如果你不知道,请在Jira中查找票证中的相关关键字。此外,你应该在每条注释中包含票证编号。

如果您的分支代表一个版本,那么常见的约定似乎是使用x. x. x(例如:“1.0.0”)格式作为分支名称,使用vx. x. x(例如“v1.0.0”)作为标记名称(以避免冲突)。另请参阅:是-有-一个-标准-命名-约定-为-g it-标签

Vincent Driessen的一个成功的Git分支模型有很好的建议。下面是一张图片。如果这个分支模型吸引你,请考虑流扩展到git。其他人有评论流

Driessen的模型包括

  • 主分支,仅用于发布。典型名称master

  • 该分支的“开发”分支。这是用于大多数主线工作的分支。通常命名为develop

  • 开发分支之外的多个功能分支。基于功能名称命名。这些将合并回开发分支,而不是主分支或发布分支。

  • 发布分支用于保存候选版本,只有bug修复,没有新功能。典型名称rc1.1

修补程序是来自master的更改的短期分支,将在不涉及开发分支的情况下进入master。

在此处输入图片描述

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

分支命名约定

  1. 在分支名称的开头使用分组标记(单词)。
  2. 定义并使用简短的线索令牌以对您的工作流程有意义的方式区分分支。
  3. 使用斜杠分隔分支名称的各个部分。
  4. 不要使用裸数字作为前导部分。
  5. 避免使用长寿命分支的长描述性名称。

组代币

在分支名称前使用“分组”标记。

group1/foogroup2/foogroup1/bargroup2/bargroup3/bargroup1/baz

这些组可以根据你的工作流程命名。我喜欢用简短的名词来形容我的组。请继续阅读以获得更清晰的信息。

短的定义明确的令牌

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

wip       Works in progress; stuff I know won't be finished soonfeat      Feature I'm adding or expandingbug       Bug fix or experimentjunk      Throwaway branch created to experiment

这些令牌中的每一个都可用于告诉您每个分支属于工作流的哪个部分。

听起来你有多个分支用于不同的变更周期。我不知道你的周期是什么,但让我们假设它们是“新”、“测试”和“验证”。你可以用这些标签的缩写版本命名你的分支,总是拼写相同,既可以对它们进行分组,也可以提醒你处于哪个阶段。

new/frabnotznew/foonew/bartest/footest/frabnotzver/foo

您可以快速判断哪些分支已经到达每个不同的阶段,并且可以使用Git的模式匹配选项轻松地将它们组合在一起。

$ git branch --list "test/*"test/footest/frabnotz
$ git branch --list "*/foo"new/footest/foover/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键来搜索具有不同子部件的分支。然后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/bar”的分支。这可能会让新用户感到困惑。

不要使用简单的数字

不要使用裸数字(或十六进制数字)作为分支命名方案的一部分。在引用名称的制表符扩展中,git可能会决定一个数字是sha-1的一部分,而不是分支名称。例如,我的问题跟踪器用十进制数字命名错误。我将我相关的分支命名为CRnnnnn而不仅仅是nnnnn以避免混淆。

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

如果我尝试只扩展15032,git会不确定我是想搜索SHA-1的名称还是分支名称,我的选择会受到一些限制。

避免使用长描述性名称

当您查看分支列表时,长分支名称非常有用。但在查看装饰的单行日志时,它可能会妨碍,因为分支名称会占用大部分单行并缩写日志的可见部分。

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

我根据我使用的工具混合和匹配了我见过的不同方案。
所以我的完整分支名称是:

名称/功能/问题-跟踪器-编号/简短-描述

这将转化为:

迈克/博客/RSS I-12/徽标-修复

这些部分由正斜杠分隔,因为这些部分在SourceTree中被解释为文件夹,以便于组织。我们使用Jira进行问题跟踪,因此包含该数字可以更轻松地在系统中查找。包含该数字还可以在尝试提交拉取请求时尝试在Github中查找该问题时进行搜索。

请注意,如提交e703d7提交b6c2a0d(2014年3月)所示,现在是Git 2.0的一部分,您将找到另一个命名约定(您可以应用于分支)。

“当你需要使用空格时,使用破折号”是一种奇怪的说法,表示你不能使用空格。因为命令行描述更常见的是使用虚线多词,所以您甚至不想在这些地方使用空格。

分支名称不能有空格(参见“分支名称中哪些字符是非法的?”和#0手册页)。

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