我正在编写一个脚本,该脚本需要检查特定的提交是否是合并/还原提交,我想知道是否有git技巧。

到目前为止,我想到的是(我绝对不想依靠此处的提交消息)是检查 HASH^2 看看我是否没有错误,有更好的方法吗?

有帮助吗?

解决方案

弄清楚是否合并很容易。这一切都与多个父母有关。为了检查一下,您可以这样做,例如

$ git cat-file -p $commit_id

如果输出中有多个“父”行,您会发现合并。

对于恢复,它并不那么容易。通常,恢复只是正常的承诺,这些提交恰好应用了以前的提交的差异,从而有效地删除了提交的更改。否则并不特别。

如果与 git revert $commit, ,然后GIT通常会生成一个提交消息指示恢复的记录以及其恢复的效果。但是,很有可能以其他方式恢复,或者只是更改由 git revert.

寻找那些生成的恢复提交信息可能已经足够出色的启发式方法来实现您要实现的目标。如果没有,您必须实际浏览其他提交,将它们的差异相互比较,看一个是另一个提交的确切反向操作。但这不是一个好的解决方案。通常,足够的恢复与他们恢复的提交相反的相反,例如,可以容纳提交和恢复之间发生的代码更改。

其他提示

以下说明将丢弃 只要 父母哈希。较少的过滤所需...

git show --no-patch --format="%P" <commit hash>

答案使用 git cat-file 正在使用git “管道” 命令,通常对于构建脚本的更好,因为输出格式不可能更改。使用的 git showgit rev-parse 可能需要随着时间的推移而改变 命令。

我长期使用的BASH功能 git rev-list:

gitismerge () {
    local sha="$1"
    msha=$(git rev-list -1 --merges ${sha}~1..${sha})
    [ -z "$msha" ] && return 1
    return 0
}

可以在最高级别的文档中找到瓷器/管道命令的列表 git 命令。

此代码使用 git-rev-list 有特定的 gitrevisisions 询问 ${sha}~1..${sha} 以某种方式打印SHA的第二个父母(如果存在),或者不存在,这是合并提交的确切定义。

具体来说, SHA~1..SHA 方法 包括可从SHA达到但不包括可到达的SHA〜1的提交,这是SHA的第一位父母.

结果存储在$ MSHA中,并使用Bash进行了空虚测试 [ -z "$msha" ] 失败(返回1)如果空,或通过(返回0)如果非空。

测试合并提交的一种方法:

$ test -z $(git rev-parse --verify $commit^2 2> /dev/null) || echo MERGE COMMIT

至于git恢复承诺,我同意 @Rafl 最现实的方法是在提交消息中查找恢复消息样板;如果有人更改了它,则检测到会非常参与。

轻松测试合并提交的方法:

git show --summary HEAD | grep -q ^Merge:

这将返回合并提交的0,非合并提交为1。用您所需的测试替换头。

示例用法:

if git show --summary some-branch | grep -q ^Merge: ; then
    echo "some-branch is a merge"
fi

找到提案父母的另一种方法:

git show -s --pretty=%p <commit>

利用 %P 用于完整的哈希。这打印了多少父母 HEAD 有:

git show -s --pretty=%p HEAD | wc -w
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top