git checkout --ours 和 git checkout --theirs 是冲突解决命令,仅在已发生合并冲突且处于未解决状态时有效:--ours 保留当前分支(head)版本,--theirs 保留被合并分支版本;它们不是撤回操作,也不是切换分支命令,且必须配合 -- 使用、不可用于未跟踪文件或删除/新增类冲突。

git checkout --ours 和 --theirs 是什么,不是什么
git checkout --ours 和 git checkout --theirs 不是“撤回操作”,也不是“切换分支命令”。它们只在**已发生合并冲突、且处于未解决状态(即 git status 显示 Unmerged paths)时才有效**。此时 Git 已把两个版本都暂存进索引(index),--ours 指的是当前分支(HEAD)的版本,--theirs 指的是你正试图合并进来的那个分支的版本——不是远程仓库,不是 origin/main,而是你刚执行 git merge feature-x 时那个 feature-x。
批量解决冲突:别用点号(.)全量覆盖
很多人看到“批量”就下意识敲 git checkout --theirs .,这是高危操作。它会无差别覆盖工作区里所有路径下的文件,包括那些根本没冲突、甚至没被本次合并涉及的文件,比如你本地改过的 README.md 或配置文件,可能直接被删掉内容。
- 正确做法是先用
git status --porcelain | grep "^U"提取真正冲突的文件列表(输出形如UU src/utils.js) - 再逐个处理:
git checkout --theirs src/utils.js - 或者用 shell 批量(更安全):
git status --porcelain | awk '/^UU/{print $2}' | xargs -r git checkout --theirs - 最后统一
git add,而不是靠git add .碰运气
合并前就决定用 --theirs?用 -Xtheirs 而不是 checkout
如果你提前知道这次合并要完全采纳对方分支的全部改动(比如集成一个外部团队交付的 feature 分支),就不要等冲突报出来再补救。直接在 merge 命令里带上策略:
git merge feature-external -Xtheirs
适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
这个 -Xtheirs(注意是大写 X)会让 Git 在三路合并过程中,对所有冲突区域自动选 theirs 版本,同时保留无冲突区域的正常合并逻辑。它比事后 checkout --theirs 更干净,不会留下“手动解决”的痕迹,也不需要额外 git add —— Git 自动完成暂存和提交。
⚠️ 注意:-Xtheirs 只影响冲突部分;--theirs 在 checkout 中只影响已标记为冲突的文件;二者作用范围不同,不能混用或替代。
为什么 git checkout --ours/theirs 有时不生效
常见失效场景有三个:
- 还没进入冲突状态:比如你只是
git pull失败,但没运行git merge,此时索引里没有两版内容,--ours/--theirs无目标可选 - 文件没被 Git 跟踪:
git checkout --theirs new-file.js会报错 “pathspec 'new-file.js' did not match any files”,因为该文件不在索引中 - 用了错误的参数顺序:必须是
git checkout --theirs -- filename,中间的--不可省略,否则 Git 可能误判为分支名
真正容易被忽略的点是:这些命令只解决“内容冲突”,不解决“删除/新增”类冲突(比如对方删了文件而你改了它)。这类情况 --ours/--theirs 无效,得用 git rm 或 git add 显式处理。










