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 最强大的救命工具!