但行好事
莫论前程❤

Git教程—–深入理解git reset命令

​ 重置命令(git reset)是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>的用法)则会重置引用.根据不同的选项,可以对暂存区或工作区进行重置.

参照下面的版本库模型图,来看一看不同的参数对第二种重置语法的影响

1531753285361
. 重置命令与版本库关系图

命令格式: git reset [--soft | --mixed | --hard] [<commit>]
  • 使用参数–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 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^

    彻底撤销最近的提交.引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态,自上一次以来的提交全部丢失.

赞(1) 打赏
未经允许不得转载:刘鹏博客 » Git教程—–深入理解git reset命令
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏