有这样一种场景: 用git commit几个版本,然后突然发现最近几次ci都有问题,准备取消。
G1 - G2 - G3 - B1 - B2 - B3
G1,G2,G3都是good commit,但是从B1开始,后面的B2,B3都是bad commit。现在要"撤销"几次commit回滚到G3。
HEAD是git的当前commit的指针,具体含义如下
G1 - G2 - G3 - B1 - B2 - B3 / / / /-- HEAD / / /------ HEAD~1 / /---------- HEAD~2 /-------------- HEAD~3
$ git reset --hard HEAD~3
reset是本地的code、缓冲区都会回退到某个版本,会变成这样,之前的commit记录都没了。
G1 - G2 - G3 /-- HEAD
这种情况下,版本是回退了,但是git push的时候会报错,原因就是本地版本比远程版本更低,除非使用push --force,但是这是很危险的操作,会导致G3以后所有用户的commit都丢失!
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