git 版本回退

git 版本回退

有这样一种场景: 用git commit几个版本,然后突然发现最近几次ci都有问题,准备取消。

G1 - G2 - G3 - B1 - B2 - B3

G1,G2,G3都是good commit,但是从B1开始,后面的B2,B3都是bad commit。现在要"撤销"几次commit回滚到G3。

理解HEAD

HEAD是git的当前commit的指针,具体含义如下

G1 - G2 - G3 - B1 - B2 - B3
           \    \    \    \-- HEAD
            \    \    \------ HEAD~1
             \    \---------- HEAD~2
              \-------------- HEAD~3

reset

  • 如果本地未曾push到remote,那么可以直接采用reset,回滚到某个版本
$ git reset --hard HEAD~3

reset是本地的code、缓冲区都会回退到某个版本,会变成这样,之前的commit记录都没了。

G1 - G2 - G3
           \-- HEAD

这种情况下,版本是回退了,但是git push的时候会报错,原因就是本地版本比远程版本更低,除非使用push --force,但是这是很危险的操作,会导致G3以后所有用户的commit都丢失!

revert

  • 如果本地ci已经push到remote,就需要revert了

revert用法是

$ git revert --no-commit <start_ci>..<end_ci>
其中start_ci不包含,区间表示 (start_ci, end_ci],回滚到start_ci版本

上面的场景

$ git revert --no-commit HEAD~2^..HEAD

or

$ git revert --no-commit HEAD~3..HEAD

or

$ git revert --no-commit HEAD HEAD~1 HEAD~2

执行完 git revert后,变成了如下:R`就是最新的一次commit

G1 - G2 - G3 - B1 - B2 - B3 - R`

查看diff

$ git diff HEAD~4 HEAD

标签:Git