如何确定Git合并是否正在进行中

时间:2015-06-09 13:27:32

标签: git git-merge

是否有可用于确定合并是否在进程中(即未提交)的Git命令?我知道我可以简单地检查.git/MERGE_HEAD,但这对于命令行脚本是否正确和/或面向未来

5 个答案:

答案 0 :(得分:17)

一个技巧是使用Git命令,如果合并正在进行中,该命令将失败。然后,您可以检查命令的返回码。您还需要确保该命令在成功的情况下不会影响您的工作副本或索引。虽然有许多命令属于这一类,但看起来合适的命令是

git merge HEAD

如果合并正在进行,则返回128代码,否则返回0。请注意,当合并不在进程中时,此命令将只打印已经是最新的,因为您只是与自己合并。因此,出于脚本目的,您可以执行此操作(在BASH中)

git merge HEAD &> /dev/null
result=$?
if [ $result -ne 0 ]
then
    echo "Merge in progress."
else
    echo "Merge not in progress."
fi

请注意,即使使用--quiet git merge标志,进程内合并仍会导致此命令打印到错误流。这就是我将其输出重定向到/dev/null

的原因

答案 1 :(得分:8)

您可以安全地检查git目录[1]中是否存在MERGE_HEAD,以确定是否正在进行合并。 MERGE_HEAD文件包含正在合并的提交ID,它将是已提交合并的n父项。例如,如果我尝试合并br1处的分支c085e0c

> git merge --no-ff --no-commit br1
Automatic merge went well; stopping before committing as requested

> cat .git/MERGE_HEAD
c085e0caa2598064bfde9cc6318bd2c73fee2371

如果您正在进行章鱼合并,那么您将在此文件中看到多个提交ID(换行符分隔):

> git merge --no-ff --no-commit br2 br3
Fast-forwarding to: br2
Trying simple merge with br3
Automatic merge went well; stopping before committing as requested

> cat .git/MERGE_HEAD
69b0169b1cba60de86161b375f013c59ad9581d8
99dad0187351d61ae8e88d49c96d7383f9e8fa6d

使用MERGE_HEAD实际上是how git clients determine whether there's a merge in progress。有些人通过漏洞抽象提供了这种洞察力:

> git merge --abort
fatal: There is no merge to abort (MERGE_HEAD missing).

因此,检查MERGE_HEAD的存在是完全可以接受的,并且与软件中的任何内容一样具有未来证据 - 这意味着对git-merge的任何更改都必须考虑与其他git客户端的兼容性会(希望!)优雅地过渡和/或提供向后兼容性。

[1]您可以信任MERGE_HEAD的存在,而不是您可以信任的.git位于您的工作目录下。有人可以使用--git-dir标志或GIT_DIR环境变量。

答案 2 :(得分:2)

git status

你可以跑 git status

git会告诉你存储库中发生了什么。

E.g。  *冲突的文件(未合并的文件)

答案 3 :(得分:2)

另一种选择是测试是否存在.git/MERGE_MSG文件。

那是因为 2.14.x / 2。15(2017年第3季度)之前的,你最终会遇到拥有.git/MERGE_HEAD的情况,即使合并正在进行中。

answer (uses jQuery)查看commit 9d89b35commit 8e6a6bbcommit 62dc42b(2017年8月23日)和commit e2de82f(2017年8月21日)。{
Michael J Gruber (mjg)于2017年8月27日Junio C Hamano -- gitster --合并)

  

在编辑器返回控制权之前杀死“git merge --edit”   存储库处于MERGE_MSG但没有MERGE_HEAD的状态,   这错误地告诉后来的“git commit”   正在进行的壁球合并。
  这已得到修复。

在Git 2.14.x / 2.15之后,情况不再是这样了,对.git/MERGE_HEAD的测试就足够了。

答案 4 :(得分:1)

由于entity: '#(data.entity)' 仅在合并期间可用,并且也可以用于将来,因此我们可以简单地使用MERGE_HEAD(通常是管道命令),如果git rev-list -1 MERGE_HEAD会以代码128退出找不到。将stdout和stderr用管道传输到MERGE_HEAD以便进行更清洁的检查。甚至更好,请使用/dev/null