如何让Git仅列出合并时新增的非父提交来源的修改?
如何单独列出Git合并提交中的手动修改内容
问题背景
在使用Git 2.42.0.windows.2版本及Bash控制台执行合并操作时,为使代码可编译进行了手动修改,并将这些修改与合并本身的变更一同提交。这些手动修改不属于合并提交的任意父提交,是从合并提交开始新增的内容。尝试了git diff -c、git diff --cc、git diff --cc --combined-all-paths及git diff-tree -c -p命令,均未得到预期结果。
测试场景示例
- 初始有内容为
Original file2 content.的file2文件 - 创建分支A和B,二者均对file2进行了修改
- 合并后提交前,手动添加了带有“m”标记的内容(用于解决编译问题的新增内容)
期望输出格式类似:
file2: line 6 +Extra content to make the merge between A and B work.
解决方案
要单独提取合并提交中不属于任何父提交的手动修改,可以利用git merge-tree模拟自动合并的结果,再与实际合并提交对比:
针对当前合并提交(HEAD)
直接执行以下命令:
git diff --no-index <(git merge-tree HEAD^1 HEAD^2) HEAD
针对特定合并提交
如果需要查看指定哈希的合并提交(比如哈希为abc123),替换HEAD为对应哈希即可:
git diff --no-index <(git merge-tree abc123^1 abc123^2) abc123
命令原理
git merge-tree HEAD^1 HEAD^2:模拟将两个父提交自动合并后的内容(无手动修改的理想合并结果)git diff --no-index:对比模拟合并结果与实际提交的内容,差异部分就是你手动添加的修改
调整输出格式
如果需要更简洁的行号+内容样式,可以配合--stat参数:
git diff --no-index <(git merge-tree HEAD^1 HEAD^2) HEAD --stat=1000,1000
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

