重置命令(git reset)是Git 最常用的命令之一,也是最危险最容易误用的命令。来看看git reset命令用法。
-----------------------------------------------------------------------------------------------------------
用法一:git reset [-q] [<commit>] [--] <paths》.....
用法二:git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
-----------------------------------------------------------------------------------------------------------
上面列出了两个用法,其中<commit>都是可选项,可以使用引用或提交ID,如果省略<commit>则相当于使用了HEAD的指向作为提交ID.
上面列出的两种祖坟的区别在于,第一种用法在命令中包含路径<paths>.为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前用两个连续的短线(减号)作为分隔。
第一种用法(包含了路径<paths>的用法)不会重置引用,更不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件。例如命令git reset HEAD <paths>相当于取消之前执行的git add <paths>命令时改变的暂存区。
第二种用法(不使用路径<paths>的用法)则会重置引用。根据不同的选项,可以对暂存区或工作区进行重置。参照下面的版本库模型图,来看一看不同的参数对第二种重置语法的影响。
使用参数 --hard, 如:git reset --hard <commit>.
会执行上图中的全部动作1,2,3,即:
1.替换引用的指向。引用指向新的提交ID.
2.替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
3.替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。
使用参数 --soft, 如:git reset --soft <commit>.
会执行上图中的操作1。即只更改引用的指向,不改变暂存区和工作区。
使用参数 --mixed或不使用参数(默认为 --mixed),如:git reset <commit>.
会执行上图中的操作1和操作2.即更改引用的指向及重置暂存区,但是不改变工作区。
下面通过一些示例,看一下重置命令的不同用法。
命令:git reset
仅用HEAD指向的目录树重置暂存区,工作区不会受到影响,相当于将之前用git add命令更新到暂存区的内容撤出暂存区。引用也未改变,因为引用重置到HEAD相当于没有重置。
命令:git reset HEAD
同上
命令:git reset -- filename
仅将文件filename 的改动撤出暂存区,暂存区中其它文件不改变。相当于对命令git add filename 的反操作。
命令:git reset HEAD filename
同上
命令:git reset --soft HEAD^
工作区和暂存区不改变,但是引用向前回退一次。当对最新提交的提交说明或提交的更改不满意时,撤销最新的提交以便重新提交。
命令:git reset HEAD^
工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。
命令:git reset --mixed HEAD^
同上
命令:git reset --hard HEAD^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自行一次以来的提交全部丢失。