撤销某次的提交
访问量:9115

一、简介

git reset命令是git中重置命令,即用来撤销某次提交。首先,我们得了解,git reset可以帮我们重置哪些内容:

1、修改本地仓库中commit对象

如下图:

此时本地仓库对应的是commit4,git reset 可以让本地仓库对应的指针变为commit3或是commit1等之前的版本,当然,也可以变为commit4之后的某个commit,如commit5。

备注:当使用git reset命令时候,一般会修改本地仓库。

其常用格式如下:

用法一:git reset [-q] [<commit>] [--] <paths>...
用法二:git reset [--soft | --mixed | --hard | --merge | --keep ] [-q] [commit]

2、哪些情况会修改暂存区

当使用git reset命令,修改本地仓库里面内容时候,git会使用本地仓库修改后的内容,来修改暂存区,使暂存区里面的内容,同本地仓库修改后的内容保持一致。

备注:当使用下面命令的时候,才会修改暂存区。

git reset
git reset --hard
git reset --mixed

当git reset不带参数,默认的参数是--mixed

3、如何实现仅仅修改暂存区

当我们使用git reset HEAD命令的时候,就会仅仅修改暂存区里面的内容,这种修改不会影响到工作区。针对场景是:我们通过git add命令,把很多改动添加到暂存区,发现这些改动本不需要添加,此时我们可以考虑使用 git reset HEAD 命令,用版本库里面的内容来覆盖暂存区。

因为HEAD是当前分支对应的commitId。git reset HEAD其实是:

git reset --mixed HEAD

因为把本地创库对应的commitId变化前后,都是当前分支对应的commitId,所以工作区不会修改。因为使用的是--mixed,所以工作区也不会修改。

4、哪些情况会修改工作区

当使用git reset命令,修改本地仓库里面内容时候,git会使用本地仓库修改后的内容,来修改工作区,使工作区里面的内容,同本地仓库修改后的内容保持一致。

备注:当使用git reset --hard命令的时候,才会修改工作区。

我们需要注意,使用git reset重置一般是很危险的,会彻底地丢掉历史。因为如果没有记录下重置前的commitId,一般不容易找回,除非分析.git/logs里面的日志,故重置需慎重。

二、参数

参数说明
--hard commitId
修改本地仓库、暂存区、工作区里面的内容到commitId对应的内容。
--mixed commitId修改本地仓库、暂存区里面的内容到commitId对应的内容,是git reset默认的参数。
--sorft commitId修改本地仓库里面的内容到commitId对应的内容。

当git reset 后面的commitId为当前提交的commitId时,即HEAD。那么:

参数说明
--hard HEAD
修改暂存区、工作区里面的内容到commitId对应的内容。
--mixed HEAD修改暂存区里面的内容到commitId对应的内容,是git reset默认的参数。
--sorft HEAD本地仓库、暂存区、工作区都不改变

三、实例

1、如何撤销某次错误的提交

比如我的git库,当前有一个修改的文件,两个新增的文件,如下:

然后,我将这些改动提交到了git库里面

提交后,发现这些内容不能提交,需要撤回,怎么搞呢?首先,我们需要通过git log,找到提交前当前分支对应的commitId,如下:

然后执行如下命令:

git reset ac3bb7

就可以发现,当前提交已经被撤回

当然,我们也可以执行:

git reset HEAD^

因为HEAD,指向当前分支对应的commitId。这也能够很好的解释,为什么我们执行git reset HEAD命令,可以撤销git add添加到暂存区的内容,其实,执行的是如下命令。

git reset --mixed  HEAD

--mixed 是默认的参数.

HEAD^,指向当前分支对应的commitId的前一个commitId。

备注:上面我们提过,如果我们不记得当前分支对应的commitId,这种撤销就没法恢复了,后面要说的git revert就相对安全很多。