git恢复版本的两种方法reset/revert

3,012 阅读2分钟

使用git的每次提交,git都会自动把它们串成一条时间线,这条时间线就是一个分支。在git里,有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:

image.png

git reset

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本,如下图所示,假设我们要回退到版本一:

image.png

适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

eb76a1e表示回退到commit是eb76a1e的位置 
git reset --hard eb76a1e
// 然后push到远程,把远程的也回滚
git push origin HEAD -f 

这个时候就有个问题,如果是多人开发,现在有A同学去拉代码,他拉的代码仍然是回滚之前的,也就是你回滚之后,A同学无法拉到回滚之后的代码。那么这个时候需要A同学本地HEAD和线上的HEAD保持一直,使用如下命令即可,就是重置HEAD跟线上某个分支保持一致,因为git reset的作用就是修改HEAD的位置。

git reset --hard origin master

image.png

git revert

git revert是用于"反做"某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:

image.png

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

  1. 反做: 使用"git revert -n commitid"命令。如下命令,我们反做(即撤销)版本号为8b89621的版本。注意: 这里可能会出现冲突,那么需要手动修改冲突的文件,而且要git add 文件名。

  2. 提交: 使用"git commit -m ''",此时可以用"git log"查看本地的版本信息,可见多生成了一个新的版本

  3. 使用"git push"推上远程库