Reset、Revert 跟 Rebase 指令有什麼差別?

本文深入探讨Git中Revert、Reset与Rebase三个指令的区别。通过实例解析,阐述如何使用Revert指令撤销提交,Reset指令直接回滚到指定状态,以及Rebase指令调整历史记录。适合多人协作项目中理解不同场景下指令的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重置,恢复跟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之修改历史纪录的指令的场合。

转载于:https://my.oschina.net/clyy/blog/3018762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值