reset命令主要是针对一个分支下的不同commit点进行的操作;而checkout则主要是针对不同分支进行的操作(当然checkout也可以针对提交点commit的SHA1进行切换,这时会出现分离头指针'detached head' 的状态,这里不细讲了)
reset主要用于重置暂存区(除非使用--hard参数,否则不重置工作区),而checkout则主要是覆盖工作区(如果<commit>不省略,也会替换暂存区中相应的文件)
git reflog show branch : 显示branch分支的commit历史
git reflog show branch | head -n 显示branch分支最近n次的commit历史
git reflog 默认将最新的改变放在最前面显示,且只显示每次改变的SHA1值的前7位。
下面着重介绍reset命令
用法一: git reset [<commit>] [--] <paths> 用法二: git reset [--soft | --mixed | --hard] [<commit>]
上面两种用法中,<commit>都是可选项,可以使用引用或提交id,如果省略<commit>,则相当于使用了head的指向作为提交id。
第一种不会重置引用,不会改变工作区,只是用指定提交状态(<commit>)下的文件(<paths>)替换掉暂存区中的对应文件,例如git reset head <paths>相当于取消之前执行的git add <paths>命令时修改的暂存区
第二种方法则会重置引用:
上一节提到过,当checkout的参数为某个commit的SHA1时,会出现分离头指针detached head的状态。本节详细讲checkout命令。git checkout会重写工作区,所以需谨慎使用。
用法一: git checkout [-q] [<commit>] [--] <paths> … 用法二: git checkout [<branch>] 用法三: git checkout [-m] [[-b | --orphan] <new_branch>] <new_branch> [<start_point>]
第一种用法:<commit>是可选的,如果省略则相当于从暂存区(index)进行检出,不会改变head头指针,主要用于指定版本的文件覆盖工作区中的对应文件,如果省略<commit>,则会用暂存区的文件覆盖工作区的文件,否则用指定提交中的文件覆盖暂存区和工作区中对应的文件。
第二种比较常用,即切换分支的操作,会改变head头指针,指向新的branch分支,工作区和暂存区也用branch的内容替换。
第三种创建和切换到新分支,暂不做具体介绍了。
举例:
git checkout branch:检出分支
git checkout / git checkout head : 汇总显示工作区、暂存区与head的差异
git checkout -- filenames : 用暂存区中的filename文件覆盖工作区中的filename文件。相当于取消上次执行的git add filename以来的本地修改
git checkout branch --filename :head的指向不变,用branch分支所指向的提交中的filename替换暂存区和工作区中的对应文件。