⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

8.1.4 一键还原到昨天——版本回滚

代码写崩了?别慌,Git 的回滚功能就是你的后悔药——但不同的药治不同的病。

reset vs revert:核心区别

特性git resetgit revert
原理移动 HEAD 指针,"删除"历史创建新提交来"撤销"变更
历史记录会改变历史保留完整历史
已推送代码不推荐使用安全使用
适用场景本地未推送的提交已推送到远程的提交

git reset:回到过去

reset 的三种模式

bash
# --soft: 保留工作区和暂存区的变更
git reset --soft HEAD~1

# --mixed (默认): 保留工作区,清空暂存区
git reset HEAD~1

# --hard: 工作区和暂存区全部丢弃(慎用!)
git reset --hard HEAD~1
模式工作区暂存区提交历史
--soft保留保留回退
--mixed保留清空回退
--hard清空清空回退

常见使用场景

bash
# 场景1:撤销最近一次提交,但保留代码继续修改
git reset --soft HEAD~1

# 场景2:撤销最近3次提交
git reset --hard HEAD~3

# 场景3:回退到指定提交
git reset --hard abc1234

# 场景4:撤销 git add,但保留文件修改
git reset HEAD file.ts

危险操作的补救

如果不小心 reset --hard 了,可以用 reflog 找回:

bash
# 查看操作历史
git reflog

# 找到丢失的提交 hash,然后恢复
git reset --hard abc1234

git revert:创建"反向提交"

revert 不会删除历史,而是创建一个新提交来"抵消"之前的变更。

bash
# 撤销最近一次提交
git revert HEAD

# 撤销指定提交
git revert abc1234

# 撤销多个连续提交
git revert HEAD~3..HEAD

# 撤销但不自动提交
git revert --no-commit abc1234

revert 合并提交

合并提交需要指定保留哪个父分支:

bash
# -m 1 表示保留主分支(第一个父提交)
git revert -m 1 merge-commit-hash

场景决策指南

场景对照表

场景推荐命令原因
刚 commit 发现写错了git reset --soft HEAD~1保留代码继续修改
想彻底删除最近几次提交git reset --hard HEAD~n本地清理
已 push 的代码有 buggit revert HEAD不改变远程历史
想撤销某个中间提交git revert abc1234精准撤销单个提交
不小心合并了错误分支git revert -m 1 merge撤销合并

其他回滚技巧

恢复单个文件到指定版本

bash
# 恢复文件到上一个版本
git checkout HEAD~1 -- src/file.ts

# 恢复文件到指定提交
git checkout abc1234 -- src/file.ts

暂存当前工作

bash
# 临时保存当前工作
git stash

# 查看 stash 列表
git stash list

# 恢复最近的 stash
git stash pop

# 恢复指定的 stash
git stash apply stash@{1}

AI 协作指南

核心意图:告诉 AI 你的具体情况(是否已推送、是否需要保留代码)。

示例 Prompt

"我刚 push 了一个提交到 main 分支,但发现代码有严重 bug,需要立即撤销这次提交,同时保留 Git 历史完整性,应该怎么做?"

验收清单

  • [ ] 理解 reset 和 revert 的区别
  • [ ] 能根据场景选择正确的回滚方式
  • [ ] 知道如何用 reflog 找回误删的提交
  • [ ] 能使用 stash 暂存工作进度