如何创建父提交具有祖先关系的Git特殊合并提交?
问题背景
git-merge(1)文档说明:
使用 --no-ff 参数时,无论合并是否可以通过快进方式完成,都会创建合并提交。
但实际测试发现这个表述并不准确:
$ git merge --no-ff HEAD^^ Already up to date.
核心逻辑梳理:
- 当
HEAD是输入版本的祖先时(快进合并场景),git merge --no-ff允许主动创建合并提交; - 当输入版本是
HEAD的祖先时,Git会判定为“已更新”,不会创建这种父提交存在祖先关系的无意义合并提交。
我在编写Git仓库操作的测试脚本时,错误假设git merge --no-ff总会创建提交,导致测试逻辑异常。虽已修正该假设,但想知晓是否有底层CLI工具能创建这类特殊合并提交。
解决方案
可以使用Git底层命令 git commit-tree 手动构建这类特殊合并提交,它不会像git merge那样自动做祖先关系校验,具体步骤如下:
- 获取当前
HEAD的树对象ID:HEAD_TREE=$(git rev-parse HEAD^{tree}) - 获取要作为合并父节点的旧提交ID(以
HEAD^^为例):OLD_COMMIT=$(git rev-parse HEAD^^) - 手动创建合并提交,指定两个父节点(当前
HEAD和旧提交)并提供提交信息:NEW_COMMIT=$(echo "Merge old commit into current HEAD" | git commit-tree $HEAD_TREE -p HEAD -p $OLD_COMMIT) - 将
HEAD指向新创建的提交:git reset $NEW_COMMIT
执行完成后,即可得到一个父节点存在祖先关系的特殊合并提交。
内容的提问来源于stack exchange,提问作者Brendan
相关产品推荐
相关产品推荐

