reset和revert,撤销上一次commit(或者已经push)
在开发中,有时做了一次或者多次不必要的提交(git commit),怎么去撤销;
方法一:
原理:
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:
适用场景:
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
git reset --soft|--mixed|--hard <commit_id>
// --mixed 会保留源码,只是将git commit和index 信息(代码需要重新git add才能commit)回退到了某个版本.
// --soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
// --hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
这里的 <commit_id> 就是每次commit的SHA-1,可以在log里查看到
如果是已经push到远程仓库,如果直接git push,会提示你git pull,因为本地代码已经落后于线上;

此时需要强制push,覆盖线上的代码,commit记录也会覆盖
git push -f
方法二:
对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令
git revert <commit_id>
//<commit_id> 需要被撤回的某次commit的id
使用场景:
当你想撤销多次commit中间的某一次commit,又想保留这次commit之后的commit
原理:
git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。
git revert 和 git reset的区别
1、上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会。
2、 reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的。
3、reset 被撤销的历史代码不再commit流中,但是revert的历史代码还可以在commit的提交记录中找到。
浙公网安备 33010602011771号