美文网首页
git reset 的三种模式

git reset 的三种模式

作者: O无为学长O | 来源:发表于2021-05-28 14:00 被阅读0次

    现实生活中虽然没有后悔药,但程序世界是有的。 reset 就是git中的后悔药,而且还可以根据参数不同来调整后悔的程度。

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

    1,前置知识说明

    • 工作区: 即 Working Tree 或 Working Directory,不同文章中叫法不同。
    • 暂存区:即 Index/Stage 或 Staged Snapshot。
    • 存储库:即 Repository。

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

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

    2,resset 的三种模式

    如果把上面的 添加文件到 执行 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 命令查看日志,应该会看到两条提交记录。

    • --hard
      硬核模式,完全回退(就是肠子都悔清了,恨不得事情没有发生过), 就是回退三步。
      在上面的例子中,执行如下命令:
    $  git reset --hard HEAD^
    

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

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

    • --mixed
      混合模式,回退到工作区(后悔不已,希望事情回到最初开始,自己可以做些事情来改变剧情的发展),就是回退两步。
      为方便理解,将上面的 456三步再做一次(因为经过上面的 --hard 之后,456已经被抹掉了,相当于没发生),然后执行如下命令:
    $  git reset --mixed HEAD^
    

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

    • --soft
      轻度模式(或可以叫软模式),回退到暂存区(内心其实是不怎么后悔的,只是想修改一下提交记录)。
      为方便理解,将上面的56两步再做一次(道理同上),然后执行如下命令:
    $  git reset --soft HEAD^
    

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

    3,总结

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

    相关文章

      网友评论

          本文标题:git reset 的三种模式

          本文链接:https://www.haomeiwen.com/subject/ddrrjltx.html