Git合并-压扁还是不压扁?

mep*_*sto 4 git version-control merge

我目前正在努力在相当复杂的开发环境中实施git使用的准则,虽然我认为我的基础设置很好,但是特别有一个问题,我想请教一下是否有可能。这并不是一个纯粹的技术问题,而是更多关于哪个可用选项最合适。

基本上,我倾向于一个与通用的“ git flow”结构(http://nvie.com/posts/a-successful-git-branching-model/)紧密镜像的系统,但有一些例外使其能够适应我们的需求开发环境。简而言之:

  • 一个项目将至少有一个“开发”和“主”分支
  • “主”将包含最新的生产就绪代码
  • “开发”将包含最新的合并代码
  • 其他任何功能都将位于“功能/票证{number}”或“修补程序/票证{number}”分支中
  • 功能分支将由'develop'组成,修补程序分支将由'master'组成
  • 分支机构名称中的号码将始终与我们自己的更改/错误系统中的票证号码相对应
  • 通过构建适当的分支或将其合并为“开发”功能,可以单独测试功能,也可以组合测试功能

到目前为止,它确实帮助我们简化了开发流程并防止了项目之间的冲突。引发争议的一个细节是:我们是否应该使用'--squash'选项将要素/机票分支合并回各自的原点?我有点喜欢它,我喜欢它:

  • 用于开发的git日志保持整洁且可读,所有提交将仅声明原始分支名称(它告诉我们它是修补程序还是功能,以及票证编号)
  • 即使清除了原始功能或修补程序分支,合并之后也不会引起混淆

也许这些原因还不够好,也许有充分的理由在这种情况下不使用'--squash'。有什么想法吗?

jub*_*0bs 6

[S]我们是否应该使用选项将要素/机票分支合并回各自的原点--squash?

这完全取决于您希望回购历史记录的细粒度。请记住,通过提交消息进行的版本控制是代码文档的一种形式。故意压扁不是一个好习惯。修补程序分支可能很好,但实质功能分支却很少。

打个比方,想像一下,如果您要我借给我的《失落的DVD》盒装(例如,您克隆了我的存储库),而我只是给了您包装盒,没有DVD,然后告诉您

在这里,只需阅读有关封底的系列摘要。那应该告诉您有关情节的足够信息。

因此,无论如何,当您想要摆脱不必要的详细步骤或没有足够的独立性的中间步骤时,请压缩提交内容,以免混淆存储库的发展。


(我将在此Twitter线程中进一步讨论此问题。)

  • @Jacksonkr 不。这会破坏 Git 提交之间的连接,因此 Git 无法正确分析历史记录,也无法跟踪哪些分支已被合并。如果您不想查看完整的历史记录,请尝试“git log --merges”或其他命令。挤压会先发制人地永远抛弃你的历史。不要那样做。 (7认同)
  • 这就说得通了。当然,我并不是说盲目地压扁任何一个分支。这具体是关于我们所认为的“票务分支”。我的主要考虑是,它允许我确保进入“主”代码的每个提交都会有一个提交消息,明确指定它的票号。另外,由于我在这里看到的大多数票证通常不需要大量的提交来修复,因此我没有看到太多理由在测试、验证和合并回来后保留每个中间步骤。 (3认同)
  • 最好不要去管历史,而是把精力花在学习如何使用 git log 选项上。这可以让您的团队在有用时利用细节,或在需要时忽略它们。日志工具实际上可以为您进行自动压缩,那么为什么要浪费潜在的好信息呢?有了别名,使用您想要的日志命令就变得很简单。因此,压缩只是丢弃信息,以保持对 git 强大工具的无知。 (3认同)
  • @JordanKanchelov 这仍然会阻止我逆转原子更改。这就是为什么我不喜欢挤压。 (2认同)

Mar*_*ser 5

不要压扁:小的提交特别有用,特别是对于以后使用 跟踪错误git bisect,并且无论如何您都不想更改历史记录。只需使用合并提交 ( git merge --no-ff) 来保持历史记录的有序性。

  • @SámalRasmussen 为什么你认为当有大量中间提交时追踪错误会变得更加困难?当您跟踪导致错误的提交时,如果您的提交较小,您会更准确地知道导致错误的原因,对吧? (5认同)
  • 当存在大量嘈杂无意义的中间提交时,追踪错误变得更加困难而不是容易。您想要做出一个有凝聚力的提交,代表大量的更改,这些更改对于从一个分支到另一个分支的挑选是有意义的。在应用每个单独的提交后,项目应该构建并处于合理的状态。 (4认同)
  • @Sammi:“在应用每个单独的提交后,项目应该构建并处于合理的状态。” 同意。• “当存在大量嘈杂无意义的中间提交时,追踪错误变得更加困难而不是容易。” 我并不是提倡无意义的承诺,但我提倡较小的承诺。由于“git bisect”使用提交作为其粒度单位,因此较小的(有意义的)提交使跟踪错误*更容易*。我同意每次提交都应该是一个有凝聚力的已知良好状态,但有时这意味着只更改 3 行代码。 (4认同)
  • @SámalRasmussen 为什么小提交会缺乏凝聚力?它应该是原子的。是的,在合并回主程序时绝对应该保留它,因为原始提交结构有助于跟踪错误和重建状态。当然,您有时可能需要查看小提交的上下文,并且对于原始提交,*您可以做到这一点*。如果你挤压,你就会永远失去这些信息。 (3认同)
  • 您还必须阅读之前所有的小型间歇性提交,以了解代码的实际状态......一个小的非内聚提交本身没有任何意义。在编码时,我经常进行小的间歇性提交,因为我发现在尝试了一些不起作用的东西后,可以很容易地撤消更改并恢复到之前的良好状态。但这个问题是关于在合并回 main 时是否应该保留这些。这就是我的评论的内容。 (2认同)
  • @SámalRasmussen 这些不需要做。每次提交都应尽可能是一个原子更改,将代码库从一种已知的良好状态转换为另一种状态。每次提交通常应该是永久性的(有一些小的例外)。变基创建代表未经测试状态的提交;挤压会消除已知良好状态的知识。在管理良好的 Git 历史中,避免做这两件事很重要。 (2认同)
  • @SámalRasmussen 这并不温暖和模糊,而是对正确做事的坚定承诺以及帮助我​​的同事取得成功的愿望。 (2认同)