如何获取Git两个提交间需删除与新增的文件列表(排除重命名)?
解决Git识别重命名为删旧加新的文件清单问题
我完全懂你的困扰——老旧系统的操作限制逼得你只能靠删旧文件、新增新文件来模拟重命名,但Git默认的重命名检测会把这两步合并成一条重命名记录,完全不符合你想要拆分查看的需求。下面是具体的解决办法,帮你精准提取纯删除和纯新增/更新的文件列表:
1. 提取两个提交间的删除文件列表
用git diff关闭重命名检测,同时只筛选被删除的文件:
git diff --no-renames --name-only --diff-filter=D <起始提交> <结束提交>
参数拆解:
--no-renames:强制Git跳过重命名检测,还原你实际执行的“删旧+加新”操作记录--name-only:只输出文件名,刚好适合生成清单--diff-filter=D:仅保留被删除的文件条目
2. 提取两个提交间的新增/更新文件列表
同样关闭重命名检测,筛选新增和修改过的文件:
git diff --no-renames --name-only --diff-filter=A,M <起始提交> <结束提交>
参数拆解:
--diff-filter=A,M:A代表新增的文件,M代表修改过的文件,组合后就能覆盖所有新增和更新的内容
3. 生成本地清单文件
如果需要把结果保存成文件方便后续使用,直接将命令输出重定向到文本文件即可:
# 生成删除文件清单 git diff --no-renames --name-only --diff-filter=D <起始提交> <结束提交> > deleted_files.txt # 生成新增/更新文件清单 git diff --no-renames --name-only --diff-filter=A,M <起始提交> <结束提交> > added_updated_files.txt
提交参数的几种写法
你可以用以下任意方式指定<起始提交>和<结束提交>:
- 完整的提交哈希值,比如
a1b2c3d和x9y8z7w - 分支名,比如
main和feature/rename-workaround - 相对引用,比如
HEAD~2(当前提交的前两个版本)和HEAD(当前最新提交)
举个实际场景的例子:如果想对比当前提交和上一个提交的操作记录,命令可以写成:
git diff --no-renames --name-only --diff-filter=D HEAD~1 HEAD
这样操作后,你就能得到完全拆分的删除文件清单和新增/更新文件清单,完美匹配你在老旧系统上的实际操作流程,不会再出现Git自动合并重命名的情况。
内容的提问来源于stack exchange,提问作者Arron
相关产品推荐
相关产品推荐

