git reset 和 git revert

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

内容简介:git中的撤销操作是我们经常要用到的操作,比如说当我们add某个文件到暂存区后可能想要撤回,或者是我们已经commit了但是push的时候想取消这次commit,这是主要是用理解了这些内容,我们就可以来理解1. 已经commit的文件和修改后未add的文件,这一类文件都在工作目录(Working Dictionary)
  • Home
  • Programming >Assorted
  • git reset 和 git revert

前言

git中的撤销操作是我们经常要用到的操作,比如说当我们add某个文件到暂存区后可能想要撤回,或者是我们已经commit了但是push的时候想取消这次commit,这是主要是用 git resetgit checkoutgit revert 三个命令。

git reset

Git的分支本质上是指向提交对象的可变指针,比如 master 分支你多次提交后就会有一个指向最后一个提交对象的指针,每一个提交对象都包含一个指向上一个提交对象的指针,这就是git分支的本质。而如何确定我们当前在哪个分支上呢?git给出了一个特殊的 HEAD 指针,他指向当前所在的本地分支。比如说我们现在在 master 分支,我们知道 master 指针指向的是该分支的最后一个提交,而 HEAD 指针此时也指向该处,所以我们可以理解 HEAD 指针为当前所在分支的别名。如下图:

理解了这些内容,我们就可以来理解 git reset 是如何工作的了。我们把git工作的空间分为两个区域:

1. 已经commit的文件和修改后未add的文件,这一类文件都在工作目录(Working Dictionary)

2. 已经add还未commit的文件在暂存区(Index)

还有一个Head指针指向当前所在分支的最后一次提交对象。比如上图中的HEAD和master指针本来是指向 34ac2 对象,此时 f30ab 对象正在暂存区,当 f30ab 提交完成以后,HEAD和master的指针就指向了新的提交,而 34ac2 则成为了最新提交的父节点。而我们的 git reset 指令就是操作 HEAD 指针,移动它的位置来实现撤销。下面我们用一个具体的例子来说明。

我们在一个空的git仓库中新建一个文件:file.txt。用vim编辑当前文件在当中输入字符串 first ,提交文件。此时我们用 git log --decorate --oneline 可以看到我们的master指针和HEAD指针都指向我们的第一次提交对象。

然后我们再次修改文件,在文件中加入字符串 second ,再次提交文件,调用上面的指令,我们会发现此时HEAD和master指针都指向我们的第二次提交。

再次重复上述操作,第三次修改提交。

此时我们的整个git树应该是这样的:

此时我们开始执行 reset 指令:

首先执行 git reset --soft HEAD~ : 我们发现HEAD和master指针指向了second,并且查看我们的 file.txt 文件,我们会发现文件中依然保持这第三次修改,只不过文件从已经commit的状态被重新拉到了缓存区,所以我们可以看出 --soft 下的指令只是向后倒退了一小步,把我们最后一个commit给取消了。

然后我们重新提交文件,让git状态重新进入到三次提交的状态。然后执行 git reset HEAD~ 指令(这条指令没有加参数,其实有一个默认参数–mixed):执行完指令后,我们发现HEAD和master指针又是指向了我们的第二次提交对象,而我们的file文件依然没有改变,但是这次它从没有commit的状态变成了没有add的状态,我们可以看出 --mixed--soft 又向后倒退了一小步,把git状态回复到了我们刚刚修改完文件还没有加入暂存区的状态。

最后我们依然重新回到三次提交的状态然后执行 git reset --hard HEAD~ 指令:我们发现这次HEAD和master指针依然是指向我们第二次的提交对象,我们检查 git status 发现没有任何状态,在查看 file.txt ,我们发现我们第三次的修改消失了,也就是说 --hard 指令把我们的状态直接从第三次提交完成回退到了第二次提交刚刚完成的状态,我们刚刚最后一次做的修改也消失了。

综合上面的测试,做一个总结:

--soft
--mixed
--hard

git revert

git revert我们用相同的方法进行测试,我们可以发现 git revert 并不是后退,而是把文件回到要回退的状态重新提交,如刚刚我们一共执行了三次提交, git revert HEAD~ 以后会将文件回复到第二次提交的状态,重新提交,也就变成了第四次提交,可见revert还是比较安全的,我们没有丢失任何历史记录,而reset将我们回滚的记录丢掉了。

需要注意的是,当revert同一个文件的时候会出现冲突,需要手动修改冲突,然后手动提交


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

查看所有标签

猜你喜欢:

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

Python语言程序设计基础(第2版)

Python语言程序设计基础(第2版)

嵩天、礼欣、黄天羽 / 高等教育出版社 / 2017-2 / 39

本书提出了以理解和运用计算生态为目标的Python语言教学思想,不仅系统讲解了Python语言语法,同时介绍了从数据理解到图像处理的14个Python函数库,向初学Python语言的读者展示了全新的编程语言学习路径。 全书一共设计了25个非常具有现代感的实例,从绘制蟒蛇、理解天天向上的力量到机器学习、网络爬虫,从文本进度条、统计名著人物重要性到图像手绘效果、雷达图绘制,绝大多数实例为作者原创......一起来看看 《Python语言程序设计基础(第2版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

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

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具