#### 重置命令的用法
用法一:git reset [-q] [<commit>] [--] <paths>... 为了避免路径和引用(或提交ID)同名而发生冲突,可以在<paths>前用--作为分隔
用法二:git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
<commit>为可选项,可以使用引用或提交ID,若忽略<commit>则相当于使用了HEAD的指向作为提交ID
第一种用法不会重置引用,更不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件;第二种用法则会重置引用,根据不同选项对暂存区或工作区进行重置。
动作1:替换引用的指向,引用指向新的提交ID
动作2:替换暂存区,替换后,暂存区的内容和引用指向的目录树一致
动作3:替换工作区,替换后,工作区的内容和暂存区一致,也和HEAD指向的目录树内容相同。
--soft执行1;--mixed执行1、2;--hard执行1、2、3
git reset 仅用HEAD指向的目录树重置暂存区,工作区不受影响,相当于将之前用git add命令更新到暂存区的内容撤出暂存区,引用也未改变,因为引用重置到HEAD相当于没有重置。
git reset -- filename 仅将文件filenmae的改动撤出暂存区,暂存区中其他文件不该变,相当于git add filename的反向操作
#### 挽救错误的重置
通过.git/logs目录下日志文件记录了分支的变更,默认非裸版本库(带有工作区)都提供分支日志功能,因为core.logallrefupdates的值为true
Git提供了一个git config命令,对这个文件进行操作。使用show子命令可以显示此文件的内容。查看git reflog的输出和直接查看日志文件最大的不同在于显示顺序的不同,即最新改变放在了最前面显示,而且只显示每次改变的最终的SHA1哈希值。输出还有一个方便的表达式:<refname>@{<n>},含义是引用<refname>之前第<n>次改变时的SHA1哈希值。
~~~
$ git reflog show master | head -5
~~~