Git中的git reset的三种参数的区别

栏目: 编程工具 · 发布时间: 5年前

内容简介:我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是为了方便我们先了解一下 Git 的工作流程

我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 “git-reset – Reset current HEAD to the specified state” , 注意这里主要操作的就是这个 HEAD

为了方便我们先了解一下 Git 的工作流程

Git中的git reset的三种参数的区别

相信大家对这个图已经很熟悉了,其中index也叫stage暂存区或者暂存索引区。git reset 共有三个互斥参数分别为”–soft”、”–mixed(默认参数)” 和 “–hard”,每种参数表示一种重置模式,下面我们将分别看一下这git reset 三个参数的用法区别。

前提条件

我们仓库中的状态为 “ A(a.txt) -> B(b.txt) -> C(c.txt) “,当前分支为master。

当前 HEAD 指向C,即 a47072e9f97eac4ac02c0abac82b26a9719663fc (HEAD -> master),我们以恢复到B(aad0c91e7b1d3577)点为准。

test1 git:(master) git log
commit a47072e9f97eac4ac02c0abac82b26a9719663fc (HEAD -> master)
Author: 孙兴房 <1293812389@qq.com>
Date: Mon Sep 24 10:37:14 2018 +0800

add c.txt

commit aad0c91e7b1d357729f65dc0bbeb6c9c9dd53844
Author: 孙兴房 <1293812389@qq.com>
Date: Mon Sep 24 10:22:12 2018 +0800

add b.txt

commit 68315608ef8d0cff5d229c2ee5010e59a1475cfe
Author: 孙兴房 <1293812389@qq.com>
Date: Mon Sep 24 10:21:59 2018 +0800

add a.txt

–soft 模式

执行 git reset –soft aad0c9,恢复到B。然后再执行 git status 看下

Git中的git reset的三种参数的区别

可以看到当时在C添加的c.txt文件还存在。但提示已经在”stage“暂存索引区了,即上图中的”Index”这一步。我们用 git status 命令确认这一点。

Git中的git reset的三种参数的区别

同时如果想将此文件从索引区中取消的话,只需要执行 git reset HEAD <文件> 命令就可以了。

此时我们可以对文件进行一些修改,然后再重新commit。

Git中的git reset的三种参数的区别

–hard模式总结:

1. 当执行 git reset –hard B时,当前分支(master)和HEAD同时指向B。

2. 原来在C提交的文件仍然存在,文件状态会 处于stage暂存区(index) ,当前状态为index ,后续命令为 git commit

3. 原C提交的git日志点(a47072e9f97eac4ac02c0abac82b26a9719663fc)消失。

我们此时对原来在C提交的文件进行内容修改(修改后记得需要重新执行 git add 文件到stage一次),再次commit即可。它此出现了一个新的git 日志点(88277bd1433b3ef0bc213e524e8943e114b50eda)。

–mixed(默认)  模式

执行 git reset –mixed aad0c9,恢复到B。然后再执行 git status 看下

Git中的git reset的三种参数的区别 可以看到当时在C添加的c.txt文件还存在(这一点和–soft 一样的)。但提示文件未被跟踪,也就是说还没有对这个文件执行git add命令添加到stage暂存区中。此时的状态和新创建的文件一模一样的。为了验证这一点我们添加一个文件d.txt看一下。

Git中的git reset的三种参数的区别 看到了吧,这时c.txt文件就像一个新创建的文件一样。

这里为了保持原来的样子,把新添加的d.txt删除掉后,再次git add 和 git commit。

Git中的git reset的三种参数的区别 再次执行git log命令

Git中的git reset的三种参数的区别

此时新出现的git日志点为“e6147eb0322042090e99ab98ff37a2e22cf9be19”。

–mixed模式总结:

1. 当使用 git reset –mixed 命令时, 工作区不变,会重置索引区 。当前分支(master)和HEAD都指向B,同soft一样。

2. 原来C添加的文件仍然存在,但 未处于stage暂存区(index) ,当前状态为workspace,后续命令为 git addgit commit 。不与于soft 模式。

3. 原C提交的git日志点消失。

–hard 模式

执行 git reset –hard aad0c9,恢复到B。然后再执行 git status 看下

Git中的git reset的三种参数的区别

发现这次和上面的两种结果完全不一样,在C添加的文件直接消失不存在了。

Git中的git reset的三种参数的区别

此时当前分支(master)和HEAD全部指向B,原来在C添加的文件也被删除了,所以大家执行此命令时一定要小心,不然会把恢复日志点以后添加的内容全部删除的。

–hard模式总结:

1. 当使用 git reset –hard 命令时, 工作区发生变化,会重置索引区 。当前分支(master)和HEAD都指向B,同soft一样。

2. 原来C添加的文件仍被删除 (不同于以上两种模式)

3. 原C提交的git日志点消失。

上面我们分析了三种模式的区别,大家使用中一定要注意,特别是 hard 硬模式。

总结

Git中的git reset的三种参数的区别

技巧:

另外大家嫌不好记得话,只要记住执行 soft 模式后,如果再次将原来的文件添加到仓库的话,需要git commit 一个命令 就可以了。而 mixed 模式需要执行git add 和 git commit 两个命令 。对于 hard 模式来说是一种硬恢复,导致部分数据丢失,尽量不要用(可以使用git reflog 来恢复)。

有兴趣的可以看一下git checkout 、git revert 和 git reset 三者的区别( https://blog.csdn.net/foolsong/article/details/75203005 )


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

《Hello Ruby:儿童编程大冒险》(平装)

《Hello Ruby:儿童编程大冒险》(平装)

(芬兰)琳达·刘卡斯 / 窝牛妈 / 浙江人民美术出版社 / 2018

快来认识Ruby——一个想象力丰富,喜欢解决难题的女生。Ruby认识了一群新朋友:聪明的雪豹、友好的狐狸、忙碌的机器人等等。这本书以讲故事的方式向孩子们介绍了基础的计算思维,比如拆分问题,制定分步计划,寻找规律,打破思维定势等等;之后,通过一系列鼓励探索和创造的练习和活动,孩子们对这些关乎编程核心问题的基本概念有了进一步的理解。一起来看看 《《Hello Ruby:儿童编程大冒险》(平装)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具