让git分支“变老”有什么害处吗?

时间:2011-10-31 20:40:13

标签: git git-branch

所以我听说过使用Git的branch-per-feature工作流程,我也读到了this could be a bad idea的原因。

我真正的问题是 - 如果我正在开发一个小功能(如简单的正则表达式时间解析器),在将此分支合并回主干后,该分支会发生什么(或应该发生什么)?它只是坐在那里吗?因为我为那个非常具体的功能创建了它,所以我想不出有一个原因我必须回去使用分支。我应该以某种方式将这个分支标记为已经不存在,或者我只是继续前进而忘记它?

由于

5 个答案:

答案 0 :(得分:13)

当我使用功能分支时,我喜欢保留在合并后在分支中开发功能的事实。这使得浏览历史变得更加容易。它按功能或错误对更改进行分组,使您更容易了解最重要的事情:为什么要进行更改。

这就是为什么当我合并时,我故意禁用git merge --no-ff的快进。这保留了历史中分支的结构。然后我可以自由删除分支标签(git branch -d branch_name),合并点包含分支名称,并清理分支集。

相反,在分支机构上工作时,我更喜欢重新定义上游分支。这使得分支的历史保持良好和干净,没有大量的上游合并噪声和冲突解决方案。我通常会在合并之前对上游进行rebase,以使集成工作更容易(作为分支作者,我可以修复冲突和破坏测试)以及生成的合并清理器。

这种方法保留了分支的历史,同时防止不再发展旧分支堵塞事物。它使用gitk或GitX可视化历史记录非常有用。

我同意您链接的文章中的基本要点,因为您获得越来越多的大型功能分支同时处理冲突和集成问题的可能性越来越大。使它们如此有用的隔离成为一种负担。其中一个解决方案是没有大型的旧功能分支。如果您可以将功能分支破碎成可以完成和集成的较小部分,那么您可以避免此问题。这通常有许多其他原因,例如必须审查代码的糟糕的口水。

如果可以将功能分支连续集成到主线中,则功能分支必须具有有用的,可工作的,经过测试的,记录的工作。如果它有,那么那些可以切成他们自己的分支。

我坦率地承认我可能会对此进行过多阅读,但文章中可能存在的缺陷之一是分支以命名而不是功能 。这意味着每个分支都是“Jim正在处理的”,而不是“添加蓝色小部件”。它意味着许多发展问题......

  • 个人或团队拥有的功能和分支
  • 分支不适用于离散功能
    • 相反,分支机构是个人游乐场
    • 没有明确的功能,可以继续使用
  • 开发是在孤岛中完成的
    • 个人不经常互相交谈
    • 个人不在分支机构合作
    • 个人在整合之前不会谈论他们的变化

这很多不是技术问题,而是社会问题。其中大部分都可以通过强大使用与版本控制密切相关的优秀问题跟踪器来解决,例如Github。主要变化是:

  • 分支应该用于定义的功能
  • 开发人员应该在关闭之前报告问题并做一大堆工作
  • 没有人“拥有”一个功能(虽然他们可能对此负责)

不幸的是,大多数项目的错误跟踪政策都不鼓励第二个问题。在报告错误之前准备补丁的冲动非常强烈。

良好的分支机构管理需要良好的社交能力,这是一个良好的问题跟踪器,具有强大的版本控制集成和热情的政策。

答案 1 :(得分:3)

删除它,如果你不再需要它。如果您稍后意识到,您再次需要它,则可以再次创建它。而且因为您将更改合并回“主干”,所以没有任何内容丢失。

答案 2 :(得分:3)

关于Git和分支的好处是每个分支本质上都是指向提交的指针。一旦合并了分支,用于构成分支的提交现在就成为主历史的一个组成部分。

                                  your branch
                                    main
                                      |
  (main)  -------x----x----x-x---x----x
                  \                  /
  (your branch)    \--x--x-x--x-x---/

此时,如果您使用“git branch -d”删除分支,则会留下:

                                    main
                                      |
  (main)  -------x----x----x-x---x----x
                  \                  /
  (your branch)    \--x--x-x--x-x---/

正如您所看到的,您分支机构的提交仍然是安全的。所有改变的是已经删除了名为“你的分支”的指针。

注意,如果你没有合并到main,那么“git branch -d”就会失败。如果您在此时强制删除它,则会留下:

                                  main
                                    |
  (main)  -------x----x----x-x---x--x
                  \
  (your branch)    \--x--x-x--x-x

由于此阶段没有分支指针,提交是“悬空”,下次git进行垃圾回收时将被删除。

长话短说,如果你的分支已合并,你可以而且应该删除它。如果它尚未合并,则不应该。

答案 3 :(得分:1)

需要考虑两件事:

  1. 也许你应该习惯在登陆之前将这些分支重新定位到主人(或任何地方)的尖端。这样,它们就像KingCrush建议的那样严格冗余,如果你发现问题,可以销毁以便以后重新创建。

  2. 使用重命名标记分支您不确定是否需要再次使用特定前缀,这样当您知道不在寻找分支时,您可以在分支列表中快速扫描它们过时的功能分支。

  3. 您可以使用这些技术的某种混合物,例如总是rebase,然后将branch foo重命名为landed-foo,然后在设置的间隔(例如,一个版本或30天)后删除landed-foo分支。

    请注意,如果你不进行rebase(并对rebased版本运行任何测试),你无法确定它所发现的bug实际上是在开发的代码中,而不是由于在开发之后将其合并,因此在这种情况下,您可能希望将分支保留一段时间。对于侵入式/非常大的更改,这种情况会更频繁地发生,而不像您的问题场景。

答案 4 :(得分:0)

我能看到的唯一原因是,你想保留它是:

  • 您想了解上次工作的历史记录。
  • 你可以推断出它的开发时间。