如何回退到之前的某个提交
回退到历史提交:本地未推送用 git reset --hard <提交哈希>(彻底回到该点);已推送用 git revert 逐个反向提交保持历史不改写。只想看看旧代码用 git checkout <哈希>(游离 HEAD)。
看是否已推送:未推送的本地分支直接 git reset --hard <提交哈希> 回到该点(之后的提交从分支上消失);已推送的用 git revert 生成反向提交,历史前进式回退,不改写已有历史,但仍可能冲突并影响后续合并。
方式一:reset 回退(未推送)
git log --oneline # 找到目标提交
git reset --hard a1b2c3d # 会丢弃跟踪文件未提交改动,也可能删除阻挡写入的未跟踪路径
# 以下是替代方案,不能在 hard 之后用来恢复被覆盖的改动
# soft 只移动 HEAD,保留原工作区与暂存区状态:
git reset --soft a1b2c3d
方式二:revert 回退(已推送)
# 仅适用于确认不含合并提交的线性范围,先检查提交图
git revert a1b2c3d..HEAD # 不含 a1b2c3d 本身;合并提交需单独指定 -m 主线
git push
历史不被改写,但可能冲突;revert 合并提交还会影响未来重合并行为,需先明确主线和意图。
方式三:只是看看(不改动分支)
git checkout a1b2c3d # 游离 HEAD,看旧代码/跑旧版本
git switch - # 回到之前的分支
找回 reset 掉的内容
git reflog # 找到回退前的提交哈希
git branch recovery <哈希> # 先建立恢复分支,不覆盖当前工作区
reflog 和对象都有保留期限,不能恢复所有未提交改动,也不能保证永久找回。
常见问题(FAQ)
Q:回退后 push 被拒?
reset 改写了已推送的历史,需要 --force-with-lease。共享分支先沟通。
Q:只想回退某个文件而不是整个仓库?
git restore --source=a1b2c3d -- 路径,其他文件不动。
Q:回退到一半发现目标选错了?
git reflog 记录了 HEAD 的每一次移动,在记录和对象仍保留时,可用于定位此前的提交位置。