是否有可用于确定合并是否在进程中(即未提交)的Git命令?我知道我可以简单地检查.git/MERGE_HEAD
,但这对于命令行脚本是否正确和/或面向未来?
答案 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会告诉你存储库中发生了什么。
E.g。 *冲突的文件(未合并的文件)
答案 3 :(得分:2)
另一种选择是测试是否存在.git/MERGE_MSG
文件。
那是因为 2.14.x / 2。15(2017年第3季度)之前的,你最终会遇到不拥有.git/MERGE_HEAD
的情况,即使合并正在进行中。
请answer (uses jQuery)查看commit 9d89b35,commit 8e6a6bb,commit 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
。