Git合并时丢代码是因为解决冲突时误删了他人代码而非Git故意删除,常见于全选删除后仅粘贴自认正确代码而忽略另一方的关键逻辑,如null-check、日志埋点等。

git merge 时为什么一解决冲突就丢代码
不是 Git 故意删你代码,而是你在冲突标记里只删了 、<code>=======、>>>>>> feat/login 这三行,却误删了其中一边的真实逻辑。Git 不管你留哪边,它只认你最终保存的文件内容。
- 常见错误:打开冲突文件后,直接 Ctrl+A 全选 → 按 Delete → 粘贴自己“认为正确”的那段代码 → 忘记检查另一段是否含关键修复或字段校验
- 真实风险点:被覆盖的往往是别人刚加的 null-check、参数校验、日志埋点,本地测试跑得通,线上一触发就 NPE 或数据错乱
- IDEA / VS Code 的“Accept Current Change”/“Accept Incoming Change”按钮,本质就是帮你删整段 —— 但按钮不读业务,只读文本行号,容易点错
怎么确认 merge 后没丢别人的代码
别信“没报错就算成功”,merge 提交完必须人工验证变更范围。重点不是看自己写的那几行,而是看“别人最近改过、但你没动过的区域”有没有意外消失。
- 用
git diff HEAD^ HEAD -- <file></file>对比合并提交与其父提交,聚焦查看你没碰过的函数体、配置项、SQL 字段 - 重点关注
git log -p -n 10 --grep="fix" --grep="perf"找出近期他人提交的修复/优化,再用git show <commit-hash> -- <file></file></commit-hash>确认这些改动还在不在当前 HEAD - 如果项目有 Arthas 或字节码监控,上线前在预发环境跑一次
trace,对比调用链里关键方法是否仍执行旧逻辑(比如searchEngineerHomePage是否还走慢 SQL)
git pull --rebase 能避免覆盖吗
不能自动避免,但能暴露问题更早、更干净。它把你的本地提交“挪”到远程最新基础上重放,一旦中间某次提交和远端修改冲突,就会立刻停在那个 commit,而不是等到最后 merge 阶段才堆一堆冲突。
当用户提及 GitHub URL,或要求分析、审查、探索或理解任意 GitHub 项目、仓库或代码库时,请使用此技能。触发条件包括以下短语:“分析这个项目”、“看看这个仓库”、“analyze this repo”、“what does this project do”,或消息中包含任何 github.com URL。
- 执行
git pull --rebase origin main后若卡住,说明你某个历史 commit 和远端某次修改冲突 —— 此时解决的是“你自己的提交 vs 远端”,范围小、上下文清晰 - 但前提是:你本地 commit 是原子的、有明确语义(比如 “add null check for userId”),否则 rebase 过程中要反复解决同一块代码的冲突
- 禁用
git config --global pull.rebase true全局设置 —— 它会让git pull静默变基,掩盖你本该主动检查差异的时机
谁该为线上代码丢失担责
写代码的人不背锅,点鼠标解决冲突的人要负责。Git 不会替你做判断,它只忠实执行你对冲突文件的最终保存结果。
- 责任判定锚点是 merge 提交的 author 和 committer —— 如果是
merge --no-ff生成的提交,author 是发起 merge 的人,committer 是实际执行并提交解决结果的人 - IDEA 里右键 merge 提交 → “View Merge Changes”,左侧是你本地分支(含优化代码),右侧是远端分支(旧逻辑),最终文件若和右侧一致,就是物理性丢弃
- 团队必须约定:所有 merge 操作需开启 IDE 的 “Show diff before commit” 选项,并截图存档冲突解决过程 —— 不是为了追责,是让下次有人踩坑时能快速定位“哪次 merge 把哪段逻辑弄没了”
真正难防的不是冲突本身,是冲突解决后没人去核对“别人上周加的那段防御性代码还在不在”。这步省掉,等于把代码审查交给运气。

















