Git冲突解决需三步:删除冲突标记后手动编辑、git add暂存、git commit提交;跳过任一环节会导致MERGING状态卡住。

能直接用命令行解决,但必须配合手动编辑和明确的提交动作,不能只靠git merge自动收尾。
看到冲突标记后该删哪些行
Git 插入的冲突标记是三段式结构:<<<<<< HEAD、=======、>>>>>> BRANCH-NAME。这三行本身不是代码,只是边界标识,必须全部删除。
-
<<<<<< HEAD和=======之间是你当前分支(HEAD)的修改 -
=======和>>>>>> BRANCH-NAME之间是待合并分支的内容 - 中间不能留空行或残留标记,否则
git add会失败,git status仍显示“unmerged”
解决完必须执行git add再git commit
很多人卡在这一步:改完文件、保存、以为完事了,结果git status还是提示“both modified”,git merge也卡住不动。这是因为 Git 不会自动把已编辑的文件视为“已解决”——你得显式告诉它:“这个文件我处理完了”。
- 对每个冲突文件,运行
git add <file>(或git add .批量) - 然后必须运行
git commit(不加-m会打开编辑器让你写提交信息) - 如果跳过
git add直接git commit,Git 会报错:no changes added to commit
遇到“修改/删除”类冲突时别硬改文件
当一个分支修改了utils.js,另一个分支直接删了它,git status会显示deleted by us或deleted by them,而不是插入<<<<<<标记。
- 想保留文件:运行
git restore --source=HEAD --staged --worktree utils.js(恢复你改的版本),再git add utils.js - 想删除文件:运行
git rm utils.js(不是rm命令),再git add utils.js - 用
rm utils.js手动删会导致git status显示deleted但未暂存,后续git commit会失败
用git checkout --ours或--theirs快速取舍
对纯内容冲突(比如两人都改了同一函数签名),不想逐行编辑,可以用 Git 内置策略快速覆盖:
-
git checkout --ours path/to/file.js:保留当前分支(HEAD)的全部内容 -
git checkout --theirs path/to/file.js:采用待合并分支的全部内容 - 执行后仍需
git add+git commit,否则不生效 - 注意:
--ours/--theirs在git rebase中含义相反,这里只针对git merge场景
真正容易被忽略的是:冲突解决不是“改完保存就结束”,而是“编辑 → 暂存 → 提交”三个不可省略的动作链。少任何一个,Git 就认为你还没做完,分支状态会一直卡在 MERGING,后续pull、push、甚至切换分支都会被阻止。


















