git reset 的三种模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git reset 的三种模式相关的知识,希望对你有一定的参考价值。

参考技术A

说明: 本文章并非git基础知识,需要对gi命令有一定的熟练程度才能理解,如果看官对 『工作区』『暂存区』『存储库』这三个词比较陌生,或者完全不理解是什么,那还是先请去看看git基础知识,再回头来往下浏览,以免浪费宝贵时间

当我们新增或修改文件时,文件最先会放在工作区,这个阶段是我们正在进行文件的创建和编辑阶段。当使用 git add 命令,即表示我们的创建或编辑工作已经完成,准备将劳动成果添加到git仓库,但这时所有的创建或修改还只是临时的,被改动的文件只是转移到暂存区临时保存,并没有真正影响到git仓库的内容,只有使用 git commit 命令之后,所有的改动才最终生效,git 仓库中也产生新的文件版本记录。

简单来说,一个文件在git目录中有三种情况:
1,刚刚添加到目录中,或刚刚被修改过,此时文件被记录在工作区。
2,执行了 git add 命令, 此时文件由工作区转移到了暂存区
3,执行了 git commit 命令,此时文件由暂存区转移到git仓库,即存储库。

如果把上面的 添加文件到 执行 git commit 的过程看作是前进,那么 git reset 就是回退,reset 的不同模式,其实就是回退几步,上面的提交一共有三步,对应的,reset 可以让你选择是回退一步,两步,还是三步。

以一个实例来说明,新建一个名称为 git-reset 的文件夹,使用执行 git init 将该文件夹初始化为一个git目录,然后进行如下操作:
1,新建一个文本文件 1.txt, 并添加内容为 1234
2,执行 git add 1.txt
3,执行 git commit -m \'添加1.txt文件\'
如果操作无误,使用 git log 命令查看日志,应该会看到一条提交记录。

为了方便下面的 reset 命令的理解 ,再继续进行如下操作:
4,修改1.txt,在原来内容后面添加 abcd。 (1.txt 最终的内容为 1234abcd)
5,执行 git add 1.txt
6,执行 git commit -m \'修改1.txt文件,添加新内容\'
如果操作无误,使用 git log 命令查看日志,应该会看到两条提交记录。

执行完成之后,查看1.txt的内容,会发现只有1234,也就是说,1.txt 被退回到了上面 6步中的第三步之后的状态,456这三步相当于就没有发生过。
这就是--hard 模式,完全回退,使用此参数,在上一次执行 git commit 命令之后的所有操作都将会被抹除,相当于没有发生过,也就是之前在上一次git commit 命令之后的所有操作都是做了无用功,白费力气了。

** 警告: **此模式相当危险,除非你已经完全明白这个参数的含义以及执行这条命令之后的结果,否则不建议使用该参数。

执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是红色,这是没有执行git add 1.txt 命令的状态,也就是说操作被回退到了第4步之后。
这就是 --mixed 模式,也是reset 的默认模式,即与 git reset HEAD^ 效果是一样的,文件的修改操作并没有被抹除,也就是文件操作没有影响,但git操作被撤消了。
这是最常用的模式,所以如果不使用参数,默认即是这个模式。

执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是绿色,这是执行了git add 命令,但没有执行 git commit 命令的效果,说明操作被回退到了第5步之后。

git reset 的三种不同模式,其实对应的就是 git 提交的三个步骤,只要弄清楚了git提交的步骤,并能熟练使用,那么 git reset 其实也不难理解了。

git reset 版本回退的三种用法总结

git reset (–mixed) HEAD~1
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
git reset –soft HEAD~1
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
git reset –hard HEAD~1
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换








以上是关于git reset 的三种模式的主要内容,如果未能解决你的问题,请参考以下文章

Git reset的三种模式 傻傻分不清楚

Git reset的三种模式 傻傻分不清楚

63.Git Reset 详解版本回滚的三种模式

git reset 的三种模式

git使用进阶——版本穿梭reset三种模式理解

git使用进阶——版本穿梭reset三种模式理解