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的提交记录中找到。

posted @ 2021-07-12 17:59  coderInside  阅读(2357)  评论(0)    收藏  举报