git拉取冲突不是故障而是需人工确认的合并决策:先用git status定位unmerged paths中的冲突文件,再编辑删除>间的标记及不需要的代码块,最后git add标记解决并git commit完成合并。

远程分支合并冲突不是 Git 故障,而是它在等你确认哪段逻辑该保留——不理解三路合并的 merge base,就容易删错代码、漏掉关键修复。
git pull origin main 报 CONFLICT (content) 怎么快速定位冲突文件
Git 不会只甩一句错误就罢工,它把卡住的文件清清楚楚列在 git status 输出里。重点看带 Unmerged paths 的部分,比如:
Unmerged paths:
(use "git add <file>" to mark resolution)
both modified: src/utils/request.ts
deleted by them: package-lock.json</file>
-
git status是唯一可信源,别信 IDE 状态栏(尤其旧版 VS Code 在暂存区混乱时经常漏标) - 如果要脚本化排查,可用
git ls-files -u查 stage 1/2/3 的 blob,但日常够用的只有git status - 注意
deleted by them这类状态:说明对方删了文件,而你改了它——这不是文本冲突,是语义冲突,手动删完还得git rm <file></file>
冲突标记 >>>>>> feature/login 怎么删才安全
这些不是装饰,是 Git 划出的决策边界。删之前必须核对三件事:
后面是你当前分支(比如 <code>main)的最新修改-
=======是分隔线,不能只删它,必须连同不需要的代码块一起处理 -
>>>>>> feature/login后面是对方分支的改动,如果那段逻辑已废弃(比如调用一个下线接口),得整块删,不能只留“看起来干净”的片段 - 改完后必须执行
git add <file></file>,否则git commit会被拒绝——Git 仍认为该文件处于未解决状态
为什么不能用 --force 或重置暂存区跳过冲突解决
因为 git pull origin main 本质是 git fetch + git merge,跳过冲突等于绕过三路合并逻辑:
- 强制提交可能丢掉别人刚合入的关键修复,尤其是涉及配置变更或权限校验的代码
- 如果冲突含文件删除/重命名(如 A 分支删了
utils/old.js,B 分支改了它),跳过会导致该文件在工作区“复活”但未被 Git 追踪,CI 流水线可能因检测到非 fast-forward 合并失败 -
git log --graph会显示异常分叉,后续git revert或git bisect都可能失效
merge base 被忽略时最常踩的坑
多数“诡异丢失”其实源于没意识到 merge base 是谁。比如:
- 你在
main上开发一周,期间团队已合入 5 次 PR,但你一直没git pull;此时 merge base 是你 checkout 时的旧 commit,不是最新的maintip - 用
git merge --squash合并后又反悔,再git merge会触发新冲突——因为 squash 不产生 merge commit,Git 找不到共同祖先 - 远程分支被 force push 过,本地
origin/main的 ref 已失效,git pull实际 fetch 的是旧历史,merge base 错位
复杂点永远在 merge base 的归属上,而不是编辑器里删几行标记。











