git reset和git revert区别与作用
一、先介绍几个名词:
1.working copy工作区
working copy(工作区)你正在工作的那个文件集
2.Index
index也被称为staging area(暂存区),指一整套即将被下一个提交的文件集合。
3. HEAD
这是当前分支版本顶端的别名,也就是版本库中最近的一个提交。
HEAD^=HEAD~1代表版本库中的上一次提交,即最近一次提交的父提交
HEAD^^ =HEAD~2代表HEAD^的父提交
……
下图是工作区、暂存区与HEAD简单的原理图:
当执行一个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)]
三、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
git reset --hard HEAD^返回上次提交
执行后,HEAD回到f4cefc2这一版。ls当前目录只有 a.md , b.md, c.md。而d.md 没了,commit历史中,b3e234这一版被抹去了。
2.提交了4个文件 a.md , b.md, c.md, d.md.
Git revert HEAD^
如下图,上次提交的文件c.md消失,ls中剩下a.md , b.md, d.md.
但是上次提交的commit4862f版本没有消失,此命令生成了一个新的commit59f37。
所以,修复一些错误,可视情况来使用以上命令:
1.修复未提交文件中的错误(重置), 让工作目录回到上次提交时的状态
$ git reset --hard HEAD
2.修复已提交文件中的错误
$ git revert HEAD