重置,恢复跟Rebase指令有什么差别?
在进入这个主题之前,先看一下Revert这个指令。
如果想要拆除已经完成的提,在“ 【状况题】刚才的提后悔了,想要拆掉重做... ”章节介绍过可使用重置指令来处理,在前几章也有介绍过使用Rebase来修改历史纪录,例如把多个提并成一个,把一个拆成多个,删除提交,调整提交顺序或是在指定的提工之间再加入新的提等,接下来要介绍的Revert指令,也是另一可以用来「后悔」的指令。
使用还原指令
来看一下怎么使用Revert指令。假设目前的历史纪录是这样:
如果想要取消最后这次的Commit(add dog 2
),可以这样做:
$ git revert HEAD --no-edit
[master f2c3e8b] Revert "add dog 2"
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 dog2.html
加上后面的--no-edit
参数,表示不编辑提交消息。使用SourceTree可以在想要取消的提上按滑滑鼠右键,然后选择「还原提交...」
这样就把最后一次提的内容给删掉了...等等,档案是不见了没错,但是好像有点怪怪的:
提交怎么增加了?而且原来的那个add dog 2
的提也还在?原来,Revert的指令是“再做一个新的提交,来取消你不要的提交”的概念,所以提交数量才会增加。
那怎么取消?
如果做出来的这个Revert你也不想要了,有几个方式来处理它:
再开一次还原
是的,你可以再开一个新的Revert,来Revert刚刚这个Revert(有点饶口):
$ git revert HEAD --no-edit
[master e209455] Revert "Revert "add dog 2""
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dog2.html
但刚刚被删掉的dog2.html
又复活了,但这样承诺又变多了......
直接使用重置
如果是要「砍掉」这个Revert,其实只要直接使用重置指令就行了:
$ git reset HEAD^ --hard
这样就可以回到Revert之前的状态了。
什么时候使用Revert指令?
如果是自己一个人做的专案,用Revert指令其实有点过于「礼貌」了,大部份都是直接使用重置就好。但如果对于多人共同协作的专案,也许因为团队开发的政策,你不一定有机会可以使用Reset指令,这时候就可以Revert指令来做出一个“取消”的承诺,对其他人来说也不算是“修改历史”,而是新增一个承诺,只是刚好这个承诺是某某个委员反向的操作而已。
所以,这三个指令有什么差别?
用个表格归纳一下:
指令 | 改变历史纪录 | 说明 |
---|---|---|
重启 | 是 | 把目前的状态设定成某个指定的提交的状态,通常适用于尚未推出去的提交。 |
变基 | 是 | 不管是新增,修改,删除提都都相当方便,用来整理,编辑还没有推出去的提相当方便,但通常也只适用于尚未推出去的提交。 |
还原 | 否 | 新增一个承诺反转(或说取消)另一个承诺的内容,原本的承诺旧还是会保留在历史纪录中。虽然会因此而增加承诺数,但通常比较适用于已经推出去的承诺,或是不允许使用Reset或Rebase之修改历史纪录的指令的场合。 |