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

news2024/11/19 16:25:12

系列文章目录

手把手教你安装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>

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

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

相关文章

【ArcGISPro】CSMPlugins文件夹

在ArcGISPro软件的CSMPlugins文件夹含有以下一个应用程序的扩展 从文件的名称可以看出美国地质调查局的太空地质学与ESRI合作进行的一个软件扩展&#xff0c;而USGS主要是遥感影像方向的应该&#xff0c;所以估计该dll的主要功能是多遥感影像进行处理&#xff0c;支持软件的不同…

MySQL(三)查询

1、单表和多表查询 1.1 算术运算符、比较运算符及特殊运算符 1)MySQL的算术运算符 select 0.1+0.3333,0.1-0.3333,0.1*0.3333,1/2,1%2; select 1/0,100%0; select 3%2,mod(3,2); 2)MySQL的比较运算符 select 1=0,1=1,null=null; select 1<>0,1<>1,null<&…

Scala环境的搭建

要搭建Scala&#xff0c;我们必须先下载java&#xff0c;由于我的电脑已经搭建好了环境&#xff0c;因此我这里用截图来教大家搭建环境。 可以从网上搜索安装包对其进行安装 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 不建议下载最新版的&#xff0c;大家下载的版本可以下…

【大宗】第一期:大航海时代下的[集运欧线]

一、大航海时代 - 集运欧线前世今生 01 航运合约指数的诞生 ‍‍‍‍ 2023年8月18日&#xff0c;上海期货交易所的伙伴们搞了个大新闻——他们推出了一种新的期货品种&#xff0c;叫做“欧线集运”。这可不是什么普通的期货&#xff0c;它是基于一个叫做SCFIS的指数&#xf…

goimghdr,一个有趣的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - goimghdr。 Github地址&#xff1a;https://github.com/corona10/goimghdr 在图像处理和分析过程中&#xff0c;识别图像文件的类型是一个常见的需求。Python自带的imghdr…

DINO结构中的exponential moving average (ema)和stop-gradient (sg)

DINO思路介绍 在 DINO 中&#xff0c;教师和学生网络分别预测一个一维的嵌入。为了训练学生模型&#xff0c;我们需要选取一个损失函数&#xff0c;不断地让学生的输出向教师的输出靠近。softmax 结合交叉熵损失函数是一种常用的做法&#xff0c;来让学生模型的输出与教师模型的…

阿赵UE引擎C++编程学习笔记——GameMode和生命周期

大家好&#xff0c;我是阿赵。   之前在介绍HelloWorld的时候&#xff0c;我们很创建了一个MyGameModeBase的c类&#xff0c;然后就可以在BeginPlay函数里面写打印的HelloWorld。这一篇主要是说一下&#xff0c;GameMode究竟是一个什么东西&#xff0c;然后UE里面的生命周期是…

huggingface 笔记:聊天模型

1 构建聊天 聊天模型继续聊天。传递一个对话历史给它们&#xff0c;可以简短到一个用户消息&#xff0c;然后模型会通过添加其响应来继续对话一般来说&#xff0c;更大的聊天模型除了需要更多内存外&#xff0c;运行速度也会更慢首先&#xff0c;构建一个聊天&#xff1a; ch…

企业文件加密实现数据泄露防护

在数字化时代&#xff0c;数据成为企业最宝贵的资产之一。然而&#xff0c;数据泄露事件频发&#xff0c;给企业带来了巨大的经济损失和声誉风险。为了保护企业的核心利益&#xff0c;实现数据泄露防护&#xff0c;企业必须采取有效的文件加密措施。 一、数据泄露的严重性 数据…

基于STM32实现智能交通灯控制系统

目录 引言环境准备智能交通灯控制系统基础代码示例&#xff1a;实现智能交通灯控制系统 GPIO控制交通灯定时器配置与使用红外传感器检测车辆用户界面与显示应用场景&#xff1a;城市交通管理与自动化控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

汽车大灯中擎耀智能控制器在车灯智能化配置下的创新与分析

随着科技的飞速发展&#xff0c;汽车工业也在不断地进行着革新。其中&#xff0c;车灯作为汽车的重要组成部分&#xff0c;其智能化配置已经成为汽车行业的一大趋势。这种趋势不仅为消费者带来了更加安全、便捷的驾驶体验&#xff0c;同时也为商家提供了丰富的商业机会。汽车工…

JS中运算符详解

一&#xff1a;赋值运算符 1 类型 、、-、*、/等 2 如何运行 &#xff0c;是将等号右边的数赋值给左边以为例&#xff0c;let num 5&#xff1b;num2等价于numnum2 二&#xff1a;一元运算符 1 自增运算符 什么是一元运算符 只需要一个操作数就可以运算的运算符 &#x…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

【御控工业物联网】 Java JSON结构转换、JSON结构重构、JSON结构互换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上&#xff0c;多位业内专家齐聚一堂&#xff0c;共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括&#xff1a; Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

【第5章】SpringBoot整合Druid

文章目录 前言一、启动器二、配置1.JDBC 配置2.连接池配置3. 监控配置 三、配置多数据源1. 添加配置2. 创建数据源 四、配置 Filter1. 配置Filter2. 可配置的Filter 五、获取 Druid 的监控数据六、案例1. 问题2. 引入库3. 配置4. 配置类5. 测试类6. 测试结果 七、案例 ( 推荐 )…

vivo X100 Ultra自称销售额破5亿,真实销量成谜?

文/张诗雨 5月28日9点&#xff0c;vivo 正式启动了其旗舰新机vivo X100 Ultra的全渠道销售工作。这款新机&#xff0c;早在5月13日就已正式亮相&#xff0c;并推出了三种存储容量的版本&#xff0c;分别是12GB256GB、16GB512GB以及16GB1TB&#xff0c;而相应的售价也不低&…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…