如何回退到之前的某个提交

回退到历史提交:本地未推送用 git reset --hard <提交哈希>(彻底回到该点);已推送用 git revert 逐个反向提交保持历史不改写。只想看看旧代码用 git checkout <哈希>(游离 HEAD)。

最佳实践
Git 提交历史与版本恢复示意

看是否已推送:未推送的本地分支直接 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 的每一次移动,在记录和对象仍保留时,可用于定位此前的提交位置。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台