git 合并卡住并非死锁,而是因内容冲突主动暂停,需手动解决冲突后提交。常见原因包括并行修改同一文件、相同行修改、文件删除与修改等,解决后需 git add 和 git commit 完成合并。

Git 从不“死锁”,它只是暂停合并,等你确认哪段代码该留下。 所谓“远程分支合并卡住”,本质是 git pull origin main(即 fetch + merge)触发了内容冲突,Git 主动停在中间状态,不让你稀里糊涂覆盖别人改的逻辑。
看到 CONFLICT (content) 和
别扫屏幕错误信息——它只告诉你“有冲突”,不告诉你“在哪”。真正可信的是 git status 输出里带 Unmerged paths 的行,比如:
Unmerged paths: both modified: src/utils/date.ts deleted by them: package-lock.json
这些才是必须处理的文件。注意:
-
both modified:两边都改了同一文件,最常见; -
deleted by them:对方删了这个文件,你却改了它,Git 不知道该保留文件还是尊重删除; -
added by them:对方加了新文件,你本地也有同名未跟踪文件,可能覆盖或冲突; - 别信 IDE 状态栏高亮——VS Code 旧版本在暂存区混乱时会漏标或误标,
git status --short输出里的UU才是铁证。
手动删冲突标记前必须确认三件事
打开一个带 的文件,不是删掉三行就完事。你删的不是符号,是决策依据:
到 <code>=======之间,是当前分支(比如feature/login)的最新修改;-
=======到>>>>> main之间,是远程main分支的改动; - 中间没被标记的代码,是双方都没动的“安全区”,不能乱碰;
- 删完标记后,必须保证语法合法:JSON 补逗号、JS 补分号、Python 缩进对齐,否则
git commit会直接失败。
git add 后还不能直接 git commit?
能提交的前提是:所有冲突文件都已 git add 过。Git 把“解决冲突”和“标记解决”严格分开——删完标记只是改了工作区,git add 才是告诉 Git:“这个文件我理清楚了,从 Unmerged 状态移出来”。漏掉这步,git commit 会报:
fatal: cannot do a partial commit during a merge
常见操作误区:
- 用
git add .图省事 → 可能误加本不该进本次合并的临时调试代码; - 只
git add了部分冲突文件 → 其余文件仍卡在Unmerged,commit 失败; - 改完文件后没保存就
git add→ 实际添加的是旧内容,冲突还在; - 用
git checkout --ours或--theirs批量覆盖 → 在rebase场景下含义反转,极易丢逻辑。
为什么 git merge --abort 比硬改更值得先试
如果你刚执行 git pull origin main 就发现一堆冲突,且不确定怎么融合,最安全的第一反应不是开编辑器,而是:
git merge --abort
它会立刻退回到 pull 前的状态,工作区和暂存区全还原,零风险。之后你可以:
- 先
git diff ...origin/main看看远程到底改了啥; - 用
git log --oneline --graph origin/main ^HEAD快速扫一眼对方最近几个提交干了什么; - 再决定是手修、用
git mergetool,还是干脆git rebase origin/main换个方式重放自己的提交。
真正的复杂点不在标记怎么删,而在于:你得看懂那三段代码各自的业务意图。HEAD 那段是不是已经废弃的兼容逻辑?REMOTE 那段是不是刚加的权限校验?跳过理解直接留“看起来更短”的那段,往往就是线上 bug 的起点。











