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 :默认参数。用于重置暂存区的文件,回到某次的提交,工作区保持不变。
$ git reset --mixed HEAD^ 或 git reset HEAD^
$ git reset --mixed <commitId> 或 git reset <commitId>
--soft :用于回退到某个版本,暂存区和工作区都不会被改变。
$ git reset --soft HEAD^
$ git reset --soft <commitId>
--hard :撤销工作区中所有未提交的修改内容,将暂存区与工作区都重置到某个版本。
$ git reset --hard HEAD^
$ git reset --hard <commitId>
03 reset 后如何恢复
执行 reset 命令之后,HEAD 会指向历史的某个 commit ,但后面的 commit 其实依然存在的,只是看不到了。那么问题来了,如何恢复 reset 掉的 commit 呢?答案是:使用 git reflog + git reset ,即用 reflog 查到操作记录的 id,再使用 reset 回到该 id!
git log:查看所有提交过的信息,不包括回退的提交; git reflog: 查看所有分支的所有 git 操作记录,包括回退的提交;
实例如下:
$ git log --oneline
--->>
2b2fefa (HEAD -> dev) modify hello
91dd367 modify world
69322b6 init
---<<
$ git reset --hard HEAD^
--->>
HEAD is now at 91dd367 modify world
---<<
$ git log --oneline
--->>
91dd367 (HEAD -> dev) modify world
69322b6 init
---<<
$ git reflog
--->>
91dd367 (HEAD -> dev) HEAD@{0}: reset: moving to HEAD^
2b2fefa HEAD@{1}: commit: modify hello
69322b6 HEAD@{2}: commit: init
---<<
$ git reset --hard HEAD@{1}
--->>
HEAD is now at 2b2fefa modify hello
---<<
$ 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 信息。 |
|