← 中文资源

简体中文版本

解决合并冲突且不丢失工作

检查冲突两侧的意图,选择或合并正确改动,暂存结果并在完成合并前运行测试,避免整文件盲目选边导致隐藏丢失。

阅读英文原文

先理解冲突再编辑

冲突是一个问题,不是错误。标记展示了三个版本:共同基线、当前分支和传入分支。先理解双方为什么修改,再决定最终结果。

git status
git diff --name-only --diff-filter=U
# 打开每个文件,删除 <<<<<<<、=======、>>>>>>> 标记
git add src/payments/refund.ts
npm test
git commit

步骤

  1. 用 git status --short 与 git diff --name-only --diff-filter=U 列出冲突文件。
  2. 编辑每个文件到最终意图状态,删除所有冲突标记。不要在没有检查语义依赖的情况下直接选择一侧。
  3. 用 grep -rn '<<<<<<<\|=======\|>>>>>>>' . --exclude-dir=.git 确认没有残留标记。
  4. 暂存已解决文件并运行测试:git add <files> && npm test。
  5. 完成合并或 rebase:git commit 或 git rebase --continue。

验证

  • 工作树中没有冲突标记。
  • 测试在合并结果上通过。
  • git diff HEAD^ 展示双方意图的组合,而不是整文件替换。
  • 合并提交信息解释了不明显的解决决策。

常见问题

如果一个分支删除文件、另一个分支修改了同一文件,必须明确文件是否应存在:保留删除用 git rm,保留修改用 git add。如果测试通过但行为错误,检查语义 diff,而不只是语法;配置和生成文件中的冲突容易隐藏意图差异。

限制

自动合并工具无法推断业务意图,必须由人决定正确行为。对整个文件选择 ours 或 theirs 可能静默丢弃无关改动。预防方式是缩短分支生命周期、频繁从主分支合并,并避免在特性分支中格式化整个文件。