内容简介:我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是为了方便我们先了解一下 Git 的工作流程
我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 “git-reset – Reset current HEAD to the specified state” , 注意这里主要操作的就是这个 HEAD 。
为了方便我们先了解一下 Git 的工作流程
相信大家对这个图已经很熟悉了,其中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 看下
可以看到当时在C添加的c.txt文件还存在。但提示已经在”stage“暂存索引区了,即上图中的”Index”这一步。我们用 git status 命令确认这一点。
同时如果想将此文件从索引区中取消的话,只需要执行 git reset HEAD <文件> 命令就可以了。
此时我们可以对文件进行一些修改,然后再重新commit。
–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 看下
可以看到当时在C添加的c.txt文件还存在(这一点和–soft 一样的)。但提示文件未被跟踪,也就是说还没有对这个文件执行git add命令添加到stage暂存区中。此时的状态和新创建的文件一模一样的。为了验证这一点我们添加一个文件d.txt看一下。
看到了吧,这时c.txt文件就像一个新创建的文件一样。
这里为了保持原来的样子,把新添加的d.txt删除掉后,再次git add 和 git commit。
再次执行git log命令
此时新出现的git日志点为“e6147eb0322042090e99ab98ff37a2e22cf9be19”。
–mixed模式总结:
1. 当使用 git reset –mixed 命令时, 工作区不变,会重置索引区 。当前分支(master)和HEAD都指向B,同soft一样。
2. 原来C添加的文件仍然存在,但 未处于stage暂存区(index) ,当前状态为workspace,后续命令为 git add 和 git commit 。不与于soft 模式。
3. 原C提交的git日志点消失。
–hard 模式
执行 git reset –hard aad0c9,恢复到B。然后再执行 git status 看下
发现这次和上面的两种结果完全不一样,在C添加的文件直接消失不存在了。
此时当前分支(master)和HEAD全部指向B,原来在C添加的文件也被删除了,所以大家执行此命令时一定要小心,不然会把恢复日志点以后添加的内容全部删除的。
–hard模式总结:
1. 当使用 git reset –hard 命令时, 工作区发生变化,会重置索引区 。当前分支(master)和HEAD都指向B,同soft一样。2. 原来C添加的文件仍被删除 (不同于以上两种模式)
3. 原C提交的git日志点消失。
上面我们分析了三种模式的区别,大家使用中一定要注意,特别是 hard 硬模式。
总结
技巧:
另外大家嫌不好记得话,只要记住执行 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 )
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- TypeScript 中的命名参数、可选参数、默认参数
- PXC状态参数与变量参数
- 更加灵活的参数校验,Spring-boot自定义参数校验注解
- AI新人必看 | 参数和超参数还分不清楚吗?
- 如何一条Mediainfo --Inform语句同时获取视频参数和音频参数多个Parameters
- es6 -- 默认参数Default,不定参数Rest,扩展运算符Spread详解
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
流畅的Python
[巴西] Luciano Ramalho / 安道、吴珂 / 人民邮电出版社 / 2017-5-15 / 139元
【技术大咖推荐】 “很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!”——Alex Martelli,Python软件基金会成员 “对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。”——Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops ......一起来看看 《流畅的Python》 这本书的介绍吧!