重置命令是git最常用的命令之一,也是最危险最容易误用的命令之一。
- git reset [-q] [<commit>] [--] <paths>...
- git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
- 上面列出了两个用法,其中<commit>都是可选项,可以使用引用或提交ID,如果省略<commit>则相当于使用了HEAD的指向作为提交id。
- 上面列出了两种用法的区别在于,第一种用法命令中包含路径<paths>.为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前面两个连续的短线(减号)作为分隔。
- 第一种用法(包含了路径<paths>的用法),不会重置引用,更不会改变工作区,而是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的文件。例如命令git reset HEAD <paths>相当于取消之前执行的git add <paths>命令时改变的暂存区。
- 第二种用法(不使用有路径<paths>的用法)则会重置引用。根据不同的选项,可以对暂存区或者工作区进行重置。
- 命令格式:git reset [--soft | --mixed | --hard] [<commit>]
- 使用参数--hard,如:git reset --hard <commit>会执行上图中的全部动作1,2,3即:
- 替换引用的指向,引用指向新的提交ID
- 替换暂存区,替换后,暂存区的内容和引用指向的目录树一致
- 替换工作区,替换后,工作区的内容变得和暂存区一致,也和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^ 彻底撤消最近的提交,引用回退到前一次,而且工作区和暂存区都会退到上一次提交的状态,自上一次以来的提交全部丢失。