git reset 重置命令——版本控制的后悔药
命令简介
分支在版本库的引用目录(.git/refs)中体现为一个引用文件.git/refs/heads/branchName,其内容就是分支中最新提交的提交ID。
git reset 命令通常用于将分支引用文件的内容重置为指定的<commit>,并使用指定<commit>下的文件替换掉暂存区中文件,而工作区不会受到影响。
当我们想要丢弃错误/意外的提交,又或者想要恢复到某个历史版本的提交时,就可以使用git reset命令。
<commit> 和 HEAD
<commit>可以是提交ID(SHA1值),也可以是引用,引用相当于提交ID的别名。例如,下图中的分支名main就是一个引用(通常分支名又被称为游标 ),其指向当前分支的最新提交(01b5ef8)。在不引起歧义的情况下可以不必输入完整的提交ID,只需要输入前几位数字即可。
HEAD被称为头指针,也是一个引用,更准确地说,HEAD是引用的引用,HEAD一般指向当前分支。如下图所示,HEAD指向main分支(工作区当前分支),而main指向(01b5ef8)提交,所以HEAD就间接地指向了(01b5ef8)提交。
git reset <commit>
git reset <commit>
命令执行上图中的全部操作1、2,即:
1、使用指定<commit>替换引用的指向,引用指向新的提交ID.。
2、使用指定<commit>下的文件替换掉暂存区中文件,重置暂存区。
在上图的例子中,执行如下命令可将引用重置为(89c49db)提交。
$ git reset 89c49db
执行结果如下图所示,main游标的值被重置为(89c49db),暂存区中的文件被(89c49db)提交中的文件替换。而工作区中的文件则没有受到影响,因此我们最新的改动不会丢失。
进阶:git reset [--soft | --mixed | --hard] <commit>
git reset 命令可以根据不同的选项,对暂存区或工作区进行重置。
--soft 参数
使用--soft参数,如 git reset --soft <commit> 只会执行操作1,即:只更改引用的指向,不改变暂存区和工作区。
--mixed 参数
使用--mixed 参数或不使用参数(默认为--mixed ),如 git reset <commit> 会执行操作1、2,即:更改引用的指向及重置暂存区,但是不改变工作区。
--hard 参数
使用--hard 参数,如 git reset --hard <commit> 会执行全部操作1、2、3,即:更改引用的指向及重置暂存区和工作区。使用此参数将会同时丢失暂存区和工作区的更改。
<commit>对象访问方式
<commit>可以省略(默认为HEAD),根据选项参数重置暂存区或工作区,而引用不会改变,因为引用重置到HEAD相当于没有重置。
SHA1哈希值 代表指定的提交;
HEAD 代表当前分支最近一次提交;
HEAD^^^……(n个^) 代表HEAD的第n个父提交;
HEAD~n 同HEAD^^^……(n个^);
HEAD^n 代表HEAD多个父提交中的第n个父提交;
main 代表main分支最近一次提交;
refs/heads/main 同main,是main的全称;
总结
git reset 用于重置分支为指定的提交;
git reset 的修改对象是分支游标,如上图的main;
<commit> 默认为HEAD;
根据不同选项参数可重置暂存区或工作区;
选项参数默认为--mixed。