删除误提交的 git commit

背景描述

某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补.

模拟误提交操作

  • 在 Gitee 创建一个新的 Repo, clone 到本地
git clone https://gitee.com/lpwm/myrepo.git
  • 创建两个文件, commit 后 push 到 remote 作为初始提交
cd myrepo
echo "A file" > A.txt
echo "B file" > B.txt
git add *
git commit -m "Initial commit"
git push

在 Gitee 检查提交成功:
在这里插入图片描述

  • 分别修改两个文件, 模拟 A.txt 中误写入了敏感信息, B.txt 属于正常修改. commit & push
echo "Password is admin" >> A.txt
echo "Normal content appended" >> B.txt
git add *
git commit -m "Fault commit"
git push

在这里插入图片描述

  • 接下来我们要实现的是从远端的 Repo 中修复(删除) A.txt 中误写入的敏感信息, 同时保留 B.txt 中正常的修改内容.

实现过程

主要思路是, 首先从当前已经误提交的状态创建一个新的 branch 作为备份, 在主 branch revert 回滚到误提交前一次的 commit, 强制 push 到 remote 端, 此时远端 repo 中就不会存在后面误提交的 commit 了. 再从备份的 branch merge 到当前 branch, 修改误操作的文件后提交新的 commit, 然后使用 squash 合并最近的两次 commit, 最后再 push 一把.

  • 检查已提交过的历史记录
git logcommit 327d1b09d7fdb43af596c05713d8424181a6b97b (HEAD -> master, origin/master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:21:24 2023 +0800Fault commitcommit 27b6ee4ed4a0ff44f2a5831fd5162075bef6a4b4
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:15:30 2023 +0800Initial commit
  • 创建新的 branch 作为备份, 但是不切换
git branch backup
  • 确认当前仍处于默认的 master branch
git branchbackup
* master
  • 强制回滚到错误提交的前一次 commit, 即 Initial commit, 不保留后面做出的所有修改
git reset --hard 27b6ee4ed4a0ff44f2a5831fd5162075bef6a4b4
  • 检查确认文件内容回滚到了当时的状态
cat A.txtA file
  • 将当前状态强制推到 remote repo, 即从远端删除后面误提交的内容
git push --force
  • 检查确认 Gitee 中误提交的那次 commit 已经被删除
    在这里插入图片描述
    误提交的内容是删掉了, 但是其他正常修改的文件内容也没了, 肯定是不行的. 接下来我们继续使用前面创建的 backup branch 来进行合并恢复和修补

  • 确认当前激活的 branch 是 master

git branchbackup
* master
  • 将 backup 合并到 master
git merge backup
  • 检查 log, 可以看到 merge 后之前的误提交也回来了
git logcommit 327d1b09d7fdb43af596c05713d8424181a6b97b (HEAD -> master, backup)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:21:24 2023 +0800Fault commitcommit 27b6ee4ed4a0ff44f2a5831fd5162075bef6a4b4 (origin/master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:15:30 2023 +0800Initial commit
  • 检查 A.txt 也可以看到误提交写进去的敏感信息
cat A.txtA file
Password is admin
  • 这时候需要注意, 虽然文件内容是回来了, 但是我们都还是在本地进行的操作, 远端的 repo 中并不受影响, 因此我们可以继续修改 A.txt 文件内容, 将敏感信息删掉, 然后再提交一个新的 commit
echo "A file" > A.txt
git add *
git commit -m "Fixed commit"
  • 检查 log
commit b71cde372e30f7bec24a7a8d9086711ab517a2ba (HEAD -> master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:52:32 2023 +0800Fixed commitcommit 327d1b09d7fdb43af596c05713d8424181a6b97b (backup)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:21:24 2023 +0800Fault commitcommit 27b6ee4ed4a0ff44f2a5831fd5162075bef6a4b4 (origin/master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:15:30 2023 +0800Initial commit
  • 将 “Fixed commit” 和 “Fault commit” 合并(squash)成一个 commit
git rebase -i HEAD~2

注意这里的 HEAD~2 表示从 HEAD 位置往前倒推选择两次 commit 记录进行编辑, 从上面的 log 也可以找到 HEAD 位置就是最近提交的这次 Fixed commit. git rebase 命令执行后会进入到交互编辑模式
在这里插入图片描述
注意这里的 commit 显示顺序是倒着来的, 我们想要将 Fixed commit 合并入 Fault commit 里面, 因此需要修改 Fixed commit 前面的 picksquash, :wq保存后会出现新的 commit message, 默认是将两次的 commit message 拼接到了一起, 愿意改的就改一下, 然后继续保存, 提示 rebase 成功

git rebase -i HEAD~2[detached HEAD 2f1bc19] Fault commitDate: Tue Dec 5 22:21:24 2023 +08001 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
  • 再次检查 log, 可以看到除了最初的 Initial commit 外, 就只有一个上面合并后的 commit
git logcommit 2f1bc195739602a5d6d20e8438e143941b4e3359 (HEAD -> master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:21:24 2023 +0800Fault commitFixed commitcommit 27b6ee4ed4a0ff44f2a5831fd5162075bef6a4b4 (origin/master)
Author: lpwm <lpwm@qq.com>
Date:   Tue Dec 5 22:15:30 2023 +0800Initial commit
  • 再 push 到 remote repo
git push
  • 检查 Gitee
    在这里插入图片描述
    在这里插入图片描述
    完美!

  • 最后要做的一步就是清理本地 backup branch, 注意这里要用 -D 参数, 等同于 --delete --force 强制删除, 如果是普通的 -d 删, 会提示 error: The branch 'backup' is not fully merged.

git branch -D backup

参考文档

Squash commits into one with Git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 手工redis7.x cluster

IP端口192.168.0.816379/6380192.168.0.826379/6380192.168.0.1146379/6380 mdkir /data/{6379,6380}cat <<END> /data/6379.conf # 端口号 port 6379# 设置客户端连接后进行任何其他指定前需要使用的密码 #requirepass 123456 ## 当master服务设置了密码保护时(用re…

【教程】Conda更换镜像源安装pytorch

Windows下Conda安装pytorch换源 我们直接从conda官方或pytorch官方安装pytorch时&#xff0c;由于服务器在国外&#xff0c;速度很慢&#xff0c;或者无法下载/中断&#xff0c;这时候换上国内的镜像源会快很多。 这里给出更换阿里源的例子&#xff0c;其他国内源同理。 配置…

个人作品集

个人作品集 封面设计 排版设计 3D建模 Pr剪辑 个人剪辑作品 场景搭建

Azure Machine Learning - 使用 Azure OpenAI 服务生成文本

使用 Azure OpenAI 服务生成文本 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理专业人士&…

JavaScript 基础

JavaScript 是什么 一门语言一门脚本语言一门运行在浏览器中由浏览器解释执行的语言 JavaScript 语法特性 基于对象和事件驱动的解释型松散型语言 基于对象&#xff1a;我们在js当中要操作的一切的目标&#xff08;字符串、数组、浏览器、div…&#xff09;都是以对象的方式存…

金蝶云星空单据编辑界面,不允许批量填充操作

文章目录 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作案例演示开发设计测试 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作 案例演示 售后单&#xff0c;明细信息单据体&#xff0c;物料编码字段禁止批量填充。 开发设计 编写表单插件&#xff0c;在Be…

案例052:用于日语词汇学习的微信小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

iOS不越狱自动挂机

自动挂机在电脑上或者安卓手机上都相对容易&#xff0c;而在不越狱的iOS设备上还是有点难度的。 此方法不是我原创&#xff0c;详情见&#xff1a; 【苹果党福音&#xff0c;ios也能用的挂机脚本】 https://www.bilibili.com/video/BV1sv4y1P7TL/?share_sourcecopy_web&v…

菜鸟学习日记(python)——条件控制

Python 中的条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 它的一般格式为&#xff1a;if...elif...else if condition1: #条件1CodeBlock1 #代码块1 elif condition2:CodeBlock2 else:CodeBlock3 如果con…

win10的激活和使用问题

Win10专业版如何激活 Win10专业版如何激活 - 知乎 使用这方法成功了。 win10连上wifi却不能上网的问题解决方法&#xff1a;https://jingyan.baidu.com/article/c85b7a644c2996003bac958a.html 一&#xff1a;先改ipv4自动手动的&#xff0c;不行 二&#xff1a;把无线网卡…

利大于弊:物联网技术对电子商务渠道的影响

For Better or For Worse: Impacts of IoT Technology in e-Commerce Channel 物联网技术使用传感器和其他联网设备来手机和共享数据&#xff0c;并且被视为一种可以为供应链成员带来巨大的机会的突破性技术。本文的研究背景是&#xff1a;一个提供物联网基础设备的电子商务平…

CentOS最小化安装后怎么转图形界面/可视化桌面?

文章目录 1、命令行和图形界面切换方式一方式二 2、最小化安装转桌面1-设置网络2-测试网络3-更新文件4-安装图形5-查看默认6-设置默认 界面效果参考视频 1、命令行和图形界面切换 如果安装的是最小化&#xff0c;那么init 5 (进入图像化桌面)命令是无效的 方式一 1.如果在命…

初学Python基础后,如何制定学习计划?

如果你是Python小白&#xff0c;学完基础语法是个了不起的成就&#xff0c;但是接下来应该干嘛呢&#xff1f;你应该学习哪些内容&#xff1f;你应该如何规划你的Python学习路线&#xff1f; 其实这些问题的答案都取决于你的个人目标和兴趣。你想要用Python做什么&#xff1f;…

1.vue学习笔记(vue简介+API风格+开发前的准备)

1.介绍 1.一款用于构建用户页面的JavaScript框架 2.基于HTML、CSS、JavaScript 3.官方文档&#xff1a;cn.vuejs.org2.渐进式框架 1.注重灵活性/可被逐步集成 根据需求场景&#xff1a;1.无需构建步骤&#xff0c;渐进式增强静态的HTML2.在任何页面中作为Web Components嵌入&…

深入理解 Go 函数:从基础到高级

一、函数基础 1、函数定义 函数是组织好的、可重复使用的、用于执行指定任务的代码块Go 语言中支持&#xff1a;函数、匿名函数和闭包 package mainimport "fmt"func main(){ret : intSum(1,2)fmt.PrintIn(ret) //3 }func instSum(x,y int) int {return x y }…

全息图着色器插件:Hologram Shaders Pro for URP, HDRP Built-in

8个新的Unity全息图着色器,具有故障效果,扫描线,网格线,和更多其他效果!与所有渲染管线兼容。 软件包添加了一系列的全息图着色器到Unity。从基本的全息图与菲涅耳亮点,先进的全息图与两种故障效应,扫描线,文体点阵和网格线全息图! 特色全息效果 Basic-支持菲涅耳发光照…

Hadoop学习笔记(HDP)-Part.11 安装Kerberos

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Netty核心知识总结

Netty是一个高性能、异步事件驱动的NIO框架&#xff0c;它提供了对TCP、UDP和文件传输的支持&#xff0c;作为一个异步NIO框架&#xff0c;Netty的所有IO操作都是异步非阻塞的&#xff0c;通过Future-Listener机制&#xff0c;用户可以方便的主动获取或者通过通知机制获得IO操作…

数据标准化 VS 数据归一化

数据标准化 VS 数据归一化 数据标准化目的方法应用场景优点缺点 数据归一化目的方法应用场景优点缺点 总结 数据标准化 目的 将数据转换为均值为0&#xff0c;标准差为1的分布。 方法 对于每个特征&#xff0c;从其值中减去特征的平均值&#xff0c;然后除以特征的标准差。…

APOLLO自动驾驶技术沙龙:未来已来,共创智能交通新时代

在这次Apollo会议上&#xff0c;我深刻地感受到了人工智能自动驾驶技术领域的最新进展和未来趋势。作为一名从事软件开发工作的人员&#xff0c;我深感荣幸能够参加这次盛会。 前言 本次活动是百度Apollo社区工程师齐聚首钢Park&#xff0c;带来现场实操与技术分享。主要围绕Ap…