判断一个 Git 提交是否为合并/撤销提交
如何判断Git提交是否是合并/还原提交?
有人使用git cat-file
命令来回答这个问题,这是一个Git的“plumbing”命令,对于构建脚本来说通常更好,因为输出格式不太可能改变。而使用git show
和git rev-parse
的方法可能需要随时间的推移而改变,因为它们使用的是Git的“porcelain”命令。
下面是一个长期以来我一直在使用的 bash 函数,它使用了git rev-list
命令:
gitismerge () { local sha="$1" msha=$(git rev-list -1 --merges ${sha}~1..${sha}) [ -z "$msha" ] && return 1 return 0 }
在顶层git
命令的文档中可以找到一些porcelain/plumbing命令的列表。
这段代码使用了git-rev-list
命令和一个特定的gitrevisions
查询${sha}~1..${sha}
,以一种打印SHA的第二个父级(如果存在)或不打印任何内容(如果不存在)的方式,这正是合并提交的确切定义。
具体来说,SHA~1..SHA
的意思是包括从SHA可达的提交,但排除从SHA~1可达的提交,SHA~1是SHA的第一个父级。
结果存储在$msha中,并使用bash的[ -z "$msha" ]
来测试是否为空,如果为空则失败(返回1),如果非空则通过(返回0)。
关于“porcelain”你指的是什么?你具体指的是哪个答案?
嗨,我在回答中添加了一些带有链接的文本,希望对你有帮助。
谢谢你的更新;还有两个问题:[ -z foo ]
到底是什么意思?我想知道这个,因为我想在一个bash脚本中使用它……此外,与cat-file
相比,你的解决方案的优缺点是什么?谢谢。
嗨,我改进了回答,并希望涵盖了你的两个问题。代码的简洁性是真正的“优点”,这只是SHA~1..SHA修订说明符的拼写,它将输出映射到一个非常简单的“空 vs. 非空”bash测试。注意,我还使用了额外的“-1”选项,进一步限制了“git rev-list”的输出。
is_merge () { return $(( ! `git rev-list --no-walk --count --merges "$@"`)) }
不错,+1。我之前没有看到--count。也可以这样写:is_only_child() { return $(git rev-list --no-walk --count --merges "$@"); }
...
我发现这个方法不起作用。我使用的是git version 2.24.3 (Apple Git-128)
。我喜欢你的解决方案。(在bash脚本中,我在))
之后需要加上一个分号才能编译通过。)请考虑将其发布为答案。
判断一个Git提交是否为合并(Merge)或还原(Revert)提交是一个常见的问题。对于合并提交,可以通过检查提交的父节点数量来判断,如果父节点数量大于1,则为合并提交。可以使用以下命令来检查:
$ git cat-file -p $commit_id
如果输出中有多个`parent`行,则表示找到了一个合并提交。
对于还原提交来说就没有这么容易了。通常,还原提交只是普通的提交,只是通过将先前提交的差异反向应用,从而删除该提交引入的更改。除此之外,并没有其他特殊的标识。
如果使用git revert $commit
创建了还原提交,那么Git通常会生成一条包含还原信息和被还原提交的提交消息。然而,有可能以其他方式进行还原,或者只是更改由git revert
生成的提交的提交消息。
寻找这些生成的还原提交消息可能已经足够好的启发式方法来判断提交是否为还原提交。如果不行,你需要实际查看其他提交,比较它们之间的差异,看是否有一个是另一个的完全相反操作。但即使这样也不是一个好的解决方法。往往还原提交与它们还原的提交不完全相反,例如为了适应在提交和还原之间发生的代码更改。
如何获取合并的分支呢?
问题出现的原因:
在Git中,每个提交(commit)都有一个唯一的哈希值,用于标识该提交的内容和历史。但是在某些情况下,我们需要判断一个提交是合并(Merge)提交还是还原(Revert)提交。然而,Git默认并没有直接提供判断的方法。
解决方法:
通过使用命令git show --no-patch --format="%P" <commit hash>
,可以仅获取提交的父哈希值,从而判断该提交是合并提交还是还原提交。
下面是具体的代码示例:
git show --no-patch --format="%P" <commit hash>
通过运行以上命令,并将
这种方法可以减少过滤操作,只获取所需的父哈希值信息,从而更方便地判断一个提交是合并提交还是还原提交的情况。