【Git】git reset详解(三)

前言

本文将紧接前文《【Git】git reset命令详解(一)》,继续结合具体例子和Git底层命令,通过图文的方式详解git reset的基本使用。


git reset commit – file

git reset [<commit>] [--] <file>

该命令会将暂存区内由<file>指定的文件恢复到由<commit>指定的提交对象中的状态。需要注意的是:

  • 如果<commit>没有指定,则默认为HEAD指向的提交对象。
  • 暂存区中只有<file>指定的文件会被影响(git reset [–soft | --mixed [-N] | --hard ] [<commit>]会影响暂存区中所有文件)。
  • 无法设置–soft和–hard模式,否则会报错。
  • 不会改变HEAD的指向(git reset [–soft | --mixed [-N] | --hard ] [<commit>]会改变HEAD的指向)。

我们来动手试验一下该命令。

我们在工作目录(即learngit目录)下新建一个newfile.txtx文件,内容为:

This is a new file.

并且,我们将工作目录下readme.txt文件的内容修改为:

Git is a distributed version control system.
Git is a free software.
Git has a mutable index called stage.

我们将修改过的readme.txt文件和新建的newfile.txtx文件加入暂存区,并一并提交到仓库:

在这里插入图片描述
提交历史如下:

在这里插入图片描述

我们先用git cat-file命令来看一下当前HEAD指向的提交对象d4ac459791ee1411bf771cc312092c89de13a1d0:

在这里插入图片描述
从上图可以看出,提交对象d4ac459791ee1411bf771cc312092c89de13a1d0指向了一个树对象f90c81e6736a257d5aad417426cff9c01d135919。此外,提交对象d4ac459791ee1411bf771cc312092c89de13a1d0的父提交对象,即上一次提交的提交对象为7b674f020f76a168dbe4bbdec11b1fd137d0b291。

我们继续使用git cat-file命令看一下树对象f90c81e6736a257d5aad417426cff9c01d135919:

在这里插入图片描述
从上图可以看出,树对象f90c81e6736a257d5aad417426cff9c01d135919又指向了数据对象67668a2400494229c8f9dd64ec07ee302378a4cb和数据对象85c4f2db496bd7c17f558258f354744c3075c6a9。

数据对象67668a2400494229c8f9dd64ec07ee302378a4cb和数据对象85c4f2db496bd7c17f558258f354744c3075c6a9对应我们最后一次提交的newfile.txt文件和readme.txt文件的内容:

在这里插入图片描述

我们再用git ls-files命令看一下当前暂存区的状态:

在这里插入图片描述
从上图可以看出,暂存区当前所存储或指向的数据对象和HEAD一致。

假设我们现在想将暂存区恢复到我们第二次提交的状态:

在这里插入图片描述

查看一下提交历史:

在这里插入图片描述
从上图可以看出,HEAD指向了第二次提交的提交对象68b21576f6d85e1a9eb8121e92a31fd87cdafa65。

我们再来查看一下暂存区的状态:

在这里插入图片描述
从上图可以看出,暂存区回到了我们第二次提交时的状态。

这和我们在【Git】git reset命令详解(一)中所演示的是一样的。

再继续下面的内容之前,让我们将仓库恢复到我们最后一次提交的状态:

在这里插入图片描述

假设我们现在想将暂存区的readme.txt文件恢复到我们第二次提交的状态,我们还是可以使用git reset命令,通过指定提交对象以及文件名的方式,如下所示:

在这里插入图片描述

查看一下提交历史:

在这里插入图片描述
从上图可以看出,HEAD指向的提交对象并没有改变!

我们再来查看一下暂存区的状态:

在这里插入图片描述
从上图可以看出,暂存区的newfile.txt文件和最后一次提交时暂存区的newfile.txt文件一致,但是暂存区的readme.txt文件却回退到了第二次提交时暂存区的newfile.txt文件的版本。

打开工作目录下的readme.txtx文件,内容仍为:

Git is a distributed version control system.
Git is a free software.
Git has a mutable index called stage.

从上面的尝试我们可以总结出,git reset [<commit>] [–] <file>会将暂存区内由<file>指定的文件恢复到由<commit>指定的提交对象中的状态,而不会影响暂存区的其他文件,也不会改变HEAD的指向。

如果我们想恢复工作目录下的某个文件呢?假设我们现在想将工作目录下的readme.txt文件恢复到我们第二次提交的状态:

在这里插入图片描述
结果报错了!

我们再尝试一下–soft:

在这里插入图片描述
同样报错了!

总结

git reset [<commit>] [–] <file>:

  • 如果<commit>没有指定,则默认为HEAD指向的提交对象。
  • 暂存区中只有<file>指定的文件会被影响(git reset [–soft | --mixed [-N] | --hard ] [<commit>]会影响暂存区中所有文件)。
  • 无法设置–soft和–hard模式,否则会报错。
  • 不会改变HEAD的指向(git reset [–soft | --mixed [-N] | --hard ] [<commit>]会改变HEAD的指向)。

Reference

[1]: http://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86

猜你喜欢

转载自blog.csdn.net/Graduate2015/article/details/122472518