# git reset

git reset 命令的作用是回退版本,可以回退到期望的某一次提交。

git reset [--soft | --mixed | --hard] [HEAD]
1

# 一、工作区域

  • 1、工作区(Working Directory):写代码的目录,项目代码存放目录 -- git add 之前的目录
  • 2、暂存区(index/stage):工作区和代码仓库之前的缓存地带。用 git add 把文件代码添加进去。-- git add 之后的目录
  • 3、仓库区:git commit 之后,代码提交到的地方,也就是本地仓库。

# 二、--mixed

--mixedgit reset 的默认值。

也就是 git reset 等价于 git reset --mixed

命令效果:

  • 1、重置暂存区文件。
    • (1)、历史记录保持不变,也就是不会更改仓库区;
    • (2)、暂存区内容撤销,回到工作区
    • (3)、工作区原有内容保持不变,就是工作有为 git add 的内容,也仍然保持不变,暂存区的内容会添加到工作区
  • 2、原有文件内容的变更: 修改内容还在只是变成 git add 之前的状态;
  • 3、关于目录文件的变更:
    • (1)、新增文件:文件仍然存在,只是变成 git add 之前的状态;
    • (2)、删除文件:目录仍然不存在,只是变成 git add 之前的状态;

`git add` 之前的状态

在执行 git status 时候,红色的部分代表是:git add 之前的状态;绿色部分代表是:git add 之后 git commit 之前 的状态。

git reset

# 三、--soft commitId

使用场景:

代码已经commit。

命令效果:

  • 1、移动当前 HEAD 指针回到上一个 commit或者指定的commitID,从仓库删除 当前 commit,提交内容撤回到 暂存区;
  • 2、暂存区和工作区 原本存在的内容不改变,另外撤销内容回到暂存区;
  • 3、关于目录文件的变更:
    • (1)、新增文件:文件仍然存在,只是变成 git add 之后的状态;
    • (2)、删除文件:目录仍然不存在,只是变成 git add 之后的状态;

git reset --soft

TIP

如果 commitId 不是上一个commit,那么会将 commitId之前的所有操作撤回到 暂存区。

# 四、–-hard

git reset --hard DEAD|commitId
1

参数撤销工作区和暂存区中所有未提交的修改内容。

命令效果:

  • 1、将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交,当前 HEAD 指针可能改变,工作区和暂存区内容清空;
  • 2、原有文件内容的变更:修改内容丢失(修改的代码不会变成未add的状态);
  • 3、目录结构的变更(增加或者删除文件):新增文件丢失、删除的文件相当于没删。

git reset --soft git reset --soft

TIP

如果 DEAD 或者 commitId 为上一条commit id,HEAD 指针不变;

如果 commitId 为更早的commit id,HEAD 指针指向对应的 commit。

版本回退注意

如果执行了 git reset --hard 较早的commitId,这时候要保证协作的同事都做了本地和远程的代码更新。