背景
某个项目需要在流水线中集成这样的工具,每次代码提交后,需要自动对比上一个版本代码,结合代码链路输出变更影响范围,起初是通过git log 去获取上一个版本的commit。但后面发现如果该commit 是merge版本,对比出来的不是我们想要的diff
现象
1、 git log 获取对比
开发新提交的版本是c60,根据
git log
我们获取到的上一个版本是b9f
git diff c60 b9f
结果如下(git diff 可以直接diff 两个同分支的commit) 显示了有222个文件变更。
2、直接查看提交变更记录
点击提交的c60,得到如下变更记录 可以看到只有一个文件变更。:这个才是真实的变更信息
问题排查
为什么会有这样的差异,提交变更到底是跟什么去对比的?
在提交记录这里,我们很明显看到它的上级显示有两个 尝试获取第一个父级直接diff,获取到就是我们要的数据
经过多次实验,我们发现提交版本变更就是第一个父级做diff(如果有多个的话),那疑问又来了
为什么偏偏这个commit呢?
查看了graph图,可以看到b9f 是其他分支的commit id。而不是跟c60同个主干分支的commit id。而4b3才是c60 同个主干分支的commit id。这就是能解释了为啥提交的变更记录是它的上级是这个commitid
问题解决
同个上面的问题排查,我们知道了git log 并不能按照顺序显示主干分支的commit id。那我们怎么查询上一个主干分支的commit id呢。在当前分支下使用
git show head~1
这个涉及head指针的内容,大概如下图 在这里ABDG是主干分支,其他都是merge进来的分支,我们要查看B commit 可以有如下几种方法。不过建议使用~1 好理解。
最后
merge 后不仅仅是diff需要注意,回滚到某个commit id的时候也需要注意。 还有git merge 方式的不同也会导致commit id 的不一样。比如 git merge --squash 就可以强制将其他分支的commit完全合并在一起。这样就不会有上面的问题。git merge 的知识点非常多,还需要大家自己慢慢摸索,如果错误,请各位大佬指出哈!
参考文献
https://blog.csdn.net/sayoko06/article/details/79471173 https://juejin.cn/post/6896397865926295565 https://blog.csdn.net/haifengyululu/article/details/84355258
如有帮助,请点个赞哈!
|