很多时候,git新手很容易误操作,而git reset --hard xxx/soft xxx、git revert 都是用来撤销代码仓库中的某些更改的,它们非常相似,在用的时候很容易混淆,下面比较一下它们的区别及作用。
Git仓库有三个主要的组成,工作目录、暂存区、提交历史。
resert
如果修改了某些内容,但是还没有push到远程仓库,可以用git reset去撤销更改,除了在当前分支上操作,还可以通过传入标记来修改缓存区或者工作目录,这些标记限定了git reset的作用域,常常跟HEAD作为参数一起使用。
例如:
git resert HEAD^2
reset操作如下图所示:
- git reset --soft xxx:回退到某个版本,只退回了commit的信息,不会回复到index file一级。如果还要提交,直接commit即可。也就是说缓存区和工作目录都不会改变,改变的是提交历史。
- git reset --hard xxx:彻底退回到某个版本,本都的源码也会变为上各个版本的内容,也就是缓存区和工作目录都同步到你指定的提交。
如果你想完全舍弃你没有提交的改动,可以使用git reset --hard HEAD。
revert
如果我们修改了某些内容,已经commit到本地仓库,并且push到远程仓库了,这种情况下想把本地和远程仓库都回退到某个版本,该怎么做呢?
前面讲到的用git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化,这样,及时本地reset了,但如果再git pull,那么,远程仓库的内容又会和本地之前版本的内容进行merge,这并不是我们想要的东西。
对于已经把代码push到远程仓库,你退回本地代码其实也想同时退回线上代码,回滚到某个指定的版本,线上线下代码保持一致。git revert用于撤销某次操作,此次操作之前和之后的commit和history都会保留,即用一个新提交来消除一个历史提交所做的任何修改。
git revert HEAD 撤销前一次commit
git revert HEAD^ 撤销前前一次commit
git revert commit xxx 撤销指定的版本,撤销也会作为一次提交进行保存。
revert之后你的本地代码会回滚到指定的历史版本,然后再git push。
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- git reset是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容跟要revert的内容正好相反,能够抵消要被revert的内容。