

























一、本次多余 Merge 的完整产生过程(我的操作全程还原)
1. 前置状态
我本地有自己的代码改动,并且已经本地 commit 提交,此时本地提交历史领先远程分支。
2. 问题操作:直接使用 git pull 更新代码
我准备推送代码前,为了同步远程最新代码,没有使用 rebase,而是直接执行了普通 git pull。
3. 触发分叉产生 Merge
此时远程当前分支有新的更新提交,本地有自己的新提交,本地与远程历史形成两条分叉代码线。
普通 git pull 的机制:遇到分叉不会自动叠平代码,而是自动生成一条新的 Merge 合并提交,强行把两边代码合并到一起。
4. 最终结果
分支历史出现分叉、多出一条无用 Merge 记录,分支历史变乱,后续提交流线不纯净,影响合码、回溯、代码规整性。

图片上前两笔是我的,第三笔是L的;
git log --oneline --graph:显示:
* xxxxxxxx 【合并提交M 我】 |\ | * b7eea90 【 L】 * 585c76f 【 U 我】
先使用reset+push的方法尝试:发现出现了对方提交的代码的丢失;reset一笔,丢失了merge和L的提交,reset 两笔直接我和L的都丢失了;
二、为什么普通方法删不掉 Merge,还会丢代码?(所有翻车原因)-------使用reset+push的方法;
1. 使用 git reset HEAD~1 翻车原因
分支结构:Merge(顶部)包裹两条分叉,一条是远程更新提交,一条是我的本地提交。
HEAD~1 只会退回 Merge 的上一级,也就是停留在「我的旧提交」,直接丢失远程所有更新代码。
2. 使用 git reset HEAD~2 翻车原因
一次性回退两步,直接删掉我的提交 + 远程更新提交,所有新增代码全部清空。
三、
正确思路:重构线性历史
1. 先回到「远程干净更新节点」(保留远程最新代码)此时有Merge ,L, U;
2.切到了的那笔commit上
3. 再把自己的改动重新叠加在最上方
3. 最终历史变成:远程更新提交 → 个人修改提交
4. 彻底干掉 Merge、无分叉、两边代码全部保留、只改动自己分支
四、标准修复步骤(最终可落地正确流程)
1. 紧急兜底:恢复本地与远程个人分支一致
git
checkout 个人分支名
git fetch origin
git reset --hard origin/个人分支名
2. 查看分叉结构,拿到两个关键哈希
git
log --oneline --graph
L = 远程更新提交哈希
U = 个人修改提交哈希
* xxxxxxxx 【合并提交M】 |\ | * b7ee890 【L】 * 585cb6f 【 U】
3. 重置基线到远程更新节点(丢掉Merge,保留远程代码)
在本地切到L的那笔提交上(这个并不是分支的意义,是L开发的时候他自己的分叉)
git
reset --hard L
4. 叠加自己的改动(不会空、不会丢)
把我的这笔修改pick到L的分叉上
git
cherry-pick U
5. 强推覆盖自己分支(仅改动个人分支)
git
push -f
五、彻底根治:以后再也不产生 Merge
以后本地有代码、需要同步远程更新,禁止直接 git pull
统一使用:
git
pull --rebase
效果:自动线性平铺代码,远程代码在前、我的代码在后,永远不会生成 Merge 提交。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。