本文最后更新于167 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

1. 初始状态分析
- 当前分支:
local分支(local*表示当前所在分支),main指向c1,pushed指向c2,local指向c3。 - 提交历史:
c0 → c1分叉为pushed(c2)和local(c3)。 - 目标结构:
- 需撤销
c3(local分支的提交)或c2(pushed分支的提交); - 最终保留
c0 → c1 → c2'(c2'是c2的调整版),local合并到main,pushed指向c2'。
- 需撤销
2. 核心概念:撤销变更的两种方式
git reset:直接 “回退” 分支指针,丢弃提交(危险,会丢失历史,适合本地未推送的提交)。- 语法:
git reset <提交哈希>(默认--mixed,移动指针 + 保留工作区修改);git reset --hard <提交哈希>(强制回退,丢弃修改)。
- 语法:
git revert:创建新提交 “抵消” 旧提交的修改(安全,保留历史,适合已推送的提交)。- 语法:
git revert <提交哈希>(生成新提交,反转旧提交的修改)。
- 语法:
3. 通关步骤(分阶段执行)
阶段 1:撤销 local 分支的 c3 提交(用 git reset)
当前 local 分支指向 c3,目标需移除 c3,可通过 git reset 回退到 c1(local 的父提交)。
执行命令:
bash
git reset c1
- 作用:
local分支指针从c3强制回退到c1;- 工作区和暂存区的修改被丢弃(
--hard模式),local*指向c1。
阶段 2:调整 pushed 分支(用 git revert 或 reset)
目标中 pushed 需指向 c2'(调整后的 c2),假设 c2 是已推送的提交,用 git revert 更安全:
- 切换到
pushed分支:bash git checkout pushed- 作用:
HEAD依附到pushed分支(指向c2)。
- 作用:
- 执行
git revert c2:bash git revert c2- 作用:生成新提交
c2',反转c2的修改,pushed分支指向c2'(结构:c0 → c1 → c2 → c2')。
- 作用:生成新提交

4. 关键知识点延伸
resetvsrevert选择:- 本地未推送的提交:用
git reset快速回退(如local分支的c3,未推送到远程)。 - 已推送的提交:用
git revert生成新提交抵消(如pushed分支的c2,已推送到远程,避免队友冲突)。
- 本地未推送的提交:用
- 实际场景:
- 开发中误提交本地代码:
git reset --hard HEAD^回退。 - 线上环境发现 bug 提交:
git revert <提交哈希>安全修复。
- 开发中误提交本地代码:
简单说,这关的核心是 “根据提交是否推送,选择 reset 或 revert 撤销变更”,掌握 Git 中安全撤销历史的两种策略,避免代码丢失或协作冲突 。







