美文网首页
git reset和 git revert比较

git reset和 git revert比较

作者: 八十一空 | 来源:发表于2018-05-26 20:09 被阅读8次

git reset和git revert区别与作用

一、先介绍几个名词:

1.working copy工作区

working copy(工作区)你正在工作的那个文件集

2.Index

index也被称为staging area(暂存区),指一整套即将被下一个提交的文件集合。

3. HEAD

这是当前分支版本顶端的别名,也就是版本库中最近的一个提交。

HEAD^=HEAD~1代表版本库中的上一次提交,即最近一次提交的父提交

HEAD^^ =HEAD~2代表HEAD^的父提交

……

下图是工作区、暂存区与HEAD简单的原理图:

屏幕捕获_2018_05_26_19_50_15_262.png

当执行一个git add,提交的内容就暂存在index中,现在你的working copy和index内容是相同的,但是他们和HEAD区不同。

当执行一个git commit,就创建一个新的commit将内容提交到master,随后HEAD就指向这个新的commit,而index,working copy和HEAD就匹配相同了。

二、Git Reset

此命令就是重置HEAD(当前分支的版本顶端)到另外一个commit处。

1.git reset HEAD

任何事情都不会发生,HEAD就是当前提交所在的位置。

2.git reset HEAD~1

HEAD从顶端移动到前一个提交处

3.git reset HEAD~2

HEAD从顶端往下移动两次到倒数第三个提交处

4.git reset --soft xxx与git reset --hard xxx的区别

--soft参数让Git重置HEAD到另外一个提交处,但也到此为止。此时暂存区,工作区都不会做任何变化。

--hard参数它将重置HEAD返回到另外一个提交处,重置index以便反映HEAD的变化,并且重置working copy也使得其完全匹配起来。

如下两图,在--soft执行后,HEAD指向的commit变成上一次commit,但工作区ls前后的文件没有变化。而执行git reset --hard HEAD后,HEAD指向当前commit f4cef,同时working copy工作区的d.md文件没了。[图片上传失败...(image-d1fb66-1527335571902)]

屏幕捕获_2018_05_26_18_58_46_837.png 屏幕捕获_2018_05_26_19_03_06_226.png

三、Git reset和Git revert区别与作用

reset是回朔到指定的commit版本(指定commit版本之后的操作都消失了)。revert是删除指定的commit,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。

Git reset --hard与git revert比较如下:

1.有四次提交分别提交了4个文件 a.md , b.md, c.md, d.md.当前提交b3e2

屏幕捕获_2018_05_26_16_58_59_676.png

git reset --hard HEAD^返回上次提交

执行后,HEAD回到f4cefc2这一版。ls当前目录只有 a.md , b.md, c.md。而d.md 没了,commit历史中,b3e234这一版被抹去了。

屏幕捕获_2018_05_26_16_59_11_75.png

2.提交了4个文件 a.md , b.md, c.md, d.md.

屏幕捕获_2018_05_26_17_14_25_943.png

Git revert HEAD^

如下图,上次提交的文件c.md消失,ls中剩下a.md , b.md, d.md.

但是上次提交的commit4862f版本没有消失,此命令生成了一个新的commit59f37。

屏幕捕获_2018_05_26_17_14_40_897.png

所以,修复一些错误,可视情况来使用以上命令:

1.修复未提交文件中的错误(重置), 让工作目录回到上次提交时的状态
$ git reset --hard HEAD
2.修复已提交文件中的错误
$ git revert HEAD

相关文章

网友评论

      本文标题:git reset和 git revert比较

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