gitreset命令详解
开门见⼭,先抛出⼀张图,之后再细讲。
⾸先,先解释下图中的⼀些名词。
⼀.名词解释
1. Working Copy:当前⼯作⽬录下的⽂件,⼀般指,有修改,没有git add,没有git commit的⽂件
2. Index:也可以被认为是staging area(暂存区),也就是使⽤git add添加后的⽂件,是⼀堆将在下⼀次commit中提交的⽂件,提交之后它就是当前 HEAD的⽗节点。
3. HEAD:指向当前branch最顶端的⼀个commit,也就是该分⽀最近⼀次commit后的节点
上图的上部分解释如下:
当你第⼀次checkout⼀个新的分⽀,HEAD指向该分⽀上最近⼀次commit。它和index和working copy是⼀样⼀样的。
当你修改了⼀个⽂件,你的working copy不再和index和HEAD相同了,所以当⽂件有改动,它会标记这些⽂件。
然后,你执⾏git add命令,这条命令会将上⾯修改的⽂件缓存在index中,你的working copy和index相同了,⽽他们俩和HEAD不同了”。
当你执⾏git commit,Git创建了⼀个新的commit,HEAD这时指向这个新的commit,此时,HEAD & index & working copy⼜相同了⼆.reset命令
git reset 命令格式为git reset [--soft | --mixed | --hard] [<commitId>]
是git中最常⽤的命令,但也是最危险,最容易被误⽤的命令。reset命令本⾝很简单,但是它的参数让⼈迷惑,主要的参数有soft、
mixed、hard,它们告诉Git,当执⾏reset时,要对index和working copy做什么。
s oft
--soft参数只告诉Git将其他的commit重置到HEAD,就仅此⽽已。index和working copy中的⽂件都不改变。
实例:
git reset --soft [commitId] 回退到某个版本,只回退了commit的信息。如果还要提交,直接commit即可
git常用指令m ixed (默认参数)
--mixed 改变HEAD和index,指向那个你要reset到的commit上。⽽working copy⽂件不被改变。当然会显⽰⼯作⽬录下有修改,但没有缓存到index中。
h ard
--hard HEAD & index & working copy同时改变到你要reset到的那个commit上。这个参数很危险,执⾏了它,你的本地修改可能就丢失了。
注意: commitId是每次commit的id,可以通过git log来进⾏获取
三.加餐
1.恢复git reset —hard的误操作
有时候不⼩⼼通过git reset —hard将版本回退到之前的commit了。可以先通过 git reflog命令,到要退回的commitId,然后通过命令git reset —hard commitId来恢复
2.git revert 和 git reset的区别
a. git revert是⽤⼀次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
b. 在回滚这⼀操作上看,效果差不多。但是在⽇后继续merge以前的⽼版本时有区别。因为git revert是⽤⼀次逆向的commit“中和”之前的提交,因此⽇后合并⽼的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因⽽和⽼的branch再次merge时,这些被回滚的commit应该还会被引⼊。
c. git reset 是把HEAD向后移动了⼀下,⽽git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论