Git rebase冲突后如何单独查看冲突文件列表?
如何在Git Rebase冲突时查看冲突文件列表(含脚本自动化方案)
好问题!我之前在写自动化rebase脚本时也遇到过同样的困扰——手动遍历文件找冲突标记效率太低,而且想中途查看冲突文件又不想打断rebase流程。下面分两种场景给你解决方案:
一、手动查看冲突文件列表(不中断rebase)
Git内置了直接获取未合并(冲突)文件的命令,完全不需要自己遍历仓库:
最简洁的方式:
git diff --name-only --diff-filter=U解释:
--name-only:只输出文件名,不显示具体冲突内容--diff-filter=U:筛选出处于「Unmerged(未合并)」状态的文件,也就是存在冲突的文件
另一种更详细的方式:
git ls-files --unmerged这个命令会输出冲突文件的stage状态(比如1、2、3对应的不同版本),如果需要区分文件的不同冲突版本可以用这个,但如果只需要文件名列表,第一个命令更直接。
二、脚本自动化处理偏向某分支的rebase
针对你提到的「自动完成偏向某一分支的rebase」需求,上面的git diff命令可以直接集成到脚本里,高效获取冲突文件后批量处理:
示例脚本(偏向目标分支内容)
#!/bin/bash # 获取冲突文件列表 conflict_files=$(git diff --name-only --diff-filter=U) if [ -n "$conflict_files" ]; then echo "发现冲突文件:" echo "$conflict_files" # 批量处理冲突:保留目标分支(rebase的基准分支)的内容 for file in $conflict_files; do # 重要提醒:rebase时,--ours 指的是你要rebase到的基准分支(比如main) # --theirs 指的是当前所在的分支(比如feature),和普通merge的含义相反! git checkout --ours "$file" git add "$file" echo "已处理文件:$file(保留基准分支内容)" done # 继续rebase流程 git rebase --continue else echo "没有冲突,rebase已完成或无需处理。" fi
关键注意点
一定要记牢rebase时--ours和--theirs的特殊含义:
- 在普通
git merge中,--ours是当前分支,--theirs是合并进来的分支; - 但在
git rebase中,两者含义完全相反:--ours对应你要rebase到的基准分支,--theirs对应你当前所在的分支。搞反的话,脚本会保留错误的内容!
内容的提问来源于stack exchange,提问作者Mikhail Ramendik
相关产品推荐
相关产品推荐

