Git重写提交历史后执行diff命令的效果及原理疑问
Git重写提交历史场景下git diff运行逻辑解答
问题1解答
git diff commit3 commit3'可以正常执行。- 运行原因:
git diff的核心逻辑是对比两个提交对象对应的文件快照内容,不需要两个提交存在分支继承关系,只要两个提交的对象存储在本地Git对象库中,就可以正常执行对比。 - 输出内容:默认无任何变更输出。因为squash操作只是把Commit2和Commit3的提交历史合并为一次,不会修改最终的文件内容,Commit3'的文件快照和原Commit3的文件快照完全一致,所以对比结果为空。如果squash过程中手动修改了合并后的内容,才会输出对应修改的差异。
问题2解答
- 输出内容:为Commit3相对于Commit2的变更的反向差异。比如原Commit3是在Commit2的基础上修改了
a.py的第3行、新增了b.txt,那么diff输出就是把a.py第3行改回原内容、删除b.txt的变更集。 - 已删除提交仍可参与diff的原因:通过rebase移除Commit3的操作,本质只是把分支指针从原提交链移动到了新的提交链,Commit3本身仍然作为不可达对象存放在本地Git对象库中,只要还没有被
git gc命令回收(默认不可达对象会保留30天),通过哈希值指定该提交时,Git仍然可以正常读取它的快照内容完成对比。等Commit3被GC清理后,再执行该diff命令才会报错提示提交不存在。
内容的提问来源于stack exchange,提问作者John Byro
相关产品推荐
相关产品推荐

