回退代码——git revert / git reset

git revert

适用于一些简单场景的的代码回退:

这个操作的本质是创建一个指定的commit的反向代码的commit

比如你在某个commit里面进行了【添加了一行代码A,并删减了一行代码B】的修改操作,我们将本次操作命名为commit1

那么你在进行对该次commit的git revert操作时,会创建一个内容包含了【删除了一行代码A,并添加了了一行代码B】的commit,我们将本次操作命名为commit2

那么此时git的head指针指向的是commit2

所以这就有一个问题了,如果说head指针的指向的是commit2,那么就意味着另一个包含有commit1的分支在尝试merge这个分支的时候,git将无法识别到commit1,因为git会认为commit1是一个已经提交过的代码

可能上面的【理论分析】还有点云里雾里,那么举个例子就好说明上面的情况了:

现在有一个主分支master,今天有一个dev_20231109分支合到master,合进去以后才发现,今天不是11月8号吗?然后你用git revert操作回滚了刚刚的merge操作。可是当年隔天(11月9号)再次准备将这个dev_20231109合到master的时候你会发现,两个分支竟然毫无差异!这就是我上面提到的点:git会认为你在9号这天的merge操作中的commit差异,已经在昨天8号的merge操作合并过了,这就是往往导致git合并时丢失代码的一个原因,此时的代码完全可以抢救,接下来要介绍的正儿八经的git回退代码——git reset

git reset

git reset是正儿八经的回退代码的git代码,为什么这么说呢?因为它可以移动head指针到达指定位置

我们还是举上面那个例子,假设,你在8号这天进行dev_20231109合到master这个操作之前的最后一个commit的编号是【A001】(这个编码你可以在任何包含git信息的页面看到,比如如下图所示的这个,一般会显示成一个比较短的号码,如图只有de40fd5,实际的完整编码是非常长的,但是git可以通过这个显示的短号码匹配到正确的commit),而把8号那天的dev_20231109合到master的这个commit的编号为【A002】,那么reset需要指向的是这次错误的提交【A002】前的最后一次正确的提交【A001】

此时你首先执行

git reset --hard A001

将本地分支的head指针指向A001

git push -f

然后将本地分支推送到远程仓库

此时你会发现你再次创建dev_20231109合到master的merge请求时,git就能显示正确的差异了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值