Git使用merge的ours和theirs选项解决分支冲突

P粉328763957

P粉328763957

2026-07-26

725人浏览

原创

--ours和--theirs不是万能开关:merge用-xours/-xtheirs(策略选项),checkout/reset用--ours/--theirs(文件恢复),语义不同、混用报错;前者干预冲突裁决,后者覆盖已标记冲突文件。

git使用merge的ours和theirs选项解决分支冲突

直接说结论:--ours--theirs 不是“跳过冲突”的万能开关,它们只在特定上下文中生效——merge 时用 -Xours-Xtheirs,checkout/reset 时用 --ours--theirs,两者语义完全不同,混用会出错。

merge 命令里的 -Xours 和 -Xtheirs 是什么

这是 git merge 的策略选项(-X 表示 “eXtended”),只对 recursiveort 这类三路合并策略起作用。它不改变合并逻辑,只干预冲突发生时的自动裁决方式。

  • git merge -Xours feature:当 feature 合入当前分支时,所有冲突块都保留当前分支(our side)的版本,但非冲突部分仍会合并对方改动
  • git merge -Xtheirs feature:同理,冲突块全取 feature 分支的版本
  • 注意:它不影响二进制文件以外的文件类型判断;对二进制文件,-Xours 直接整份用当前分支内容,-Xtheirs 整份用 feature 分支内容
  • 它不等价于 ours 合并策略(-s ours),后者会完全忽略对方所有变更,连非冲突部分都不合并

checkout/reset 里的 --ours 和 --theirs 容易踩坑

这是针对已存在冲突的工作区文件的操作,不是 merge 参数。必须配合 git checkoutgit restore 使用,且仅作用于指定路径。

Git
Git

程序猿必备版本控制工具

下载
  • git checkout --ours -- hello.py:把 hello.py 冲突中 ours 部分(即当前分支 HEAD 的版本)写入工作区,覆盖冲突标记
  • git checkout --theirs -- hello.py:同理,写入 feature 分支的版本
  • ⚠️ 错误写法:git merge -Xours --ours —— --oursmerge 命令里是非法参数,Git 会报错 unknown option: --ours
  • ⚠️ 忘记 -- 分隔符:比如 git checkout --ours hello.py 缺少 --,Git 可能误判 hello.py 为分支名,导致切换分支而非恢复文件

什么时候该用 -Xours/-Xtheirs,而不是手动解决

适用场景非常有限,核心原则是:**你明确知道哪边的修改在语义上应该无条件优先,且冲突范围可控**。

  • 配置文件合并:比如 config.yml 在 dev 分支改了数据库地址,在 main 分支只加了日志级别,你确定上线环境必须用 main 的地址 → git merge -Xours dev
  • 自动化脚本更新:CI/CD 脚本被工具自动生成并提交到 feature 分支,而你本地有少量手工注释 → git merge -Xtheirs ci-scripts 保工具生成内容
  • 不要用于业务逻辑文件:哪怕只是“看起来”冲突简单,-X 会跳过人工审查,可能掩盖逻辑覆盖或字段遗漏
  • 不能替代测试:即使用了 -Xtheirs,也得跑一遍单元测试,确认对方逻辑没破坏你的调用链

合并后发现 -X 选错了怎么办

只要还没 push,就还有回旋余地。关键点在于:Git 不会丢弃任何一方的原始提交,只是 merge 提交的 tree 对象用了你指定的裁决结果。

  • 撤销 merge 提交:git reset --hard HEAD~1(仅限本地未推送)
  • 重做 merge 并换策略:git merge -Xours feature 改成 git merge -Xtheirs feature,或干脆去掉 -X 手动解决
  • 如果已 push,只能新建 revert 提交:git revert -m 1 HEAD-m 1 指定主干为第一父提交),再重新 merge
  • 最隐蔽的坑:-Xours 合并后,git log --merge 看不到冲突文件的 diff,因为 Git 认为“已自动解决”,但实际可能漏掉了对方的关键 fix

真正难的不是记住参数拼写,而是判断“这个冲突是否真的适合交给 -X 自动裁决”。大多数时候,打开编辑器看一眼冲突上下文,比查文档敲命令花的时间更少,也更安全。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

2023.07.05

2630

9

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

2023.07.06

975

6

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

2023.07.24

511

5

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.09

1743

7

git怎么对比两个版本的文件内容
git怎么对比两个版本的文件内容

要对比两个版本的 git 文件,请使用 git diff 命令:git diff 比较工作树和暂存区之间的差异。git diff 比较两个提交或标签之间的差异。git diff 输出显示差异块,其中 + 表示添加的行,- 表示删除的行, 表示修改的行。可使用 gitkraken、meld、beyond compare 等可视化工具更直观地查看差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.09

1500

6

Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

2

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

1

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 7.4万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.7万人学习