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/srcs
,srcs
目录就是本地工作区了。开发者就在工作区里写代码。 -
Index / Stage
:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。值得一提的是,SVN 是没有暂存区概念的。暂存区允许把多次修改统一放在暂存区中,然后再由暂存区统一提交到本地仓库,确保提交记录清晰。 -
Repository
: 本地仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。 -
Remote
: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
Git 的 工作流程 一般是这样的:
-
在工作区目录中添加、修改文件;产生数据变更。
-
将需要进行版本管理的文件
add
到暂存区域; -
将暂存区域的文件
commit
到git
仓库; -
本地的修改
push
到远程仓库,如果失败则执行第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
的内容覆盖掉工作区的内容,即丢弃了前面n
个commit
的修改和当前工作区的修改。然后调用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 revert
或 git reset
)可能会影响工作效率和代码的整洁性。应当避免频繁回退:
-
定期提交:将工作分解成小的、可管理的任务,并在完成每个小任务后提交。这使得每个提交都比较小,回退时不会影响太多代码。
-
写清晰的提交信息:确保每次提交的信息清楚明了,说明你做了什么以及为什么做。这样在需要回退时,可以更容易地理解代码更改的历史。
-
使用分支:在开发新特性或者进行大改动时,使用分支(例如
feature
分支)进行开发。这样可以在主分支上保持稳定,开发完成后再合并。 -
代码审查:在合并代码之前,进行代码审查,确保代码的质量以及逻辑的正确性。这样可以减少因错误而导致的回退。
-
测试:在提交之前进行测试,确保所有功能正常。这可以大大减少后续回退的可能性。
-
利用暂存区:使用
git add -p
选择性地添加更改到暂存区,这样可以更好地控制哪些更改会被提交,从而避免不必要的错误提交。 -
分阶段开发:如果某个特性较复杂,可以将其分成几个阶段来开发。每完成一个阶段,就进行一次提交,可以减少大规模的回退。
-
使用标签:在重要的版本发布前打标签(
git tag
),这样在回退时可以更方便地找到之前的稳定版。
六、总结
在使用Git时,可能会遇到需要回退的情况。理解和掌握Git的回退操作,对于高效地管理代码至关重要。
Git版本回退的主要方法:
git revert
:用于撤销一个提交的更改,创建一个新的提交来逆转之前的更改。这是一种安全的回退方法,因为它保留了历史记录,不会影响到其他团队成员的工作。git reset
:用于重置当前分支到指定的提交,可以删除之后的提交记录。虽然它可以更彻底地回退更改,但它会修改提交历史,因此在公共分支上使用时需要小心。- 要避免频繁回退。
掌握Git不仅仅是了解其基本命令,更是通过实践来真正理解其工作原理和最佳使用方法。通过不断的实践和学习,将能够更好地掌握Git的使用,提高代码管理的能力和开发效率。Git是一个工具,而精通它的使用将使你成为一个更优秀的开发者。
相关文章:

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

8.6.数据库基础技术-数据库的控制
并非控制 事务:由一系列DML操作组成,这些操作,要么全做,要么全不做,它从第一个DML操作开始,rollback、commit或者DDL结束,拥有以下四种特性,详解如下: (操作)…...
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 音频降噪开始
生活中,音频无处不在。无论是聆听动人的音乐,还是参与重要的电话会议,又或是沉浸于精彩的网课学习,清晰、纯净的音频质量都至关重要。然而,音频中的噪声却像不速之客,扰乱着这份美好。 音频中的噪声形式多样…...
Postman中params传参与Body传参区别以及Body中不同类型的区别
Postman中params传参与Body传参区别 在HTTP请求中,参数可以通过不同的方式传递给服务器,其中最常见的两种方式是使用params(查询参数)和body(请求体)。以下是它们的主要区别: 1. 位置…...

数据结构入门——05队列
1.队列 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先 进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头 队列也可以数…...
使用python MySQL 实现一个 key-value(string:json) 读写库
在Python中,我们可以使用`pymysql`库(如果MySQL服务器版本较高,也推荐使用`mysql-connector-python`)来建立一个简单的key-value存储库,其中键是字符串,值是JSON格式的数据。这里我们创建一个基本的类来完成读写操作: import pymysql.cursors import jsonclass JsonKVS…...

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

【C++】—— 类与对象(五)
【C】—— 类与对象(五) 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之间传文件,最简单的是共享目录,如果不能使用共享目录,可以使用scp命令, 一般Windows和Linux都支持。 scp命令是secure copy的缩写,用于在Linux下进行远程文件拷贝,windows一般也有该命令…...
定位和解决线上接口性能优化或者数据库性能优化的思路是什么?
定位和解决线上接口性能优化或数据库性能优化问题是一项复杂且系统性的工作,需要综合运用监控、分析、调优等手段。以下是一个详细的思路,帮助您从定位问题到解决问题,确保系统的高效运行。 一、定位接口性能问题 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. 清理旧的…...

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

图解Kafka | 彻底弄明白 Kafka 两个最重要的配置
我已经使用 Kafka 近两年了,我发现有两个配置很重要,但是不太容易理解。这两个配置分别是acks和min.insync.replicas。 本文将通过一些插图来帮助理解这2个配置,以便更好的使用Kafka为我们服务。 复制 我假设你已经熟悉 Kafka了 ÿ…...
创建线程的三种方式
创建线程的三种方式 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 发布公告
作者:郭伟杰(阿里云), 范瑞(Shopee) Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.20.0。与往常一样,这是一个充实的版本,包含了广泛的改进和新功能。总共有 142 人为此版本做出了贡献,…...

HarmonyOS应用一之登录页面案例
目录: 1、代码示例2、代码分析3、注解分析 1、代码示例 实现效果: /** 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 这一强大的工具,快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库…...

手把手教你安装音乐制作软件FL Studio 24.1.1.4285中文破解版
在当今数字化时代,音乐创作不再局限于传统的乐器和录音室,而是借助先进的音乐制作软件,如FL Studio,实现了前所未有的便捷与高效。FL Studio,以其强大的功能、直观的界面和丰富的插件资源,成为了众多音乐制…...
SDL 与 OpenGL 的关系
OpenGL 和 SDL 是两个不同的库,但它们可以配合使用来创建图形应用程序。 SDL(Simple DirectMedia Layer) SDL 是一个跨平台的多媒体库,用于处理图形、声音、输入和其他游戏开发所需的功能。它简化了窗口创建、事件处理和图形上下…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...