git学习小计(六):git重置reset、git检出checkout

git reset:

reset命令主要是针对一个分支下的不同commit点进行的操作;而checkout则主要是针对不同分支进行的操作(当然checkout也可以针对提交点commit的SHA1进行切换,这时会出现分离头指针'detached head' 的状态,这里不细讲了)

reset主要用于重置暂存区(除非使用--hard参数,否则不重置工作区),而checkout则主要是覆盖工作区(如果<commit>不省略,也会替换暂存区中相应的文件)

git reflog show branch : 显示branch分支的commit历史

git学习小计(六):git重置reset、git检出checkout_第1张图片

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>命令时修改的暂存区

第二种方法则会重置引用:

git学习小计(六):git重置reset、git检出checkout_第2张图片

  • --hard ,如 git reset --hard head:会执行上图中的1、2、3,即:1、替换引用的指向,引用指向新的commit id。2、替换暂存区,替换后,暂存区的内容和引用指向的目录树一致。3、替换工作区,替换后,工作区的内容变得和暂存区一致,也和Head所指向的目录树内容相同。
  • --soft,如 git reset --soft head,只执行上图中的1
  • --mixed(默认为此),如 git reset head,会执行上图中的1、2。

举例:
git reset(或者git reset head、git reset --mixed、git reset --mixed head) :  仅用head指向的目录树重置暂存区,工作区不受影响,相当于将之前用git add命令更新到暂存区的内容撤出暂存区。引用也未改变,因为重置到head相当于没有重置。
git reset head^ : 工作区不变,暂存区会回退到上一次提交之前,引用也会回退一次。
git reset --soft head^ : 工作区和暂存区不变,引用回退一次。
git reset --hard head^ : 彻底撤销最近的提交,引用回退一次,工作区和暂存区也回退到上一次提交时的内容。自上一次的提交以来的提交全部丢失。
git reset --hard DNA-1261@{2} : 结合之前的@{n}用,重置head为两次改变之前的值,引用、暂存区、工作区全部回退。
git reset --hard head : 相当于引用没有重置,但是工作区、暂存区都变为最近一次提交时的内容了。 (常用)

git checkout:

上一节提到过,当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学习小计(六):git重置reset、git检出checkout_第3张图片

举例:

git checkout branch:检出分支

git checkout / git checkout head : 汇总显示工作区、暂存区与head的差异

git checkout -- filenames : 用暂存区中的filename文件覆盖工作区中的filename文件。相当于取消上次执行的git add filename以来的本地修改

git checkout branch --filename :head的指向不变,用branch分支所指向的提交中的filename替换暂存区和工作区中的对应文件。



 


你可能感兴趣的:(git学习小计(六):git重置reset、git检出checkout)