使用漂亮格式字符串时在 git 日志中显示合并父项

Show merge parents in git log when using pretty format string

Git 日志 documentation 说:

If the commit is a merge, and if the pretty-format is not oneline, email or raw, an additional line is inserted before the Author: line. This line begins with "Merge: " and the sha1s of ancestral commits are printed, separated by spaces.

购买 我在我的 git 全局配置中使用 format.pretty,但我没有看到 "Merge line"。

我可以使用 git-log documentation:

中显示的 %p(或 %P)参数来模拟它

%P: parent hashes

%p: abbreviated parent hashes

但如果提交不是合并提交,则显示空 "Merge:" 行。

有没有办法在使用漂亮的格式字符串时模拟关于合并提交父项的标准日志行为?

很遗憾,不,目前无法执行此操作。问题是当且仅当这是合并提交时,您必须包含 %p%P,但没有 "test some condition, execute format directives based on result" 格式指令。 (我们得到的最接近的是 %<%> 等指令。)

有一种方法可以解决这个问题,但速度很慢:使用 git rev-list 获取所需的提交 ID,然后使用 git log -1 或 [=17= 一次记录一个].这样你就可以在调用 git log 之前 运行 任何你喜欢的代码,例如测试 "is this a merge commit"。如果是合并提交,则将所需的指令添加到格式中,如果不是,则将其保留。例如:

git rev-list HEAD | while read hash; do
    if is-merge $hash; then fmt="... %p ..."; else fmt="... ..."; fi
    git log --no-walk --format="$fmt" $hash
done

其中 is-merge 检查父项计数。 (为了更有效地做到这一点,使用 git rev-list --parents 并将 read 命令更改为 read hash parentsread hash parent1 rest,之后您可以测试 $parents$rest。如果你在 bash 中写作,你可以使用数组。)