Git 提交错了,看我如何巧妙把锅甩给了新来的 baby

科技   2024-11-04 10:31   安徽  

来源:juejin.cn/post/7365414174217355314

👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

截止目前,累计输出 63w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2300+小伙伴加入

又是一遭悲惨的遭遇,git提交了一连串代码之后,发现提交错了。其实是把给老婆发的消息打到了comment里,然后还提交上去了。怎么办,这被看到岂不是要社死了。

img

一连串的研究之后,找到了几个解决方案。接下来我们一起搞搞这种错误提交的弥补方案。其中最离谱的是第三个方案。哈哈。

赛前准备

这里模拟一下这个操作,毕竟不能直接看我们的代码记录。我们新建一个项目,新建一个文件,起名001。

img

然后依次改为 002 003 004 005,每次都提交一次,在005的时候,执行异常提交。

最终我们得到一个005的文件

img

gitee上看是这样的

img

对于我们来说,现在是想删除这个异常提交,不仅删除代码,还想删除记录

也就是说,期待的是,文件变为004,而且这个提交记录删除掉。

方案1 交互式 rebase

首先我们尝试一下 git rebase -i HEAD~3,这样会取出最后的三条提交记录供我们编辑。

img

我们可以看到顶上有三条记录,这时候,我们删除这个异常的提交5

img

保存之后,会返回

git rebase -i HEAD~3
Successfully rebased and updated refs/heads/master.

这时候查看记录

img

异常提交已经没有了。

但是若是我们直接git push 会报错

img

告诉我们,我们当前的分支的版本是落后于远程分支的,不能提交。

这时候就需要git push --force这个命令,强制推送!!!

需要注意的是,强制推送会覆盖远程仓库中的历史记录,因此请确保你知道这个命令是个啥,并且有必要的话,需要通知团队其他成员协调好操作。

img

可以看到,git push --force 是可以成功的,而且再看gitee的记录

img

异常提交5已经不见了。并且本地的文件已经变为了004

img

其实在git rebase -i HEAD~3这个命令打开的交互框里是可以更改提交的顺序的,但是不能针对同一个文件的同一行,会冲突。

方案2 git reset

git reset 其实之前写文章讲过Git reset到底该如何使用,一文读懂系列[1] 这次我们就直接为达目的,直接使用。我们在上边的基础上,再提交一个异常提交5,使其恢复最初的情况。

i

然后gitee的情况:

img

这时候我们执行

git reset --hard HEAD~1

这个命令将删除最近的一个提交,包括提交所做的更改。请注意,这种方法可能会导致丢失未提交的更改,也就是说,本地写的没提交的代码就没了。所以请谨慎使用。

img

执行之后,我们可以看到异常提交5不见了

img

提交的时候也需要git push --force这个命令,强制推送!!!为啥每次都使用三个!!!呢,我只想告诉你,这个命令很恐怖,一定要慎之又慎。

这时候查看gitee记录

img

异常提交5没有了。

使用 git revert

还有小伙伴会说,为啥不用git revert呢,这不是git专门用来回滚代码的吗?

我们恢复异常提交005,再试试

img

我们执行 git revert f3d8db 并且 push

img

可以看到,文件是从005变为004了。但是从提交记录来看,不仅没有删除记录,还多了一条。其实,除非提交的注释特别社死,不然一般用的就是git revert,因为它不仅可以保存记录,还能确保版本是往前走的。

img

方案3 git filter-branch(谨慎使用)

查资料的时候,还看到一个这个命令,可以来一波骚的了。那既然提错了,把这锅甩给新人不就行了,哇咔咔咔咔咔。

git filter-branch --commit-filter '
    if git log --format="%B" -n 1 $GIT_COMMIT | grep -q "异常提交"; then 
         GIT_AUTHOR_NAME="new baby"; 
         GIT_COMMITTER_NAME="new baby"; 
         git commit-tree "$@"; 
     else 
         git commit-tree "$@"; 
     fi'
 -- --all

然后就是这样的

img
img

可以看到名字变了。当然邮箱也是可以改的。哇咔咔,这异常不就与我没关系了么。。。但是,极其不建议这么瞎折腾哈。

这个命令会根据条件重写整个历史。操作之前备份一下吧,别折腾坏了。而且一定先和其他的小伙伴商量一下,尤其是新人哈。

在此,就研究完毕了。正常来说使用第一种或者第二种方案都是可以的。不怕挨打的话,第三种方案也行。

git rebase 和 git reset 的区别

  • git rebase 命令用于将一个分支的提交移动到另一个分支上,或者重新应用一系列的提交。它的主要作用是改变提交的基础,即重新设置提交的起点。
  • git reset 命令用于修改当前分支的 HEAD 引用,或者用于撤销之前的提交操作。

也就是说git rebase 用于重新整理提交历史,而 git reset 用于调整当前分支的位置或撤销更改。关于这两个详细的使用,git reset已经写过了,有关git rebase的我会新开一篇文章,有关将一个分支的提交移动到另一个分支上这个操作虽不常用,但总有需要用到的时候。

Reference

[1]Git reset到底该如何使用: https://juejin.cn/post/7311681326712242239

👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;

截止目前,累计输出 63w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2300+小伙伴加入


1. 我的私密学习小圈子,从0到1手撸企业实战项目!

2. 一个小公司的技术开发心酸事(已倒闭)

3. MySQL线上执行语句,监控与日志不可少

4. 详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章

最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。

“在看”支持小哈呀,谢谢啦

小哈学Java
码龄9年,前某厂中台研发。专注于Java领域干货分享,不限于BAT面试, 算法,数据库,Spring Boot, 微服务,高并发, JVM, Docker容器,ELK相关知识,期待与您一同进步。
 最新文章