【问题标题】:Is there a way to keep two branches from merging in git有没有办法防止两个分支在git中合并
【发布时间】:2010-10-30 22:57:42
【问题描述】:

我希望能够在一个 git repo 中保留两个独立的分支,即使这些分支可能包含相似的内容,也不会意外合并。

是否有强制分支在 git 中保持独立的技巧?假设我有分支 A 和分支 B,像 git merge B //assuming A is checked out 这样的东西会失败。

这里出现了问题,因为在创建我正在开发的网站的存储库时,我需要 master 分支的 HEAD 始终是稳定的当前状态网站。

我需要在 development 分支上进行任何开发提交,如果需要,topic 分支会从 development 分支分支出来。

 C1-C2                        master
     \
     C3-C4-C5-C6-C9-C10-C11   development
               \
                C7-C8-C12     topic/HEAD

我需要确保主分支和其他分支之间发生意外合并的可能性很小。

所以我正在寻找一种方法来“介入”与主分支的合并以询问“此合并将在网站上上线,您确定要这样做吗?”只有在我确认合并后才会通过。

我想这种情况只与代码不需要编译即可运行的 Web 开发人员相关,并且可能会在实时安装时提取稳定网站的副本。

【问题讨论】:

  • 另一种防止事情意外上线的方法是在它们被推送或部署时拦截它们。根据您的工作流程,合并给定开发人员的存储库不一定是坏事。

标签: git merge branch git-merge


【解决方案1】:

请注意,带有自动提交的 git 合并不会调用 pre-commit 钩子。见“git merge auto-commit doesn't fire pre-commit hook”

Merge 直接调用commit_tree,因此绕过了标准提交挂钩。

A Patch 正在进行中。

【讨论】:

  • 此补丁是否仍在“进行中”或已失效?
  • @AndyHayden 暂时停滞不前。不是当前 Git 版本的一部分。
  • 谢谢!嗯,本来想禁止所有合并命令,猜想我必须在所有 git :s 周围使用包装器。
【解决方案2】:

我相信您可以做到这一点的唯一方法是使用pre-commit hook。从手册页:

这个钩子由 git commit 调用,可以通过 --no-verify 选项绕过。它不带参数,并在获取建议的提交日志消息并进行提交之前被调用。从该脚本中以非零状态退出会导致 git 提交中止。

所以,如果你真的想要,你可以编写一个预提交钩子来检查当前分支和你试图合并的分支,如果它是你不想要的那对,则以非零状态退出.在我的脑海中,我能想到的检查您尝试合并的分支的唯一方法是检查文件.git/MERGE_MSG 并解析第一行。 (替代方案,.git/MERGE_HEAD 会告诉你正在合并的 SHA1,但没有记录它是哪个分支,所以如果两个分支在同一个地方,那么你就不走运了。

pre-commit 钩子显然不是为快进合并运行的;我怀疑是否真的有任何方法可以防止这种情况发生。但大概如果你不合并分支,就永远不会有快进尝试。

【讨论】:

  • 我听说有一种方法可以创建无父分支。我想知道是否有人尝试合并两个无父分支(如 master 和另一个)是否会自动失败,即使没有钩子(尽管我猜这不会阻止变基)。
  • 是的,您可以创建多个根提交,因此可以创建没有共同祖先的分支,但这不会阻止合并的发生。这只是意味着不能基于共同祖先进行完整的三向合并。 (常见的用例是通过子树合并合并另一个存储库。)
  • P.S.如果您正在考虑没有共同历史的分支,那么首先要问为什么您希望它们在同一个存储库中。
  • 我认为不会为合并触发预提交挂钩。
  • 我在我的 Mac 上使用 git 1.9.3,发现即使是非快进合并也不会触发预提交挂钩。
猜你喜欢
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2012-11-11
  • 2014-10-28
  • 2017-12-11
  • 1970-01-01
相关资源
最近更新 更多