7.3 深入了解git reset命令
重置命令(git reset)是Git最常用的命令之一,也是最危险最容易误用的命令。来看看git reset命令的用法。
用法一:git reset[-q][<commit>][—]<paths>…
用法二:git reset[—soft|—mixed|—hard|—merge|—keep][-q][<commit>]
上面列出了两个用法,其中<commit>都是可选项,可以使用引用或提交ID,如果省略<commit>则相当于使用了HEAD的指向作为提交ID。
上面列出的两种用法的区别在于,第一种用法在命令中包含路径<paths>。为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前用两个连续的短线(减号)作为分隔。
第一种用法(包含了路径<paths>的用法)不会重置引用,更不会改变工作区,而
仅将文件filename的改动撤出暂存区,暂存区中其他文件不改变。相当于对命令git add filename的反向操作。
命令:git reset HEAD filename
同上。
命令:git reset—soft HEAD^
工作区和暂存区不改变,但是引用向前回退一次。当对最新提交的提交说明或提交的更改不满意时,撤销最新的提交以便重新提交。
在之前曾经介绍过一个修补提交命令git commit—amend,用于对最新的提交进行重新提交以修补错误的提交说明或错误的提交文件。修补提交命令实际上相当于执行了下面两条命令。(注:文件.git/COMMIT_EDITMSG保存了上次的提交日志。)
$git reset—soft HEAD^
$git commit-e-F.git/COMMIT_EDITMSG
命令:git reset HEAD^
工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。
命令:git reset—mixed HEAD^
同上。
命令:git reset—hard HEAD^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自上一次以来的提交全部丢失。