当前位置: 首页 > news >正文

12-丢弃提交的内容

reset --hard 丢弃最新提交

有的时候,刚提交的commit内容写得实在太烂,连自己的都看不下去,与其修改它还不如丢掉重写。这种情况,就可以用reset来丢弃最新的提交。

比如你刚写了一部分内容并作了commit

写完后回头看了看,你觉得「不行,得重新写」。此时就可以用reset --hard来撤销这条commit

git reset --hard HEAD^

HEAD^表示往回数一个位置的commit

因为需要撤销最新的一个commit,所以就是要恢复到它的父commit,也就是HEAD^。那么在执行上述命令之后,最新一条commit就被撤销了:

不过,就像图上显示的,被撤销的那个commit并没有消失,只是你不再用到它了。如果你在撤销它之前记下了它的SHA-1码,你还是可以通过SHA-1来找到它的。

假如有一个commit,你刚写完的时候并没有觉得它不好,可是在几次提交以后,你突然灵光一现:「哎呀,那个commit不该写,我要撤销!」

不是最新的提交,就不能用reset --hard来撤销了。这种情况的撤销,就要用之前介绍过的一个指令:交互式rebaserebase -i

用交互式 rebase 撤销提交

之前介绍过,交互式rebase可以用来修改某些旧的commits。其实除了修改提交,它还可以用于撤销提交。比如下面这种情况:

你想撤销倒数第二条commit,那么可以使用rebase -i

git rebase -i HEAD^^

然后就会跳到commit序列的编辑界面,这个在之前已经介绍过,你需要修改这个序列来进行操作。不过不同的是,之前讲的修正commit的方法是把要修改的commit左边的pick改成edit,而如果你要撤销某个commit,做法就更加简单粗暴一点:直接删掉这一行就好。

pick的直接意思是「选取」,在这个界面的意思就是应用这个commit。而如果把这一行删掉,那就相当于在rebase的过程中跳过了这个commit,也就是把这个commit撤销掉了。

现在再看log,就会发现之前的倒数第二条commit已经不在了。

git log

用 rebase --onto 撤销提交

除了用交互式rebase,你还可以用rebase --onto来更简便地撤销提交。rebase加上--onto选项之后,可以指定rebase的「起点」。

一般的rebase,告诉 Git 的是「我要把当前commit以及它之前的commits重新提交到目标commit上去,这其中,rebase的「起点」是自动判定的:选取当前commit和目标commit在历史上的交叉点作为起点。

例如下面这种情况:

如果在此时执行rebase,那么 Git 会自动选取branch1分支ce78a3main分支3f5ecd的历史交叉点c379097作为rebase的起点,依次将branch1分支的a5b4e2ce78a3重新提交到3f5ecd的提交路径上去。

git rebase 3f5ecd

执行rebase操作之后的提交历史变成下图所示:

注意结果图也说明了rebase操作会改变commit的 SHA-1 值

--onto参数,就可以额外给rebase指定它的起点。例如以下图所示,如果我只想把5提交到3上,不想附带上4,那么我可以执行:

git rebase --onto 第3个commit 第4个commit branch1

--onto参数后面有三个附加参数:目标commit、起点commit(注意:rebase会把起点排除在外)、终点commit。所以上面这行指令就会从4往下数,拿到branch1所指向的5,然后把5重新提交到3上去。

同样的,你也可以用rebase --onto来撤销提交:

git rebase --onto HEAD^^ HEAD^ branch1

上面这行代码的意思是:以倒数第二个commit为起点(注意起点不包含在rebase序列中),branch1为终点,rebase到倒数第三个commit上。

也就是这样:

小结

一、撤销最新的提交,方式是通过git reset --hard 目标commit

二、撤销过往的提交,方法有两种:

  1. git rebase -i在编辑界面中删除想撤销的commits;
  2. git rebase --ontorebase命令中直接剔除想撤销的commits。

两种方法理念是一样的:在rebase的过程中去掉想撤销的commit,让他它消失在历史中。

http://www.cnnetsun.cn/news/3986456.html

相关文章:

  • 3D模型局部变形技术:从顶点操作到面部网格塑形实战
  • 满洲里建设局网站:揭秘边疆城市数字化转型背后的民生温度与治理智慧
  • mysql数据库,明明有索引为啥不用
  • 深圳网站建设哪家强?深度解析易通鼎如何以真诚服务与企业共赢未来
  • AI技能调用新范式:索引+按需读取机制详解与工程实践
  • 基于WASM与IPC桥接的零侵入Electron应用可观测性SDK设计
  • 做乌克兰网站建设时千万别只照搬国内套路深度解析本地化运营那些坑与机遇
  • 架构图配色实战指南:从混乱到专业的视觉沟通心法
  • 现代Web表格开发:从基础架构到性能优化的实战指南
  • 现代C++编译期编程:从模板元编程到constexpr与concepts的降维实践
  • Go-Select多路复用机制的面试真题与底层实现
  • 2023年计算机网站建设实训总结:从零基础到全栈开发的全方位深度复盘与经验沉淀
  • LangChain框架解析:从RAG到Agent的LLM应用开发实战
  • Milvus 与 RAG 权限边界:集合、元数据和原文分别授权
  • 网站建设电话销售开场白如何破冰:让冷启动变热成交的实战指南
  • 【公共云三十问 之十九】公共云如何走出一条中国特色道路?
  • Dev-C++下载安装全攻略:从版本选择到高效配置,C/C++初学者必看
  • 独立性权重结果解读:基于指标独立性的客观赋权
  • 零基础小白必看!哪里学网站建设与管理才能快速就业?避坑指南全解析
  • GitHub高效筛选开源项目:1分钟定位优质仓库的工程化方法
  • 良率与设备指纹:哪台机台是隐形杀手
  • Brocade交换机微码升级实战:从风险评估到自动化部署全解析
  • 【项目编号:project71044】Spring Boot 电商项目实战:土特产销售平台,商品、购物车、订单与配送完整闭环
  • 深入了解中国有色金属建设股份有限公司网站背后的匠心与实力:从源头到全球布局的行业全景解析
  • 3个步骤快速解锁Untrunc:拯救损坏MP4视频的终极指南
  • SpringBoot+Vue企业级智慧图书管理系统架构解析
  • Git版本控制核心原理与高效团队协作实战指南
  • 福州绿光网站建设工作室:揭秘企业官网背后的匠心与温度
  • 不同短视频平台截图情况记录
  • SimMIM: a Simple Framework for Masked Image Modeling【一种用于掩码图像建模的简单框架】