亡羊补牢,一文讲清各种场景下GIT如何回退

系列文章目录

手把手教你安装Git,萌新迈向专业的必备一步
GIT命令只会抄却不理解?看完原理才能事半功倍!
常用GIT命令详解,手把手让你登堂入室
GIT实战篇,教你如何使用GIT可视化工具
GIT使用需知,哪些操作会导致本地代码变动


在这里插入图片描述
经过前面的学习,GIT的基本原理以及使用想必大家已经是门清了,但是在实际操作中,很多同学还是会有误操作的情况。本文就讲下各种场景下代码如何回退

📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 GIT 专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待


一、commit 前回退

场景:当我们在工作区做了一些改动,或者ADD了一些新文件,但还没有提交时

1. 整个工程回退

此时如果我们想整个工程回退到上一个提交版本,可以使用 resetcheckout,如

git reset --hard HEAD

我们在这里使用了 – hard, 这样会丢弃工作区的所有改动以及暂存区的新增文件,并将指针移动到上一个提交版本,即把所有文件恢复至上一个提交点

如果你使用IDEA的话,那你可以这样操作,当然Idea中需要提前安装GIT插件,可参考《手把手教你安装Git,萌新迈向专业的必备一步》

在这里插入图片描述

2. 单个文件回退

但有的时候我们仅仅是一个文件搞砸了,不需要回退整个工程,仅需要回退某个文件到上次提交点的话,可以使用 checkout 把某次提交的某个文件给取出来

git checkout <commit-hash> -- <file-path>

比如 我们想将example.txt文件回退到上一次 commit 的状态,就可以这么用

 git checkout -- example.txt

如果你使用IDEA的话,则可以使用里面的 Rollback 操作达到同样的效果

在这里插入图片描述

3. 新增文件回退

对于一些新文件,如果已经ADD过,那么它就进入了暂存区,如果想把它从暂存区移出来,可以通过命令来实现

git reset HEAD <file-name>

或者Idea的 Rollback 此时也有同样的效果

在这里插入图片描述


二、commit 后回退

场景:如果我们比较不幸,把使用 commit 后,才发现有错误,我们就需要把本地仓库也回退掉了

1. 回退到上个版本

我们可以使用以下命令撤销上一次提交

git revert HEAD

这会创建一个新的提交,将上一次提交的改动反转回去。如果你使用Idea的话,可以直接在提交记录中进行Revert Commit

在这里插入图片描述

需要注意的是,这并非真正意义的撤销提交 ,而是把原始内容重新覆盖回去,所以revert会产生一次新的提交记录。而如果想要真正的“撤销提交”,可以使用IDEA中的Undo Commit

在这里插入图片描述

这其实是运用了下面的 git reset --soft 机制,回退并保留工作区的代码

2. 回退到指定版本并放弃后续修改

当然有的时候我们发现的时候,本地已经commit了好几次了,这个时候我们想回到某一次提交的版本,就需要自己指定了回退的位置了

git reset --hard <commit-hash>

其中是需要回退到的提交版本的哈希值,每一次提交的 hash 值我们都可以在 git log 里看到,这会丢弃指定版本之后的所有提交,并将指针移动到指定版本。Idea 的话可以这么操作

在这里插入图片描述

或者在Log中直接选择对应的提交记录进行 reset,两种方式都一样

在这里插入图片描述
在这里插入图片描述

3. 回退到指定版本但保留工作区

如果我们commit后才发现错误,其实我们更常见的想法是,回溯-改掉-重新提交,那么我们就要求回溯后,我们本地的代码不会跟着回退,我们可以基于目前的代码改完后再次提交。这样我们就可以这么用

git reset --soft <commit-hash>

这样我们本地仓库的位置会停留在你指定的提交点,但是工作区的东西不会受到影响。IDEA的操作和上面一样,只是弹窗里选择 Soft 即可


三、push 后回退

场景:当我们在本地误操作后,没有及时发现,已经将错误内容push到远程仓库时

一般来说,push上去,按严重程度可分为两种情况,

  • push 进特性分支或自己的独立分支,但没有 merge 进主分支
  • push 后,错误代码已经进入主分支

在团队开发中,一般当错误被误push进主分支时,情况就比较严重了,此时为了避免问题复杂化,或引起不必要的冲突,强烈建议其他组员暂停向该分支合并

此时若要修复,其实就是下面这两步

1. 修复本地内容

这一步其实就是上面提到的《commit 后回退》章节,可以自己选一种方式来修复

2. 推送至远程

本地修改好以后,再将本地回退的修改强制推送到远程仓库,就使用push命令

git push origin <分支名>git push -f origin <分支名>

请注意,如果使用了git push -f命令来强制推送修改,这可能会导致他人的工作丢失。因此,在执行此操作前,请确保与团队成员进行充分的沟通,并确保你有足够的理由和权利来修改远程仓库的历史记录。


四、恢复误删分支

如果我们误删除了一个分支,可以使用以下命令进行恢复:

git reflog

这会列出所有的提交历史,找到被删除的分支的最后一次提交的哈希值。然后使用以下命令进行恢复:

git branch <branch-name> <commit-hash>

其中是需要恢复的分支名称,是被删除分支的哈希值。这会重新创建被删除的分支。

五、回退命令对比

通过上面的内容,不难发现在Git中,有几个常用的命令用于实现回退功能:resetrevertcheckout,我们接下来就简要分析下它们的用法、原理,以及最终回退的效果是否有所不同。

1. reset命令

reset 命令可以将HEAD指针和当前分支指向指定的提交。根据其参数 softmixedhard 的不同,其最终的效果是不同的

  1. git reset --soft <commit-hash>:将HEAD和当前分支指向指定提交,但不改变暂存区和工作目录的内容。通过这种方式,可以撤销之前的提交,但保留修改的文件和刚ADD的文件
  2. git reset --mixed <commit-hash>:将HEAD和当前分支指向指定提交,且重置暂存区,但不改变工作目录的内容。通过这种方式,可以撤销之前的提交,并保留当前修改的文件
  3. git reset --hard <commit-hash>:将HEAD和当前分支指向指定提交,并将暂存区和工作目录的内容恢复为与指定提交相同。这种方式会彻底取消之前的提交,并删除相关的修改

简而言之,三种 reset 方式都能重置到指定的提交点,该位置之后的提交记录都会消失,但可以自由选择是否保存暂存区和工作区里的代码.soft 全保留,mix 只保留工作区, hard 则是重置所有啥都不剩

2. revert命令

revert命令用于撤销指定的提交,创建一个新的提交来表示撤销的变更,它的标准样式就是

git revert <commit-hash>

效果是创建一个新的提交,将之前的提交的变更内容恢复到当前分支中,同时保留历史记录。因为它能指定某一次提交进行恢复,最终新增一次提交,那么它有可能会发生冲突,这个时候就需要手动控制冲突修复了

3. checkout命令

checkout命令用于切换分支或恢复文件的状态。其标准样式为

git checkout <commit>

在回退功能中,可以使用checkout命令来切换到之前的提交,从而实现回退.与上面两种方式比,checkout 即不会产生提交,也不会修改分支内容(即分支指向的位置,不清楚分支真正概念的可以去看《GIT命令只会抄却不理解?看完原理才能事半功倍!》)。只是单纯切换分支,所以本地分支是会被更改掉的。

而且 checkout 还能把单个文件恢复到任意提交点的样子,其样式为

git checkout <commit-hash> -- <file-path>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Meta 推出新型多模态 AI 模型“变色龙”(Chameleon),挑战 GPT-4o,引领多模态革命

在人工智能领域&#xff0c;Meta 近日发布了一款名为“变色龙”&#xff08;Chameleon&#xff09;的新型多模态 AI 模型&#xff0c;旨在挑战 OpenAI 的 GPT-4o&#xff0c;并刷新了当前的技术标准&#xff08;SOTA&#xff09;。这款拥有 34B 参数的模型通过 10 万亿 token 的…

2-EMMC启动及各分区文件生成过程

EMMC的使用比nand flash还是复杂一些&#xff0c;有其特有的分区和电器性能 1、启动过程介绍 跟普通nand或spi flash不同&#xff0c;uboot前面还有好几级 在vendor某些厂商的设计中&#xff0c;ATF并不是BOOTROM加载后的第一个启动镜像&#xff0c;可能是这样的&#xff1a; …

微信小程序多端应用Donut Android生成签名

一、生成签名的作用 确保应用的完整性&#xff1a;签名可以确保应用在发布后没有被修改。如果应用被修改&#xff0c;签名就会改变&#xff0c;Android系统就会拒绝安装。确定应用的唯一身份&#xff1a;签名是应用的唯一标识&#xff0c;Android系统通过签名来区分不同的应用…

【Postman接口测试】第二节.Postman界面功能介绍(上)

文章目录 前言一、Postman前言介绍二、Postman界面导航说明三、使用Postman发送第一个请求四、Postman 基础功能介绍 4.1 常见类型的接口请求 4.1.1 查询参数的接口请求 4.1.2 表单类型的接口请求 4.1.3 上传文件的表单请求 4.1.4 JSON 类…

Linux软硬链接详解

软链接&#xff1a; ln -s file1 file2//file1为目标文件&#xff0c;file2为软链接文件 演示&#xff1a; 从上图可以得出&#xff1a; 软链接本质不是同一个文件&#xff0c;因为inode不同。 作用&#xff1a; 软连接就像是Windows里的快捷方式&#xff0c;里面存放的是目标…

动手学操作系统(三、通过IO接口直接控制显卡)

动手学操作系统&#xff08;三、通过IO接口直接控制显卡&#xff09; 在之前的学习内容中&#xff0c;我们成功编写了MBR主引导记录&#xff0c;在终端上进行了打印显示&#xff0c;在这一节我们使用MBR通过IO接口来直接控制显卡输出字符。 文章目录 动手学操作系统&#xff0…

5.28_Java语法_运算符,接收键盘数据

1、运算符 具体应用同我C语言操作符详解博客相同,另有补充会直接写 1.1、基本的算术运算符、符号做连接符 CSDN 具体应用同我C语言操作符详解博客相同 符号做连接符&#xff1a; ""符号与字符串运算连用的时候是用作连接符的&#xff0c;其结果依然是一个字符串…

“SSH服务器拒绝了密码,请再试一次”的问题解决思路

大家在使用XShell工具连接Ubuntu系统时&#xff0c;可能会出现错误如下: 通过在网上查阅资料和实践解决这个问题&#xff0c;将我的思路分享给大家&#xff01; 首先&#xff0c;我会先从使用Xshell连接远程服务器会涉及哪些东西上思考这个问题&#xff0c;即通过ssh服务连接远…

【Python】 如何从日期中减去一天?

基本原理 在编程中&#xff0c;日期和时间的处理是一个常见的需求&#xff0c;尤其是在处理日志、调度任务、数据分析等场景中。Python 提供了多种方式来处理日期和时间&#xff0c;其中最常用的库是 datetime。datetime 模块包含了日期&#xff08;date&#xff09;、时间&am…

香橙派 AIpro初体验

香橙派&#xff08;Orange Pi&#xff09;AI Pro开发板是一款高性能的AI开发板&#xff0c;由香橙派联合华为精心打造。香橙派&#xff08;Orange Pi&#xff09;&#xff0c;作为深圳市迅龙软件有限公司倾力打造的开源产品品牌&#xff0c;致力于向全球个人及企业用户提供卓越…

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建及使用 前言 官网介绍&#xff1a;ARL全称-Asset Reconnaissance Lighthouse&#xff0c;中文含义&#xff1a;资产侦察灯塔系统。 旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 协助甲方安全团队或…

Creo装配体中只显示一部分零部件

从模型树中选中要显示的零部件&#xff0c;也可以结合Ctrl框选的方式选择对象。然后在模型树右击等会弹出选项&#xff0c;点选----即可

比较(一)利用python绘制条形图

比较&#xff08;一&#xff09;利用python绘制条形图 条形图&#xff08;Barplot&#xff09;简介 条形图主要用来比较不同类别间的数据差异&#xff0c;一条轴表示类别&#xff0c;另一条则表示对应的数值度量。 快速绘制 基于seaborn import seaborn as sns import matplo…

基于单片机的自行车里程监测系统的设计

摘 要 &#xff1a;本设计是一种基于单片机的自行车里程监测系统&#xff0c;采用 STC89C52RC 单片机为核心处理芯片&#xff0c;液晶显示器使用 LCD1602 &#xff0c; 速度测量使用霍尔传感器&#xff0c;温度传感器使用 DS18B20 &#xff0c;时间由时钟芯片 DS1302 进行…

HTML-JavaWeb

目录 1.标题排版 2.标题样式 ​编辑 ​编辑 小结 3.超链接 4.正文排版 ​编辑​编辑​编辑5.正文布局 6.表格标签 7.表单标签 8.表单项标签 1.标题排版 ● 图片标签 :< img> src:指定图像的ur1(绝对路径/相对路径) width:图像的宽度(像素/相对于父元素的百…

【硬核测评】猫咪主食冻干测评揭秘SC、希喂、爱立方真实对比测评

主食冻干喂养是否必要&#xff1f; 来自七年经验的铲屎官明确告诉你&#xff0c;这是非常必要的喂养方式&#xff01; 随着宠物经济的蓬勃发展和科学养宠知识的普及&#xff0c;如今养猫已不仅仅是让猫咪吃饱那么简单。越来越多的养猫人开始重视猫咪的饮食健康。大量实际喂养案…

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性

这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数&#xff1f;1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…

kafka-消费者组-发布订阅测试

文章目录 1、发布订阅测试1.1、创建消费者4并指定组 my_group21.2、列出所有的消费者组1.3、查看 my_group2 组的详细信息1.4、发送第六条消息accomplish1.4.1、查看 my_group1 组的详细信息1.4.2、查看 my_group2 组的详细信息 1、发布订阅测试 接着上一篇点对点博客测试 kafk…

Java入门基础学习笔记49——ArrayList综合案例

ArrayList的综合案例-模仿外卖系统中的商家系统 需求&#xff1a; 完成菜品的上架、以及菜品信息浏览功能。 目标&#xff1a; 使用所学的ArrayList集合结合面向对象编程实现以上两个需求。 Food类&#xff1a; package cn.ensource.arraylist;public class Food {private …

【前端之ES6语法】

前端之ES6语法 1. ES6简介2. ES6新特性3.ES6不支持&#xff0c;使用babel3.1 参考文献 4.let和const命令5. 模版字符串6.函数之默认值、剩余参数7. 函数之扩展运算符、箭头函数8.箭头函数this指向和注意事项9.解构赋值10.对象扩展11.Symbol类型12.Set集合类型13.Map数据类型14.…