git reset 命令详解

命令概述

当要回退到某一次提交的状态时,可以使用git reset命令。有三个常用参数:--soft,--mixed,--hard。按照Git文档的习惯,可以写作
git reset [--soft | --mixed | --hard] [<commit>]

其中,<commit>是指commit的hashcode。

也可以使用HEAD代替<commit>,命令为
git reset [--soft | --mixed | --hard] [HEAD]

其中,

  • HEAD 最近一个提交(倒数第一次)

  • HEAD^ 上一次提交(倒数第二次)

  • HEAD^^ 上一次的上一次提交(倒数第三次)

  • HEAD^^^ 倒数第四次提交

或者,

  • HEAD~0 最近一个提交(倒数第一次)

  • HEAD~1 上一次提交(倒数第二次)

  • HEAD^2 上一次的上一次提交(倒数第三次)

  • HEAD^3 倒数第四次提交

如果在最近一次提交之后,没有任何文件修改,则使用HEAD或者HEAD~0,不会产生任何效果。

三个参数对比

通过以下公式,可以直观的反映出三个参数的区别:

git reset --mixed <commit> + git add . = git reset --soft <commit>

git reset --hard <commit>
= git reset --soft <commit> + git reset --hard HEAD
= git reset --mixed <commit> + git reset --hard HEAD

详细的介绍,可以参考CSDN的文章:关于 git reset 命令几个常用参数的理解

需要指出的是,文章对--hard参数的说明不完全准确。--hard舍弃的提交,并没有彻底删除,还存在仓库里,如果知道被舍弃提交的hashcode,仍然可以恢复该提交。

--hard参数的使用

当要回退到之前某一次提交,并修改文件,且不希望放弃后面已有提交的时候,有两种操作方式。

1、完全在本地仓库完成

如果想在本地完成,可以在reset之前,新建一个分支,保存状态;在reset之后,修改文件,并提交,然后将新建分支合并到reset所在分支。这时,需手动消除冲突,重新跟踪被修改文件,并提交。最后push到远程仓库。

上图显示的就是这一过程。

我们在状态C,新建分支branch-C,然后在master分支,reset到状态B,修改文件,并提交状态B1。这时,如果将branch-C合并到master,Git会提示冲突,需要手动消除。

2、借助远程仓库完成

如果借助远程仓库,则不必新建分支,直接reset到之前的某一次提交,修改文件,然后提交。这时,如果直接push到远程仓库,Git会提示失败,需要pull远程仓库到本地,然后手动消除冲突,重新跟踪被修改的文件,并提交,最后push。

上图显示了这一过程。

在commit d809fd46,reset到状态B,修改文件,并提交状态B2。这时,如果直接push,Git会提示失败,需要先pull远程仓库到本地,Git提示冲突,然后手动消除冲突。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 12,761评论 1 26
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 10,374评论 0 9
  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 8,087评论 1 4
  • 在没遇到最合适的那个人之前…我有大把的时间去变的更优秀
    7秒碎碎念阅读 1,027评论 0 0
  • 幸福的家庭都相同,不同的家庭各有各的各的不幸。昨天我问我外公:你认为最重要的事是什么,他说,幸福。我说,幸福是一个...
    哭泣的橙子阅读 2,854评论 0 4