一、简介
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就相对安全很多。
若您感觉本站文章不错,读后有收获,不妨赞助一下?
我要赞助