Git merge冲突时无法自动保留双方修改,必须手动编辑冲突块,融合逻辑(如合并日志与返回值、并存样式规则、提取公共函数等),删除冲突标记后暂存并提交,且需验证调用链、作用域、副作用及运行测试。

git merge 时遇到冲突,想保留双方修改怎么办
Git 默认的三路合并(three-way merge)在检测到同一行被两个分支分别修改时,会直接报 CONFLICT (content) 并停止合并——它不会自动拼接或追加,更不会“聪明地保留两边”。所谓“保留两个版本”,本质是你手动介入,在冲突标记内做逻辑融合,而不是让 Git 替你选一个或丢一个。
冲突文件里看到 >>>>>> branch 的真实含义
这些不是装饰符,而是 Git 明确划分的“上下文边界”:
到 <code>=======:你当前所在分支(比如main)的修改内容-
=======到>>>>>> feature/login:你要合并进来的分支(比如feature/login)的修改内容 - Git 不知道这两段是否互斥、是否可共存、是否需要顺序调整——它只负责标出“这里变了,且变法不一致”
例如函数签名冲突:
<<<<<< HEAD
function validateUser(email, password) {
=======
function validateUser(email, password, captcha) {
>>>>>> feature/login
这时不能只删标记、留一行;得判断:captcha 是必填项?调用方是否已适配?若答案是“是”,就该保留三参数版本;若“否”,可能要补默认值或条件逻辑。
OpenClaw 技能 — 给定一个 GitHub 仓库 URL,自动解析出 owner/repo 名称,发现其中的 YAML/properties 配置文件及其配对的中文字段说明;在 `workspace/{repo}/` 目录下按同步日期(格式为 `YYYY-MM-DD`)创建时间戳子目录;写入 `.openclaw-config-state.json` 状态文件。每次用户提问前,先比对远程仓库当前 ref(如 `main` 或 `master`)的最新提交 SHA 与本地状态文件中记录的 SHA:
实际操作中怎么“保留两个版本”而非“选一个”
这不是靠命令开关实现的,而是靠你编辑冲突块时的决策。常见策略有:
- 合并逻辑:比如一方改了返回值,另一方加了日志,就都留着——把日志语句插在函数体内,返回值按新规则写
- 条件并存:一方加了 dark mode 样式,另一方改了 font-size,就写成
body.dark { font-size: 16px; }而不是删掉任一规则 - 函数重载/多态思路:若语言支持(如 TypeScript),可保留两个签名,用联合类型或重载声明
- 提取公共逻辑+分支处理:把共用部分抽成 helper,原函数按分支逻辑调用不同分支路径
关键动作只有三步:vim file.js → 手动删掉所有 / <code>======= / >>>>>> 行 → 改成你确认无误的终版代码 → git add file.js → git commit
容易忽略的坑:冲突没真解决,只是表面删了标记
有人以为只要删光冲突符号、保存文件就算解决,结果运行报错或功能异常。这是因为:
- 没检查函数调用链是否断裂(比如删了参数却没改调用处)
- 没验证变量作用域(比如一方声明了
let x,另一方用了x,合并后变成重复声明) - 忽略了副作用顺序(如两个分支都写了
console.log,但合在一起打印两次,掩盖了真实流程) - 没跑测试:
git status显示 clean ≠ 功能正确,必须执行对应单元测试或手动验证
最稳妥的做法是:改完冲突后,立刻在本地复现该功能路径,而不是等 CI 报错才回头查。

















