git代码撤销回滚只看这一篇就足够了!

news2024/11/28 7:40:53

1. 代码撤销

  目前大家都在使用git,在项目开发中,总会遇到提交的代码有问题,想要撤销回滚的操作,关于撤销回滚代码单独给大家介绍一下。
  正常的提交代码如果要提交到远程仓库有下边3步命令:

     git add . ------------> git commit -m 说明 -------------> git push
   (添加到暂存区)              (提交到本地仓库)             (推送到远程仓库)

  在git里,撤销代码的命令主要为git reset,但是有git reset --softgit reset --hardgit reset --mixed3种模式。这三种命令主要是针对已提交仓库之后的代码的回滚,基本后边都是要带上提交日志版本号回滚的。3种模式代表的不同含义如下:

  • --soft:该命令表示撤销代码到暂存区之后,commit之前,代码在本地不会改变。

  • --mixed:该命令表示撤销代码到暂存区和commit之前,代码在本地不会改变。

  • --hard:该命令表示回退代码到某个版本下,代码在本地会改变到指定版本下,谨慎操作。
      下边要说的内容,简单如下图所示:
    在这里插入图片描述

再次强调:--hard命令,在使用时千万注意,带上它会把代码直接回滚没了。就算是本地新写的都给清掉了。

2. 不同模式下的撤销

  下边围绕上边的提交步骤和撤销的模式分别解释下撤销后的现象。在说撤销之前,先熟悉两个命令git statusgit log
  首先git status通过这个命令,能够看到当前代码在哪个分支下、工作区的代码情况。
在这里插入图片描述
  如上图,在代码工作区中输入git status之后,能够看到当前代码处在v1.0分支下,当前工作区中有1个文件5.txt还没有提交到暂存区。
  git log命令是查看的代码提交的记录,能够看到提交信息及版本号(SHA码)。如下图:
在这里插入图片描述
  当然我这篇讲的命令执行位置,都是需要在git项目工作空间里执行,一般都是在项目根路径下执行。
  代码撤销这块,我主要想到有下边这几种撤销,提交暂存区的撤销(add撤销)提交本地仓库撤销(commit撤销)推送远程仓库撤销(git push之后的撤销)。具体如下:

2.1 add撤销

  当代码通过git add .提交到暂存区,如果想要从暂存区撤回来,主要有以下几个方法。

2.1.1 git reset撤销

  如果想将提交到暂存区的代码,直接撤回来,最方便的是输入git reset命令。该命令或者输入git reset HEAD效果一样。此步骤会将代码撤销到执行git add .前的状态,如下图所示:
在这里插入图片描述

2.1.2 git restore撤销

  当然还有一个命令是git推荐的,但是感觉不如git reset方便。即上面图中绿色文字上边的一行里,git restore --staged命令。

git restore --staged .

或者:

git restore --staged 文件名

2.1.3 git reset --mixed撤销

  最前边说了撤销的三种模式,其中--mixed模式,如果想撤销刚提交到暂存区的代码,也可以如下操作:

git reset --mixed

  但是那三种模式--soft--mixed--hard主要用来基于已commit的代码版本号回滚代码的,用在这里有点大材小用。另外只有--mixed可以不用写版本号完成撤销操作,其他两个不写版本号(除了用HEAD^)都无效果。
  提个问题:使用--soft能够回退git add .前的代码吗?使用--hard可以回滚吗?另外回滚会有什么现象?

2.2 commit撤销

  当代码经过git commit -m 备注说明提交本地仓库之后,想要代码回滚,有以下几种方法来回退不同状态的代码。主要使用--soft--mixed模式。关于后边追加版本号的方法,下边只在--soft模式下介绍。

2.2.1 撤销到暂存区

  只是将代码撤销到暂存区之后,还未添加到本地仓库的话,只能使用--soft模式。使用该模式需要加版本号,写法主要有以下几种。

2.2.1.1 git reset --soft HEAD^写法

  HEAD^表示撤销到上一个版本号,其中一个^表示上一次,^^表示上上次,以此类推。另外,需要注意,非windows系统下正常输入git reset --soft HEAD^,即可将代码撤销到git add .之后的状态(暂存区状态)。但是windows系统下需要输入git reset --soft HEAD^^才可以。

  这是因为在windows系统下cmd控制台中换行符默认是^,而不是\ ,如果输入少了,会提示more?,意思是问你下一行是否需要再输入,而^符号就被当做换行符而被git命令忽略掉了。

  因此,如果在windows下是撤销2次commit,需要输入4个^才可以。

解释:当每次commit之后,都会有提交的记录版本号(通过输入git log命令查看),通过HEAD^只能撤销一次,
拼接多个就会撤销多个。

2.2.1.2 git reset --soft HEAD~写法

  git reset --soft HEAD~1命令,其中1表示撤销上一次提交,如果是再前一次~2即可。
   此命令不分windows系统和非windows的问题,可以优先使用这个。

2.2.1.3 git reset --soft 版本号写法

   如果想撤销的版本在很久之前,无法用数字或多个^来锁定,这种情况下,可以通过使用git log查看历次提交记录,然后根据版本号来撤销,git reset --soft 版本号

  也可以看自己需要使用--mixed--hard(谨慎)来回退不同模式的代码。
  如下图所示,是查看的日志情况:

D:\workspaces\testproject>git log
commit 15047ee4229c4c0255a62816290c2a41068e8327 (HEAD -> master)
Author: lingsf <944916889@qq.com>
Date:   Tue Jan 3 20:16:53 2023 +0800

    提交9文件

commit 09f0fd5e00d863ccab839824c0ac11f2c82dabf2
Author: lingsf <944916889@qq.com>
Date:   Tue Jan 3 20:04:43 2023 +0800

    提交8文件

commit 9e10843e96f7cd5a138f405231f06c61e83c4429
Author: lingsf <944916889@qq.com>
Date:   Tue Jan 3 19:48:54 2023 +0800

    提交7文件

commit 05fd4925cf0e4341a404d5c5596470d6053d7319
Author: lingsf <944916889@qq.com>
Date:   Tue Jan 3 16:40:48 2023 +0800

   回退到提交7文件这一版本:


D:\workspaces\testproject>git reset --soft 9e10843e96f7cd5a138f405231f06c61e83c4429

D:\workspaces\testproject>git log
commit 9e10843e96f7cd5a138f405231f06c61e83c4429 (HEAD -> master)
Author: lingsf <944916889@qq.com>
Date:   Tue Jan 3 19:48:54 2023 +0800

    提交7文件

2.2.2 撤销到暂存区之前 — git reset --mixed

  假如你想撤销到暂存区之前(即 git add .之前),只需要将--soft修改为--mixed即可。其他的用法和上边一致。

2.3 commit之后修改注释

  其实很多时候,我们撤销代码可能只是因为注释写的不完善,想重新修改。如果只是想修改下commit后的注释,可以在commit之后,还没有推送远程分支之前,使用git commit --amend命令,进入vim编辑空间,输入i进入编辑模式,修改最上边的注释文字,修改完之后点击esc键,再输入:wq保存退出即可。如下图:
在这里插入图片描述

  当然,如果已推送到远程分支上,虽然也能通过这个命令修改日志内容,但是修改完再提交就是新的日志记录,远程上仍然会有旧的注释。
  另外,还有假如说我们在本地提交了两次commit填写了两次说明,那也仅仅只能修改最后一次。

2.4 已推送远程仓库后的撤销

   推送到远程仓库和提交本地仓库没有什么区别,仍然使用三种模式--soft--mixed--hard进行撤销即可。因为撤销其实不管你用什么模式,都是撤销的我们本地代码,与远程无关,至于你撤销完代码之后,是合并回原分支,还是新拉分支,代码是不会影响远程分支的。
  使用--hard(谨慎)来回退不同模式的代码。
  另外,已经推送到远程分支的代码记录,是无法撤销的,只能是撤销回来本地的改完再提交回去,但是无法撤销以前的提交记录。

3. 实际操作

3.1 场景一:线上分支被覆盖,加了新的功能。

  有一次我们一个线上项目新增后续租金存量需求,研发直接在线上主分支开发的。但是新开发的功能因为测试和其他问题没法直接上线。后来线上提出了几个bug,需要进行修改。因为线上分支已经加了后续租金存量的代码,这种情况下如果想回滚会线上分支,可以采取以下步骤。

3.1.1 拉出新的临时分支

  先基于目前的分支(包含了存量后续租金需求),拉出一个新的临时分支。

3.1.2 通过提交记录找到回滚位置

  基于提交说明(此处就体现了要正确写代码提交备注的重要性),找到代码首次提交后续租金存量的需求点,记录下在它之前的版本号。如下:
在这里插入图片描述
  经过分析,需要回滚到19f5a4a3这次,才能够回滚到线上分支那个状态。

3.1.3 基于--hard回退代码

  基于上图右侧的版本号19f5a4a3b87f0478a9ed061de5fa0e756a36c295,点击复制,然后在这个新拉的临时分支里,输入git reset --hard 19f5a4a3b87f0478a9ed061de5fa0e756a36c295即可完成这个分支的代码回滚,经过测试没有问题之后,再将该分支合并或者改名为新的线上主分支。

3.2 场景二:本地代码已经写了部分功能,但是还没有提交

  本地如果在主分支上新增功能,主要是加了很多开发的东西,还未提交,这时候可能线上加急解决一个问题,需要修改一下,但是自己新加的代码还没有完成,还要去改以前的分支,这时候应该这么做。

3.2.1 基于现在代码新拉分支

  代码不要提交仓库,如果提交了的话,就按照前边的步骤(不能使用–hard)回滚回来,然后先使用git checkout -b 新分支名,拉出一个分支。在这个分支上将代码至少提交到本地仓库。

3.2.2 切回原来的分支

  当新分支代码已提交,再切回主分支的时候,这个分支上就还是线上分支,加急修改要求的问题即可。

4. 总结

  代码撤销是应用比较频繁的一个功能,一般最常用的就是git resetgit reset --amend修改注释两个命令。在使用过程中,一定注意--hard,多加练习就知道其中的区别了。

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

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

相关文章

软件测试/测试开发丨Web自动化 测试用例流程设计

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27173 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1…

RobotFramework自动化测试框架系列学习-----(一)简介、搭建、运行

一、简介 基于Python的关键字驱动的自动化框架。 1.基于Python&#xff1a;就是由python语言开发的这个框架。 2.关键字驱动&#xff1a;关键字驱动测试又称为表格驱动测试&#xff0c;是自动化测试的一种方法&#xff0c;是数据测试的一种改进方法。关键字驱动主要包括测试步骤…

利用vba处理Excel表格数据实现键值转化,适用于将编码转化成对应的文本

最近遇到了一个甲方需要提供系统登录的用户名单和对应的角色权限内容。无奈直接从数据库导出的数据对应的都是编码&#xff0c;没有转成中文&#xff0c;想着偷个懒能不能直接用Excel直接转&#xff0c;网上看了一下有修改单元格格式的&#xff0c;但需要编码是2到3个。多的就用…

HyperDock 1.8.0.10(Dock优化工具)

HyperDock 是一款为 macOS 设计的实用工具&#xff0c;它提供了许多方便快捷的功能&#xff0c;使您能够更高效地管理和操作应用程序窗口。 首先&#xff0c;HyperDock 提供了类似于 Windows 7 的任务栏预览功能。当您将鼠标悬停在应用程序图标上时&#xff0c;会显示该应用程…

C++入门基础知识总结(超详细思维导图)

开门见山 思维导图奉上 引用和指针的区别宏宏的优缺点 C中替代宏C和C的区别 &#xff01;&#xff01;&#xff01; 详细部分参考该博客&#xff1a;从C快速入门C (命名空间、引用、函数重载&#xff09; &#xff01;&#xff01;&#xff01; 引用和指针的区别 ● 引用就…

cin、cin.getline()、getline()的用法【C++】

一、cin>> 用法1&#xff1a;输入一个数字或字符 #include <iostream> using namespace std; int main () {int a,b;cin>>a>>b;cout<<ab<<endl;return 0; } 用法2&#xff1a;接收一个字符串&#xff0c;遇“空格”、“TAB”、“回车”…

气导耳机有哪些品牌?市面上气传导耳机哪家好?

​随着人们对运动健康的重视&#xff0c;越来越多的人开始关注运动时佩戴的耳机。然而&#xff0c;传统的耳机在运动时往往会受到限制&#xff0c;而气传导耳机则可以避免这些问题&#xff0c;为用户带来更加舒适和便捷的使用体验。今天就来展开说说&#xff0c;市面上气传导耳…

【程序员必知必会3】ClickHouse和Hive究竟哪些区别

ClickHouse和Hive究竟哪些区别 ClickHouse和Hive都是用于大数据处理和分析的分布式存储和计算系统&#xff0c;但它们之间存在一些区别&#xff1a; 架构&#xff1a;ClickHouse采用列式存储和向量化执行引擎&#xff0c;可以实现亚秒级别的数据查询。而Hive采用基于Hadoop的数…

设置Linux CentOS7桥接模式连网

在虚拟机上安装centos7系统后&#xff0c;首要任务就是设置网络。 我们在文章《设置linux centos7连接网络》中讨论了如何设置NAT模式连网。本文讨论如何在设置好NAT模式后&#xff0c;调换为桥接模式。 仍采用图形化方式设置方法。 一、查看物理机网络 把虚拟机设置为桥接…

JDK源码解析-HashMap面试题

1. HashMap类 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题)* HashMap成员变量(初始化容量是多少、负载因子、数组长度为什么是2的n次幂)* HashMap扩容机制(什么时候需要扩容&#xff1f; 怎么进行扩容&#xff1f;)* JDK7 与 Jdk8比较&#xff…

检索与毒害 —— 对抗人工智能供应链攻击

作者&#xff1a;DAVE ERICKSON 在这篇文章中&#xff0c;了解人工智能大语言模型的供应链漏洞&#xff0c;以及如何利用搜索引擎的人工智能检索技术来对抗人工智能的错误信息和故意篡改。 虽然对于人工智能研究人员来说可能是新鲜事&#xff0c;但供应链攻击对于网络安全世界…

如何批量生成并分割m3u8视频,轻松提升您的视频制作效率!

亲爱的视频制作爱好者&#xff0c;您是否曾经为如何高效地批量生成和分割m3u8视频而烦恼&#xff1f;今天&#xff0c;我们为您带来了一款神奇的软件&#xff0c;让您的视频剪辑工作变得轻松无比&#xff01; 第一步&#xff0c;进入“媒体梦工厂”在主界面中有八个板块&#…

新手如何备考PMP考试?

回头看来&#xff0c;从战略上来说&#xff1a; 备考第一重点&#xff1a;要有一个清晰的目标——我要过&#xff01; 第二重点&#xff1a;足够重视它——把它的优先级调整到仅次于工作&#xff1a;万籁俱寂&#xff0c;唯有学习。 第三重点&#xff1a;自律——有了第一点…

Python入门教程 | Python 流程控制语句

​ 程序流程控制的三种结构 1.顺序结构 计算机执行程序的步骤是从上到下依次执行 2.选择结构&#xff08;条件控制&#xff09; Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件…

【2023集创赛】国家集创中心杯三等奖:不对称轻失配运算放大器

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;国家集创中心杯三等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

打工人必知:考取了HCIE后,哪些工作内容,工作岗位有哪些?

作为一个打工人&#xff0c;都很关心考到HCIE后&#xff0c;我们可以做哪些工作内容&#xff0c;就是有哪些岗位呢&#xff1f; 先给直接说答案&#xff0c;如果你现在手边有电脑&#xff0c;现在打开智联招聘&#xff0c;输入我现在所说的这些职位名称&#xff1a; 第一个&…

苹果电脑要安装杀毒软件吗?mac用什么杀毒软件好?

对于这个问题让人很是纠结&#xff0c;Mac不需要杀毒这个理论一直都深入人心&#xff0c;Mac OS X权限管理特性可以防毒的说法也一直甚嚣尘上&#xff0c;很多小伙伴如我一样搞不清楚到底要不要安装杀毒软件。&#xff0c;毕竟当前个人信息安全泄露泛滥不穷的年代&#xff0c;我…

振动智能监测解析:从数据中预测设备故障

在现代工业领域&#xff0c;设备的可靠性和稳定性对于生产效率和产品质量至关重要。设备故障可能导致生产停滞、维修成本增加以及产品质量下降&#xff0c;因此&#xff0c;采用先进的监测技术来预测和防止设备故障变得尤为重要。本文将深入探讨振动智能监测&#xff0c;这是一…

PMP是什么?项目管理专业人士资格认证介绍

PMP认证旨在评估和确认具备一定经验和知识的项目管理专业人士的能力。通过获得PMP认证&#xff0c;项目经理可以证明他们具备在各个行业中成功领导和管理项目所需的技能。这些技能包括十二原则、8大绩效等方面的知识。 以下是PMP认证的详细介绍&#xff1a; 1. 资格要求&…

基于SpringBoot+Vue架构的药物咨询平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着人们对健康和医疗…