有没有一种方法可以在git中防止两个分支合并?

6
我希望能够在git repo中保留两个独立的分支,即使这些分支包含相似的内容也不会意外合并。有没有什么技巧可以强制分支在git中保持独立?假设我有分支A和分支B,类似于“git merge B //假设已经检出了A”的操作将失败。
这里的问题是因为我正在创建一个网站的存储库,需要master分支的HEAD始终是稳定网站的当前状态。任何开发提交都需要在开发分支上进行,如果需要,可以从开发分支创建主题分支。
 C1-C2                        master
     \
     C3-C4-C5-C6-C9-C10-C11   development
               \
                C7-C8-C12     topic/HEAD

我需要确保主分支和其他分支之间没有意外合并的可能性。因此,我正在寻找一种方法,在与主分支合并之前插入“中间”步骤来询问:“这个合并将在网站上发布,您确定要执行吗?”只有在我确认合并后,它才会继续进行。我想这种情况只适用于Web开发人员,其代码不需要编译即可运行,并且可能在现场安装中拉取稳定网站的副本。

另一种防止意外上线的方法是在推送或部署时拦截它们。在特定开发人员的存储库中合并不一定是坏事,这取决于您的工作流程。 - Cascabel
2个回答

5

1
这个补丁还在“进行中”还是已经死了? - Andy Hayden
@AndyHayden 目前已经停滞不前。不是当前 Git 发布的一部分。 - VonC
谢谢!嗯,本来想禁止所有合并命令,看来我不得不在所有git命令的周围使用一个包装器:s。 - Andy Hayden

4
我相信你能够完成这个任务的唯一方法是使用预提交钩子(pre-commit hook)。从手册中可以看到:

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

所以,如果你真的想要实现这个功能,可以编写一个预提交钩子来检查当前分支和你尝试合并的分支,并在它们匹配时以非零状态退出。我能想到的唯一一种检查你正在尝试合并哪个分支的方法是检查文件.git/MERGE_MSG并解析第一行。(另一种选择.git/MERGE_HEAD将告诉你正在合并的SHA1,但没有记录它是哪个分支,因此如果两个分支处于相同位置,你就无法保护了。
显然,预提交钩子不会运行快进合并;我怀疑是否真的有任何方法可以防止它。但是,假设你保持分支不被合并,那么就不会有快进合并的尝试。

我听说有一种方法可以创建一个没有父分支的分支。我想知道如果尝试合并两个没有父分支的分支(比如主分支和另一个分支),是否会自动失败,即使没有钩子(虽然我猜这不会阻止变基)。 - dkinzer
是的,你可以创建多个root commits,并因此产生没有共同祖先的分支,但这并不能防止合并的发生。这只意味着不能基于共同祖先进行完整的三方合并。(这种情况的常见用例是通过子树合并将另一个存储库合并进来。) - Cascabel
如果您考虑没有共同历史的分支,那么这就引出了一个问题:为什么您首先想要它们在同一个存储库中。 - Cascabel
好的观点。我已经扩展了问题以解释需要(您是正确的,分支不会“永远”合并。只是不会意外地合并)。 - dkinzer
1
我认为预提交钩子不会触发合并操作。 - Andy Hayden
1
我在我的Mac上使用git 1.9.3,并发现即使是非快进合并,预提交钩子也没有被触发。 - WKPlus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接