本文最后更新于47 天前,其中的信息可能已经过时,如有错误请发送邮件到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. 关键知识点延伸
reset
vsrevert
选择:- 本地未推送的提交:用
git reset
快速回退(如local
分支的c3
,未推送到远程)。 - 已推送的提交:用
git revert
生成新提交抵消(如pushed
分支的c2
,已推送到远程,避免队友冲突)。
- 本地未推送的提交:用
- 实际场景:
- 开发中误提交本地代码:
git reset --hard HEAD^
回退。 - 线上环境发现 bug 提交:
git revert <提交哈希>
安全修复。
- 开发中误提交本地代码:
简单说,这关的核心是 “根据提交是否推送,选择 reset
或 revert
撤销变更”,掌握 Git 中安全撤销历史的两种策略,避免代码丢失或协作冲突 。