git回退与恢复
Git 中必须先理解的三个区域
Git 的核心在于“三个区域”概念:
| 区域 | 含义 |
|---|---|
| 工作区(Working Directory) | 你电脑里的项目文件 |
| 暂存区(Staging Area) | 准备提交的临时区域 |
| 本地仓库(Local Repository) | 已提交的历史版本 |
| 远程仓库(Remote Repository) | GitHub/GitLab 上的版本 |
理解这三个区域后,你才知道“回退”到底在回什么。
工作区回退(未 add 的恢复)
如果你只是改乱了文件,还 没有执行 git add,恢复非常简单:
恢复单个文件:
git checkout -- 文件名
示例:
git checkout -- src/main.js
恢复所有未 add 的改动:
git checkout .
作用:恢复到最近一次提交版本。但注意:无法恢复新增的未被 Git 管理的文件。
暂存区恢复(取消 add)
如果你已经 git add . 了,但想撤销暂存区内容:
撤回全部暂存区文件:
git reset HEAD .
撤回指定文件:
git reset HEAD 文件名
示例:
git reset HEAD src/App.vue
文件将从“暂存区”回到“工作区”,内容不会丢失。
修改最后一次提交(不改变历史)
如果你刚提交完,发现:
- 提交描述写错了
- 漏提交文件
可以修改最后一次提交:
git commit --amend
如果还要追加新的文件:
git add .
git commit --amend
这不会创建新的 commit,只是修改最后一个提交。
本地提交回退(安全 / 危险两种方式)
Git 回退 commit 时有两个关键操作:
| 命令 | 是否修改历史 | 是否丢代码 |
|---|---|---|
| git revert | ❌ 不修改历史 | 不丢代码 |
| git reset | ✔ 修改历史 | 视选项是否丢代码 |
方法 1:git revert(安全,不会丢任何代码)
适用于:已经推到远程仓库 的提交。
撤销一个提交:
git revert <commitId>
撤销多个提交:
git revert <start>..<end>
revert 会生成一个“反向提交”,历史不会改变,最安全。
方法 2:git reset(最常用,但可能丢代码)
Git reset 有三种模式:
| 命令 | 暂存区 | 工作区 | 说明 |
|---|---|---|---|
--soft |
不变 | 不变 | 只回退提交 |
--mixed(默认) |
清空 | 不变 | 回退提交 + 回退暂存区 |
--hard |
清空 | 清空 | 彻底回退,代码会消失 |
1)软回退(不影响代码)
git reset --soft HEAD^
作用:
- 回到上一个版本
- 所有代码还在
- 改动还在暂存区
常用于:重新合并提交、修改 commit 内容。
2)默认回退(代码保留在工作区)
git reset HEAD^
作用:
- 提交回退
- 暂存区清空
- 修改还在你的文件里
适用于:重新提交一次。
3)硬回退(代码彻底清除,危险!)
git reset --hard HEAD^
效果:
- 提交回退
- 暂存区清空
- 工作区清空
= 回退到上一个提交的状态,一切未提交的代码全部丢失。
回退指定提交
假设提交链如下:
A - B - C - D - E (HEAD)
回到 C:
保留代码:
git reset --mixed C
彻底回退(危险):
git reset --hard C
删除已推送远程的错误提交(强推)
注意:会导致远端历史变更,慎用!
git reset --hard commitId
git push -f
适用于:
- 私有项目
- 你确定其他人没有基于错误提交开发
找回 reset --hard 丢失的代码
Git 很少真正删除东西。
使用:
git reflog
你会看到所有 HEAD 的移动记录:
c7e02dd HEAD@{0}: reset: moving to HEAD^
bf123ad HEAD@{1}: commit: new feature
...
找回特定版本:
git reset --hard bf123ad
reflog是 Git 最强大的救命工具!
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝