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

Git 逆转时光:版本回退操作详解

git 版本回退操作详解

  • 一、Git的工作流程
  • 二、git clean尚未 commit 的修改
  • 三、已经 commit 尚未 push 到 remote 仓库
  • 四、已经提交到 remote 仓库
  • 五、回退建议
  • 六、总结

一、Git的工作流程

在讲这个版本回退之前,我们要温习一下Git的原理。下面这张图就是 Git 的整个工作流程,也是 Git 抽象出来的几个概念。
在这里插入图片描述
Git 的四个区域:

  • workspace:本地工作区,就是你平时存放项目代码的地方。比如你拉取代码git clone ssh://fly@192.168.31.91:/home/fly/srcssrcs目录就是本地工作区了。开发者就在工作区里写代码。

  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。值得一提的是,SVN 是没有暂存区概念的。暂存区允许把多次修改统一放在暂存区中,然后再由暂存区统一提交到本地仓库,确保提交记录清晰。

  • Repository: 本地仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。

  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。

Git 的 工作流程 一般是这样的:
在这里插入图片描述

  1. 在工作区目录中添加、修改文件;产生数据变更。

  2. 将需要进行版本管理的文件add到暂存区域;

  3. 将暂存区域的文件commitgit仓库;

  4. 本地的修改push到远程仓库,如果失败则执行第5步;

  5. git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突,回到第三步。

因此,git管理的文件至少有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)。

二、git clean尚未 commit 的修改

本地做了一些修改,包括修改了某些文件,增加了某些文件,删除了一些目录,也添加了一些目录,有些内容添加到了暂存区,有些没有。情况很复杂,但是、总之,这些修改没有commit到本地仓库,那此时我们说的版本回退就是指丢弃修改。那如何操作呢?
在这里插入图片描述

从原理图中,看到git checkout命令就是从本地仓库中或暂存区检出文件,并且覆盖工作目录的内容。比如:

# 检出到branches/stable-1.14分支上,即用1.14分支的内容覆盖了工作区所有内容
git checkout branches/stable-1.14  # 检出到9bfbacdd(commit id)上,即用这个commit 内容覆盖了工作区所有内容
git checkout 9bfbacdd  # 从暂存区中检出内容,并且覆盖main.cpp文件内容,即尚未添加到暂存区的修改会被丢弃掉
git checkout main.cpp 

可是上面都是说从git的本地仓库和暂存区里检出内容,然后覆盖掉工作区的内容,即丢弃了本地所有的修改。

那如果是有些内容已经存在工作区了,但是尚未提交到暂存区,即是untracked的内容,那么我们可以使用git clean命令来删除这些文件,用法如下:

  • git clean -n :是一次clean的演习,告诉你哪些文件会被删除,记住他不会真正的删除文件,只是一个提醒。
  • git clean -f :删除当前目录下所有没有track过的文件,他不会删除.gitignore文件里面指定的文件夹和文件,不管这些文件有没有被track过。
  • git clean -f <path> :删除指定路径下的没有被track过的文件。
  • git clean -df :删除当前目录下没有被track过的文件和文件夹
  • git clean -xf :删除当前目录下所有没有track过的文件,不管他是否是.gitignore文件里面指定的文件夹和文件。

好了,如果我们想要放弃本地的所有修改可以:

  • git checkout .:注意有一个“.”,会从暂存区里取出所有内容覆盖掉工作区的所有修改,如果连暂存区的内容也不想要则可以git checkout commit-id
  • git clean -xdf:删除当前目录下所有的修改。

如果我们想要放弃本地某个文件的修改:

git checkout file-name  # 从暂存区里

三、已经 commit 尚未 push 到 remote 仓库

有时候,我们在本地的修改,可能提交到了本地仓库,但是尚未push到远程仓库,针对这一种场景的
回滚是比较简单的,如下图所示:
在这里插入图片描述
origin/master指向了5ff5433b这个commit,本地有三个commit,现在想针对这三个commit作回滚,可
以使用git reset命令来做,reset参数如下:

  • --soft:缓存区和工作目录都不会被改变
  • --mixed:默认选项。你指定的提交同步,但工作目录不受影响
  • --hard:缓存区和工作目录缓存区和都同步到你指定的提交

git reset --hard HEAD~{n}就是把HEAD指针回退n个版本(commit),并且使用该commit的内容覆盖掉工作区的内容,即丢弃了前面ncommit的修改和当前工作区的修改。然后调用git push origin master推送到远程仓库。

四、已经提交到 remote 仓库

在使用Git进行版本控制时,如果我们已经将本地的代码提交(push)到了远程仓库,那么我们需要考虑两种情况。

首先,我们需要判断我们提交的代码是否有其他同事已经在此基础上进行了修改,并且将这些修改也推送到远程仓库。如果其他同事已经在我们的提交之上进行了修改,并且这些修改已经被推送,那么如果我们直接回退(例如使用 git reset),将会导致这些同事的修改被丢弃。同时,这种操作还会删除历史记录,这可能不符合我们的预期,尤其是在团队协作中,这会对同事的工作造成影响。

另一方面,如果没有其他同事在我们的提交上进行修改,那么我们可以考虑使用 git revert 来回退我们的提交。这种方法会创建一个新的提交,以抵消我们想要回退的那个提交,这样既保留了历史记录,也不会影响到其他同事的工作。

有些人可能会问,为什么不使用 git reset 呢?因为 git reset 会完全删除关于指定提交的历史记录,这样不仅会导致记录的不完整,也会对团队中的其他成员产生负面影响。因此,使用 git revert 是更好的选择。

具体来说,假设我们当前有三个提交,如果我们希望回退到某个特定的提交(比如 d061cb3),而这个提交之后的工作并不是我们想要的,那么我们应当使用 git revert d061cb3 来进行回退操作。这样做可以确保我们的操作是安全的,并且符合团队协作的最佳实践。

示例:

git revert d061cb3 # 因为4bff67b是晚于d061cb3的,如果这两个修改的内容有依赖,是会有冲突的,# 当然如果想取消这次回退可以使用,git revert --abort
fix conflict  # 手动去解决冲突
git commit  # 然后提交,此时使用git log会发现原理的git commit记录还在,# 但是增加了一个revert的记录
git push    # 推送至远程库

如果有其它同事基于我们的commit做修改的话,我们回退版本的时候不想把他的提交给回退
掉,比如想回滚到5ff5433b这里,但是有其他人的一个提交我不能回滚掉,要保存他的代码,
而且如果有多个同事的修改在在5ff5433b之后的,那怎么办呢?

比较好的做法就是从5ff5433b拉取一个新的分支(分支名是reset_to_5ff5433b), 因为这个新分
支不包含要回滚的代码,此时我们可以把其它同事的修改手动合并到reset_to_5ff5433b分支,接着
切换到master分支上,使用git merge reset_to_5ff5433b去合并分支到master上。这也就是分支操作的知识点。

# 从5ff5433bd1fe4处创建分支,即代码是5ff5433bd1fe4处的代码
$ git checkout -b reset_to_5ff5433b 5ff5433bd1fe4 
# 查看master分支上的其它同事的提交(比如KING),把他的修改在新分支上再修改一遍 
$ git show 9d531db98276 
$ git commit –a –m "reverted 5ff5433b"
# 切换到master分支
$ git checkout master 
$ git merge reset_to_5ff5433b
$ git push #推送到远程仓库

五、回退建议

在日常开发中,频繁回退(即使用 git revertgit reset)可能会影响工作效率和代码的整洁性。应当避免频繁回退:

  1. 定期提交:将工作分解成小的、可管理的任务,并在完成每个小任务后提交。这使得每个提交都比较小,回退时不会影响太多代码。

  2. 写清晰的提交信息:确保每次提交的信息清楚明了,说明你做了什么以及为什么做。这样在需要回退时,可以更容易地理解代码更改的历史。

  3. 使用分支:在开发新特性或者进行大改动时,使用分支(例如 feature 分支)进行开发。这样可以在主分支上保持稳定,开发完成后再合并。

  4. 代码审查:在合并代码之前,进行代码审查,确保代码的质量以及逻辑的正确性。这样可以减少因错误而导致的回退。

  5. 测试:在提交之前进行测试,确保所有功能正常。这可以大大减少后续回退的可能性。

  6. 利用暂存区:使用 git add -p 选择性地添加更改到暂存区,这样可以更好地控制哪些更改会被提交,从而避免不必要的错误提交。

  7. 分阶段开发:如果某个特性较复杂,可以将其分成几个阶段来开发。每完成一个阶段,就进行一次提交,可以减少大规模的回退。

  8. 使用标签:在重要的版本发布前打标签(git tag),这样在回退时可以更方便地找到之前的稳定版。

六、总结

在使用Git时,可能会遇到需要回退的情况。理解和掌握Git的回退操作,对于高效地管理代码至关重要。
Git版本回退的主要方法:

  • git revert:用于撤销一个提交的更改,创建一个新的提交来逆转之前的更改。这是一种安全的回退方法,因为它保留了历史记录,不会影响到其他团队成员的工作。
  • git reset:用于重置当前分支到指定的提交,可以删除之后的提交记录。虽然它可以更彻底地回退更改,但它会修改提交历史,因此在公共分支上使用时需要小心。
  • 要避免频繁回退。

掌握Git不仅仅是了解其基本命令,更是通过实践来真正理解其工作原理和最佳使用方法。通过不断的实践和学习,将能够更好地掌握Git的使用,提高代码管理的能力和开发效率。Git是一个工具,而精通它的使用将使你成为一个更优秀的开发者。

在这里插入图片描述

相关文章:

Git 逆转时光:版本回退操作详解

git 版本回退操作详解 一、Git的工作流程二、git clean尚未 commit 的修改三、已经 commit 尚未 push 到 remote 仓库四、已经提交到 remote 仓库五、回退建议六、总结 一、Git的工作流程 在讲这个版本回退之前&#xff0c;我们要温习一下Git的原理。下面这张图就是 Git 的整个…...

8.6.数据库基础技术-数据库的控制

并非控制 事务&#xff1a;由一系列DML操作组成&#xff0c;这些操作&#xff0c;要么全做&#xff0c;要么全不做&#xff0c;它从第一个DML操作开始&#xff0c;rollback、commit或者DDL结束&#xff0c;拥有以下四种特性&#xff0c;详解如下&#xff1a; &#xff08;操作)…...

php语言基础入门

文章目录 php语言基础入门一、简介二、基础语法1、变量2、常量3、注释4、基础数据类型4.1、整形数据类型4.2、布尔数据类型4.3、字符串数据类型4.4、浮点型数据类型4.5、PHP数据类型之查看和判断数据类型 5、流程控制5.1、if-elseif-else语句使用5.2、switch语句使用5.3、while…...

告别杂音,从 AI 音频降噪开始

生活中&#xff0c;音频无处不在。无论是聆听动人的音乐&#xff0c;还是参与重要的电话会议&#xff0c;又或是沉浸于精彩的网课学习&#xff0c;清晰、纯净的音频质量都至关重要。然而&#xff0c;音频中的噪声却像不速之客&#xff0c;扰乱着这份美好。 音频中的噪声形式多样…...

Postman中params传参与Body传参区别以及Body中不同类型的区别

Postman中params传参与Body传参区别 在HTTP请求中&#xff0c;参数可以通过不同的方式传递给服务器&#xff0c;其中最常见的两种方式是使用params&#xff08;查询参数&#xff09;和body&#xff08;请求体&#xff09;。以下是它们的主要区别&#xff1a; 1. 位置&#xf…...

数据结构入门——05队列

1.队列 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先 进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾出队列&#xff1a;进行删除操作的一端称为队头 队列也可以数…...

使用python MySQL 实现一个 key-value(string:json) 读写库

在Python中,我们可以使用`pymysql`库(如果MySQL服务器版本较高,也推荐使用`mysql-connector-python`)来建立一个简单的key-value存储库,其中键是字符串,值是JSON格式的数据。这里我们创建一个基本的类来完成读写操作: import pymysql.cursors import jsonclass JsonKVS…...

实现:uniapp项目分享视频页面到微信,可以自定义分享的页面样式及内容

背景&#xff1a;最近在逐步完善一个uniapp项目的视频功能&#xff0c; 包括有视频录制及发布&#xff0c;在完善过程中想要实现分享 视频到微信的功能&#xff0c;也就是相当于分享链接到微信&#xff0c; 微信打开后可以获取到视频并可以观看&#xff0c;有了想法便 准备实行…...

【C++】—— 类与对象(五)

【C】—— 类与对象&#xff08;五&#xff09; 1、类型转换1.1、类型转换介绍1.2、类型转换的应用1.3、explicit 关键字 2、static 静态成员2.1、static 静态成员变量2.2、static 静态成员函数2.3、总结 3、友元3.1、友元函数3.2、友元类 4.内部类5、匿名对象6、对象拷贝时的编…...

scp命令的使用

在Windows和Linux之间传文件&#xff0c;最简单的是共享目录&#xff0c;如果不能使用共享目录&#xff0c;可以使用scp命令&#xff0c; 一般Windows和Linux都支持。 scp命令是secure copy的缩写&#xff0c;用于在Linux下进行远程文件拷贝&#xff0c;windows一般也有该命令…...

定位和解决线上接口性能优化或者数据库性能优化的思路是什么?

定位和解决线上接口性能优化或数据库性能优化问题是一项复杂且系统性的工作&#xff0c;需要综合运用监控、分析、调优等手段。以下是一个详细的思路&#xff0c;帮助您从定位问题到解决问题&#xff0c;确保系统的高效运行。 一、定位接口性能问题 1.1 监控和日志 1.1.1 监…...

修改docker的/var/lib/docker/overlay2储存路径

目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…...

解决中国式报表难题,这款工具真的免费且好用

一、概述 报表&#xff0c;对于任何企业或组织来说都不陌生。它将复杂的数据信息以简洁明了的方式展现出来&#xff0c;帮助决策者快速理解数据背后的趋势和问题。无论是财务报表、销售报表&#xff0c;还是库存报表&#xff0c;都是日常工作中不可或缺的部分。然而&#xff0…...

图解Kafka | 彻底弄明白 Kafka 两个最重要的配置

我已经使用 Kafka 近两年了&#xff0c;我发现有两个配置很重要&#xff0c;但是不太容易理解。这两个配置分别是acks和min.insync.replicas。 本文将通过一些插图来帮助理解这2个配置&#xff0c;以便更好的使用Kafka为我们服务。 复制 我假设你已经熟悉 Kafka了 &#xff…...

创建线程的三种方式

创建线程的三种方式 1. Thread 匿名内部类 Slf4j public class CreateThread {public static void main(String[] args) {Thread t1 new Thread("t1") {Overridepublic void run() {log.info("hello world");}};t1.start();} }2.定义 Runable public s…...

官宣|Apache Flink 1.20 发布公告

作者&#xff1a;郭伟杰(阿里云), 范瑞(Shopee) Apache Flink PMC&#xff08;项目管理委员&#xff09;很高兴地宣布发布 Apache Flink 1.20.0。与往常一样&#xff0c;这是一个充实的版本&#xff0c;包含了广泛的改进和新功能。总共有 142 人为此版本做出了贡献&#xff0c;…...

HarmonyOS应用一之登录页面案例

目录&#xff1a; 1、代码示例2、代码分析3、注解分析 1、代码示例 实现效果&#xff1a; /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance w…...

KubeSphere 部署 Kafka 集群实战指南

本文档将详细阐述如何利用 Helm 这一强大的工具&#xff0c;快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。 实战服务器配置(架构 1:1 复刻小规模生产环境&#xff0c;配置略有不同) 主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库…...

手把手教你安装音乐制作软件FL Studio 24.1.1.4285中文破解版

在当今数字化时代&#xff0c;音乐创作不再局限于传统的乐器和录音室&#xff0c;而是借助先进的音乐制作软件&#xff0c;如FL Studio&#xff0c;实现了前所未有的便捷与高效。FL Studio&#xff0c;以其强大的功能、直观的界面和丰富的插件资源&#xff0c;成为了众多音乐制…...

SDL 与 OpenGL 的关系

OpenGL 和 SDL 是两个不同的库&#xff0c;但它们可以配合使用来创建图形应用程序。 SDL&#xff08;Simple DirectMedia Layer&#xff09; SDL 是一个跨平台的多媒体库&#xff0c;用于处理图形、声音、输入和其他游戏开发所需的功能。它简化了窗口创建、事件处理和图形上下…...

考研数学 线性代数----行列式与矩阵

核心框架 前置知识 正式内容 知识点1:单位矩阵 知识点2:可逆矩阵 知识点3: |A|与可逆 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识…...

Golang实现简单的HTTP服务,响应RESTful请求判断形状大小

题目要求&#xff1a; 题目 1.shape 接口有面积Area() float64和 周长Perimeter()fioat64 两个法。为Circle Rectangle实现shape 接口。 2.实现isGreater(shape1&#xff0c;shape2 shape)boo1 函数&#xff0c;用于比较两个形状的大小,并使用单元测试验证 3.实现http.Handle…...

使用C语言构建Lua库

Lua 本身是用 C 语言编写的&#xff0c;因此使用 C 编写扩展可以更好地与 Lua 引擎集成&#xff0c;减少性能瓶颈&#xff0c;同时C 语言提供了对底层硬件和操作系统功能的直接访问能力&#xff0c;让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非…...

愤怒的江小白,这几年怎么了?

近日&#xff0c;东方甄选和江小白的纠纷引发了广泛关注。 8月8日晚间&#xff0c;东方甄选直播间中&#xff0c;主播天权在带货某款白酒产品时突然对比点评江小白产品&#xff0c;称江小白“不是白酒”&#xff1a;“你现在去看江小白的包装&#xff0c;上面是没有‘白酒’这…...

Unity教程(十)Tile Palette搭建平台关卡

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…...

如何防止员工私自拷贝公司内部文件?安企神帮你解决泄密之忧

在企业运营中&#xff0c;保护公司的机密信息至关重要。员工私自拷贝公司内部文件不仅可能导致商业秘密泄露&#xff0c;还可能损害公司的声誉和经济利益。下面我们将介绍一些有效的方法来防止这种情况的发生&#xff0c;并以“安企神”软件为例进行详细说明。 1. 明确规章制度…...

Linux应急响应检查工具

最近一直在优化的 linux 应急检查脚本&#xff0c;也是我一直在应急使用的工具 https://github.com/sun977/linuxcheckshoot 脚本包含两个检查工具&#xff0c;详情可看 README 或者 Banner linuxGun.sh 和 linuxcheck.sh 区别 1、linuxcheck.sh 是完整的 linux 系统检查脚本,…...

CP AUTOSAR标准之EEPROMAbstraction(AUTOSAR_SWS_EEPROMAbstraction)(更新中……)

1 简介和功能概述 EEPROM抽象层的功能、API和配置(见图1)。   图1:内存硬件抽象层模块概览   EEPROM抽象(EA)从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方案和分段以及“几乎”无限数量的擦除周期。 3 相关文献 3.1 输入文件 [1]基础软件模块列表AUTO…...

重启redis服务时报错:Failed to start redis.service: Unit not found

重启redis服务时报错&#xff1a;Failed to start redis.service: Unit not found redis配合安全修改了bind和auth配置&#xff0c;重启的时候报错了&#xff0c;试了很多方法&#xff0c;最后才通过日志解决了 1 重新加载systemd 配置并启动&#xff1a; sudo systemctl da…...

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值&#xff0c;我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…...