git撤销commit的三个方法
撤销commit有很多方法,个人比较推荐用reset或rebase-i,底下将会同时介绍revert和reset的方法。
commit如下
A->B->C->D->E
想要还原到commitC之后的状态(也就是把D和E回退)
1revert
用:
gitrevertE gitrevertD
结果:
A->B->C->D->E->F->G
F是还原commitE修改结果的commit
G是还原commitD修改结果的commit
因此,revert只会让commit继续往前
优点是可以针对某个commit进行还原,并且留下还原记录
2rebase-i
假如想要抽掉某个commit又不想留下记录,rebase-i就很好用了
假如只想要还原D变成:
A->B->C->E
则用命令
gitrebase-iC
这时候会出现文字编辑
pickDxxx pickEooo
把pickDxxx整列移除后储存就可以了,若中间有遇到冲突,则必须自行修正后再继续
gitadd. gitrebase--continue
3reset
用于做整段commits的还原
例如希望还原到Bcommit以后的状态变成
A->B
则
gitresetB
那么git会将log中的C,D,E都清除
但档案内容没有任何变动,因此会看到C,D,E修改的档案处在unstaged阶段
若针对部分档案还原可以用
gitcheckout[filepath]
若要全部还原可用
gitcheckout-f
4结论
还没push前,个人倾向不产生太多commit。因此我都会用rebase-i进行编修,顺便合并或reword一些commit
某个特殊情况,例如发现某个commit里面包含了不相干的档案,欲重新commit时,就会先用rebase-i把欲修改的commit换到后面(较新),然后再用reset重新stage+commit。
参考资料:
- 透過rebase-i,reset,revert還原某個commit的方法
- Git-rebase小筆記