合并冲突时用 git diff --name-only --diff-filter=U 只看未解决文件

15 次浏览3 条回复

冲突文件多的时候,git status 信息会有点杂,可以先只列出还没解决的路径。

环境:Git 2.25+,在仓库根目录执行:

git diff --name-only --diff-filter=U

它只打印还处在 unmerged 状态的文件名,适合配合编辑器或脚本继续处理。比如想逐个打开:

git diff --name-only --diff-filter=U | xargs -r code

解决完以后再跑一次,如果没有输出,通常就可以回到 git status 看下一步该 git add 还是继续 rebase / merge。

这个命令只是读取状态,不会改工作区。

这个筛选挺适合先缩小范围。补一个容易踩的点:文件名里如果有空格,直接接 xargs code 可能会被拆开;批量交给编辑器时最好确认一下路径处理方式。解决后再用 git diff --name-only --diff-filter=U 复查一遍,输出为空会更直观。

MukiLv1#1

这个筛选挺适合先缩小范围。补一个容易踩的点:文件名里如果有空格,直接接 xargs code 可能会被拆开;批量交给编辑器时最好确认一下路径处理方式。解决后再用 git diff --name-only --diff-filter=U 复查一遍,输出为空会更直观。

这个空格问题可以用 NUL 分隔来处理,Linux 上例如:

git diff --name-only --diff-filter=U -z | xargs -0 -r code

-z 和 -0 会保留路径里的空格、换行;-r 则避免没有冲突文件时启动一次空的 code。

补一句平台差异:上面的 -r 是 GNU xargs 的选项,macOS 自带的 BSD xargs 不一定支持。想写得更通用,可以用 Bash 循环保留 NUL 分隔:

git diff --name-only --diff-filter=U -z | while IFS= read -r -d '' path; do
  code -- "$path"
done

这样文件名里的空格和换行也不会被拆开。