如何检测合并提交(merge commit)是否已被拣选到Git目标分支
无
-x参数时检测合并提交是否已被拣选到目标分支的方法 已知局限说明
git cherry可检查提交是否被应用到上游分支,但仅支持非合并提交;git log --cherry参数隐含--no-merges配置,同样会排除合并提交- 若cherry-pick时带
-x参数,可直接用git log --grep <源提交哈希> <目标分支>快速校验是否已被拣选
无-x参数时的可靠检测方案
方法1:补丁ID匹配(推荐,适配绝大多数场景)
Git的补丁ID基于提交的内容差异生成,和提交哈希、提交信息、时间戳等元数据无关,只要变更内容一致就会生成相同的补丁ID,操作步骤如下:
- 生成待检测合并提交的补丁ID:
合并提交存在多个父节点,需指定相对于第一个父分支的变更来生成补丁,执行命令:git show -m 1 <待检测的源合并提交哈希> | git patch-id
输出的第一个哈希值即为该提交的补丁ID - 在目标分支匹配补丁ID:
执行命令扫描目标分支所有提交的补丁ID:git log <目标分支名> --patch | git patch-id | grep <上一步得到的补丁ID>
若有匹配结果输出,说明该合并提交已经被拣选到目标分支
方法2:模拟拣选校验
可以通过dry run模式模拟执行cherry-pick,根据返回结果判断:
执行命令:git cherry-pick -m 1 --no-commit <待检测的源合并提交哈希>
- 若返回提示
The previous cherry-pick is now empty, possibly due to conflict resolution.,说明该提交的变更已经全部存在于当前目标分支,即已经被拣选过 - 执行完后记得执行
git cherry-pick --abort回滚模拟操作,避免影响工作区
方法3:变更内容对比(适配冲突后拣选的场景)
如果拣选时曾解决过冲突,补丁ID会发生变化,可通过对比变更细节校验:
- 先获取源合并提交的变更信息:
git show -m 1 --name-only <源合并提交哈希>拿到修改的文件列表,git show -m 1 <源合并提交哈希>查看具体修改内容 - 在目标分支搜索对应文件的历史变更,对比修改内容是否一致:
git log <目标分支名> -- <文件路径>定位到对应提交后再核对内容
内容的提问来源于stack exchange,提问作者Narcolessico
相关产品推荐
相关产品推荐

