git reset
命令用于回退版本,可以指定退回某一次提交的版本。
01 前期了解之 HEAD
简单了解下 HEAD :它类似于指针,指向当前所在分支提交至仓库的最新一次的 commit。
用法 | 含义 |
---|---|
HEAD = HEAD~0 = HEAD^0 | 表示当前提交 |
HEAD~ = HEAD~1 = HEAD^ | 表示上 1 次提交 |
HEAD~~ = HEAD~2 = HEAD^^ | 表示上 2 次提交 |
HEAD{n个~} = HEAD~n = HEAD{n个^} | 表示上 n 个提交(n >= 0) |
02 实际用法之 reset
--mixed
:默认参数。用于重置暂存区的文件,回到某次的提交,工作区保持不变。
# 使用上一次提交重置暂存区
# 方式 01 - 使用 HEAD
$ git reset --mixed HEAD^ 或 git reset HEAD^
# 方式 02 - 使用 commitId
$ git reset --mixed <commitId> 或 git reset <commitId>
--soft
:用于回退到某个版本,暂存区和工作区都不会被改变。
# 将提交记录回退一次,暂存区和工作区代码不变
# 方式 01 - 使用 HEAD
$ git reset --soft HEAD^
# 方式 02 - 使用 commitId
$ git reset --soft <commitId>
--hard
:撤销工作区中所有未提交的修改内容,将暂存区与工作区都重置到某个版本。
# 使用最新一次提交重置暂存区和工作区
# 方式 01 - 使用 HEAD
$ git reset --hard HEAD^
# 方式 02 - 使用 commitId
$ git reset --hard <commitId>
- mixed、soft、hard 对比效果图如下:
03 reset 后如何恢复
执行 reset 命令之后,HEAD 会指向历史的某个 commit ,但后面的 commit 其实依然存在的,只是看不到了。那么问题来了,如何恢复 reset 掉的 commit 呢?答案是:使用 git reflog
+ git reset
,即用 reflog 查到操作记录的 id,再使用 reset 回到该 id!
git log:查看所有提交过的信息,不包括回退的提交;
git reflog: 查看所有分支的所有 git 操作记录,包括回退的提交;
实例如下:
# 回退上一次的提交记录👇
# 01 查看最新的提交记录
$ git log --oneline
--->>
2b2fefa (HEAD -> dev) modify hello
91dd367 modify world
69322b6 init
---<<
# 02 回退到上一个提交
$ git reset --hard HEAD^
--->>
HEAD is now at 91dd367 modify world
---<<
# 03 查看回退后的提交记录,已经回退成功!
$ git log --oneline
--->>
91dd367 (HEAD -> dev) modify world
69322b6 init
---<<
# 此时想要恢复到回退掉的提交👇
# 01 查看所有的 git 操作记录,找到对应的标识( HEAD@{1} 或 2b2fefa)
$ git reflog
--->>
91dd367 (HEAD -> dev) HEAD@{0}: reset: moving to HEAD^
2b2fefa HEAD@{1}: commit: modify hello
69322b6 HEAD@{2}: commit: init
---<<
# 02 回退到之前的操作
$ git reset --hard HEAD@{1}
--->>
HEAD is now at 2b2fefa modify hello
---<<
# 03 回退(恢复)成功!
$ git log --oneline
--->>
2b2fefa (HEAD -> dev) modify hello
91dd367 modify world
69322b6 init
---<<
04 reset 和 revert 的区别
git reset
和 git revert
都能重置版本,且都需要谨慎使用,但这两个命令有着不同的效果:
命令 | 描述 |
---|---|
git reset | 将 HEAD 指针指到指定提交,历史记录中不会出现放弃的提交记录。 |
git revert | 放弃指定提交的修改,以前的历史记录都在。它会生成一次新的提交去反转需要放弃的修改,该提交需要填写 commit 信息。 |