如何用Git标记并比较两个无关提交历史中的相同提交?
我现在用这条命令查看两个独立提交范围的日志:
git log --graph --decorate --pretty=oneline --abbrev-commit --cherry-mark --boundary --left-right 450efff0b..aa562a8b8 3f2556baf..b5e526fe6
输出如下:
> b5e526fe6 (HEAD -> Implement_isolate) New helper > 3db3263f1 Reorder description at README.md > 5a3a0cf9c Do not ignore versions > 348cb1d86 Set correct package name and license > cdc5ba061 Implement 'isolate' script > 045d1d5f3 Do not match at any level below the .gitignore level > 45513accd Relay on isProdMode value | > aa562a8b8 (fe_test/dev, fe_test/HEAD) New helper | o 450efff0b Initial commit o 3f2556baf Reorder code
我希望Git能像处理有共同历史的分支那样,用=标记b5e526fe6和aa562a8b8这类内容完全相同的提交。我试过用三点范围写法(450efff0b..aa562a8b8)...(3f2556baf..b5e526fe6),但没有达到预期效果,期望的输出应该是:
= b5e526fe6 (HEAD -> Implement_isolate) New helper > 3db3263f1 Reorder description at README.md > 5a3a0cf9c Do not ignore versions > 348cb1d86 Set correct package name and license > cdc5ba061 Implement 'isolate' script > 045d1d5f3 Do not match at any level below the .gitignore level > 45513accd Relay on isProdMode value | = aa562a8b8 (fe_test/dev, fe_test/HEAD) New helper | o 450efff0b Initial commit o 3f2556baf Reorder code
我已经配置了两个别名用于对比有共同历史的分支:
$ cat ~/.gitconfig [alias] fullchanges = log --graph --decorate --pretty=oneline --abbrev-commit --cherry-mark --boundary --left-right cdiff = range-diff --no-dual-color
想知道能不能把这个适配到无共同历史的提交范围对比中,实现同样的标记效果。
Git的--cherry-mark默认依赖提交历史的共同祖先来识别等价提交,但对于无共同历史的提交范围,你可以通过添加--cherry-pick参数来强制Git基于**补丁ID(patch-id)**对比提交内容,从而标记出内容完全相同的提交。
方法1:直接修改命令添加参数
在你的fullchanges别名基础上,加上--cherry-pick参数即可:
git fullchanges --cherry-pick 450efff0b..aa562a8b8 3f2556baf..b5e526fe6
这个参数会让Git忽略提交的历史关系,只对比提交的补丁内容,将两边内容完全相同的提交用=标记,符合你的预期。
方法2:更新别名(可选)
如果你经常需要处理无共同历史的对比,可以修改fullchanges别名,默认带上--cherry-pick参数:
git config --global alias.fullchanges 'log --graph --decorate --pretty=oneline --abbrev-commit --cherry-mark --boundary --left-right --cherry-pick'
之后直接执行git fullchanges 450efff0b..aa562a8b8 3f2556baf..b5e526fe6就能得到想要的效果。
原理说明
--cherry-pick参数会让Git计算每个提交的补丁ID(基于提交的内容生成的哈希值),然后对比两个提交范围内的补丁ID:
- 如果两边存在补丁ID相同的提交,就用
=标记它们 - 仅在某一侧存在的提交,依然用
>或<标记(取决于所属范围)
这种方式不需要修改提交历史,就能实现无共同历史分支的等价提交标记。
内容的提问来源于stack exchange,提问作者Eugen Konkov

