Git 时光穿梭

news2024/12/28 19:20:13

文章目录

    • 一、问题引入
    • 二、前置知识
    • 三、工作区暂存区和版本库
    • 四、版本回退
      • 1、版本回退命令
      • 2、四大常见场景
      • 3、删除文件
    • 总结

一、问题引入

假设这样一个场景:有一天你的老板让你整理一份报告,结果你很轻松的整理完了第一版,但是你的老板并不满意,于是老板给你不断的提出建议,你不断的修改,于是报告就迭代出了版本1、版本2、版本3……但是老板拿到最新版本的报告之后,摇了摇头说:“我还是觉得版本1比较好,你把版本1拿给我吧”。这个时候你可能想“杀”他的心都有了,因为你是在一个报告中迭代的,版本1你早就不知道长什么样了。

这次经历之后,你留了一个心眼,每次你在进行修改的时候,都创建一个副本,结果就是一份报告分散出好多的文件,可是如果过了一周,看着这些乱起八糟的文件,你想找到修改的内容,但是已经记不清保存在哪个文件中了,只好一个一个文件去找,非常麻烦。并且如果你想保留最新的文件,然后把其他文件删掉,但是你又不敢删,怕哪天还会用到,真郁闷。

针对以上问题,难道就没有一种完美的解决方案的吗?于是 Git 等版本控制系统横空出世。其中 Git 版本回退可以说是 Git 的杀手锏之一,注意是之一,后面还有之二、之三……这个我们之后在介绍。

二、前置知识

为了更好的理解 Git ,在讲 Git 之前,我们先引入一些前置知识:

  1. git add 将文件提交到暂存区。
  2. git commit 将文件提交到本地仓库。
  3. git status 可以让我们随时掌握工作区的状态(哪些文件被修改过)。
  4. git diff 顾名思义就是查看difference,可以查看修改内容,显示的格式是Unix通用的diff格式。
  5. git log 命令显示从最近到最远的提交日志(加上--pretty=oneline会更加可观)。

上面这些命令不作为本期重点,大家可以自行了解。

三、工作区暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stageindex。一般存放在 “.git” 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这张图就展示了

其实细心的小伙伴就发现了,除了工作区,暂存区,版本库,还有两个就是 objectmaster

  • 在Git中,所有的数据都以对象(objects)的形式存储(文件内容,提交信息,分支引用等等)。objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

Git 跟踪并管理的是修改(新增、删除、更改、新建)

四、版本回退

1、版本回退命令

git reset 命令在 Git 中被用来移动 HEAD 指针和重置当前分支的位置。它有几种不同的用法,主要包括以下三种模式:soft、mixed 和 hard。

1. Soft 模式git reset --soft <commit_id>:该命令将 HEAD 指向 <commit_id>,但不会更改暂存区和工作目录的内容。你可以重新提交更改,新的提交将建立在指定的 <commit_id> 之上。

2. Mixed 模式git reset --mixed <commit_id>(默认行为):该命令将 HEAD 指向 <commit_id>,并重置暂存区的内容为指定 <commit_id> 的内容,但不会更改工作目录的内容。这样你可以重新选择要提交的内容。

3. Hard 模式git reset --hard <commit_id>:该命令将 HEAD 指向 <commit_id>,同时重置暂存区和工作目录的内容为指定 <commit_id> 的内容。慎用此命令,因为会丢失工作目录中未提交的更改。

除了以上几种模式外,git reset 还可以结合使用一些选项和参数来实现不同的操作,如:

(1)git reset HEAD <file>:将指定文件从暂存区中移除,但保留在工作目录中的更改。

(2)git reset --hard HEAD:将工作目录和暂存区都重置为最近一次提交的状态,丢弃所有未提交的更改。

(3)git checkout -- [file]: 命令让⼯作区的文件回到最近⼀次 addcommit 时的状态。要注意 git checkout – [file] 命令中的-- 很重要,切记不要省略,⼀旦省略,就变成了“切换到另一个分支”的命令。

注:

  • HEAD 表示当前版本
  • HEAD^ 上⼀个版本
  • HEAD^^ 上上⼀个版本
    以此类推…

也可以使⽤ 〜数字表示:

  • HEAD~0 表示当前版本
  • HEAD~1 上⼀个版本
  • HEAD^2 上上⼀个版本
    以此类推…

2、四大常见场景

(1)场景一:使用 --hard 将工作区、暂存区、版本库进行了回退,结果后悔了怎么办

在Git中,总是有后悔药可以吃的。例如当你用 git reset --hard HEAD^ 回退到上一个版本时,再想恢复到之前的版本,就必须找到之前版本的 commit id。Git提供了一个命令 git reflog 用来记录你的每一次命令,你可以通过这个命令找到之前的版本 id,然后使用 git reset --hard <commit_id> 进行恢复。

(2)场景二:对于⼯作区的代码,还没有 add

直接使用 git checkout -- <file_name> 即可回退到最近一次工作区修改。

(3)场景三:已经 add ,但没有 commit

先使用 git reset --mixed HEAD <file_name> 回到场景二。

再使用 git checkout -- <file_name> 回退到最近一次工作区修改。

(4)场景四:已经 add ,并且也 commit 了

不要担心,我们可以 git reset --hard HEAD^ 回退到上⼀个版本!不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后⾯会讲到远程版本库,⼀旦你推送到远程版本库,你就真的惨了……

3、删除文件

再 Git 中删除也是修改,也可以被 Git 管理起来。

一般情况下,你直接在工作区中把文件给删除了,这个时候 Git 是可以知道你删除了文件的,你可以使用 git status 命令查看哪些文件被删除了。

其实在实际的工作中,删除文件的操作是比较少见的,此时一般会存在两种情况:

情况一:确实想要从版本库中删除文件

  1. 使用 git rm <file_name> 删除掉
  2. 使用 git commit 提交删除

情况二:不小心删错了,属于误删情况

  • git checkout – <file_name> 恢复即可

总结

值得注意的是,Git 的版本回退速度非常快,因为 Git 在内部有个指向当前版本的 HEAD 指针,当你回退版本的时候,Git 仅仅是把 HEAD 指针指向回退的版本即可。

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

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

相关文章

大话设计模式之享元模式

享元模式是一种结构型设计模式&#xff0c;旨在有效地支持大量细粒度的对象共享&#xff0c;从而减少内存消耗和提高性能。 在享元模式中&#xff0c;对象分为两种&#xff1a;内部状态&#xff08;Intrinsic State&#xff09;和外部状态&#xff08;Extrinsic State&#xf…

容联云QCon全球软件大会分享:大模型引领“营销服”创新实践

近日&#xff0c;QCon 全球软件开发大会正式召开。容联云大模型产品负责人唐兴才受邀出席&#xff0c;并分享营销服场景中&#xff0c;大模型的创新应用与实践。 唐兴才指出&#xff0c;在大模型浪潮的推动下&#xff0c;营销服场景正经历着前所未有的变革。面对激烈的市场竞争…

node.js-入门

定义 Node.js是一个跨平台Javascript运行环境&#xff0c;使开发者可以搭建服务器端的Javascript应用程序 作用&#xff1a;使用Node.js编写服务器端程序 1&#xff09;编写数据接口&#xff0c;提供网页资源浏览功能等 2&#xff09;前端工程化&#xff1a;集成各种开发中…

北斗卫星系统在海上测量中的创新应用

北斗卫星系统在海上测量中的创新应用 随着全球导航卫星系统技术的飞速发展&#xff0c;北斗卫星系统作为中国自主研发的全球卫星导航系统&#xff0c;在海上测量和导航领域展现出了无可比拟的优势和广阔的应用前景。 一、北斗卫星系统概述 北斗卫星系统是由中国自主研发的全球…

【Numpy】对于 Numpy 中 Axis 的理解

文章目录 前言理解轴的两个角度在维度变化方向上计算降维 示例剖析写在最后 前言 Numpy 是 Python 中一个常用科学计算库&#xff0c;常用来表示向量、矩阵以及多维度数组。在 Numpy 中多对某一个维度&#xff08;轴&#xff09;进行相应的操作&#xff0c;这一点经常出错。今…

K8S一 k8s基础知识及实战

一 K8S 概览 1.1 K8S 是什么&#xff1f; K8S官网文档&#xff1a;https://kubernetes.io/zh/docs/home/ K8S 是Kubernetes的全称&#xff0c;源于希腊语&#xff0c;意为“舵手”或“飞行员”&#xff0c;官方称其是&#xff1a;用于自动部署、扩展和管理“容器化&#xff08…

服务器数据恢复—RAID5故障导致SAP+oracle数据丢失的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列&#xff0c;其中有1块硬盘作为热备盘使用。上层划分若干lun&#xff0c;存放Oracle数据库数据。 服务器存储故障&分析&#xff1a; 该RAID5阵列中一块硬盘出现故障离线&#xff0…

进程管理命令

文章目录 一、进程管理相关命令top命令pgrep命令pstree命令进程树lsofvmstat 监控系统资源free 查看内存iostatiftop图形化管理界面总结 二、进程管理启动结束进程 三、计划任务atcrontab周期 一、进程管理相关命令 top命令 ps 命令可以一次性给出当前系统中进程状态&#xf…

HarmonyOS实战开发-如何实现一个简单的健康生活应用

功能概述 成就页面展示用户可以获取的所有勋章&#xff0c;当用户满足一定的条件时&#xff0c;将点亮本页面对应的勋章&#xff0c;没有得到的成就勋章处于熄灭状态。共有六种勋章&#xff0c;当用户连续完成任务打卡3天、7天、30天、50天、73天、99天时&#xff0c;可以获得…

百肤谜 百肤护航医学公益活动启动仪式

近日,中国整形美容协会同知名意大利医美品牌百肤谜联合开展的百肤护航问题肌肤医学公益活动正式启动。众所周知,肌肤健康是一个关乎到个人门面和内心自信的重要议题,也是医疗美容行业关注和发展的核心方向之一。这一公益活动的正式启动,不仅体现了双方对提升公众健康意识和推动…

【练习】二分查找思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 二分查找算法介绍 1.二分查找 题目描述 讲解 ​编辑 代码实现 2.…

【剪映专业版】09定格、倒放、镜像、旋转、裁剪

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 分别为定格、倒放、镜像、旋转、裁剪 定格 时间指示器移动到需要定格的地方&#xff0c;点击定格&#xff0c;自动生成一张图片&#xff0c;时长为3秒。 定格出来的画面&#xff0c;可以任意调整长短时间。 如果需要导…

LeetCode in Python 509. Fibonacci Number (斐波那契数)

斐波那契数实现方式有多种方法&#xff0c;最容易理解的为递归法&#xff0c;也可使用动态规划降低时间复杂度&#xff0c;本文给出递归法和动态规划两种方法的代码实现。 示例&#xff1a; 图1 斐波那契数输入输出示例 方法一&#xff1a;递归法 代码&#xff1a; class …

Flume 入门教程

内容目录 Flume 简介 架构和基本概念 多种架构模式 Flume 安装部署 Flume 简介 Flume 是一个分布式、可靠且高可用的数据收集、聚合和传输系统&#xff0c;主要用于高效地处理大规模日志数据。设计之初&#xff0c;它主要服务于日志管理领域&#xff0c;但其灵活性和可扩展…

什么是SD-WAN

SD-WAN是一种软件定义的广域网技术&#xff0c;通过集中控制和动态路由优化网络性能、可靠性和安全性。它简化了网络管理&#xff0c;提高了连接性和可靠性&#xff0c;适用于各种规模的企业。SD-WAN提供了多种好处&#xff0c;包括降低成本、提高性能、简化管理等。它与物联网…

【系统分析师】系统规划

文章目录 1、项目的机会选择2、可行性分析3、成本效益分析3.1 基本概念3.2 盈亏临界分析3.3 净现值分析3.4 投资回收期 截图&#xff1a;希赛讲义 视频&#xff1a;B站 系统规划对应的是 立项 阶段 1、项目的机会选择 2、可行性分析 3、成本效益分析 3.1 基本概念 例题 3.2 盈…

1.C++入门

1.关键字&#xff08;C98&#xff09; 2.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化 &#xff…

基于springboot实现电影评论网站系统设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现电影评论网站系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足&#xff0c;创建了一个计算机管理电影评论网站的方案…

component-Echarts柱状图堆叠图与折线图的实现

1.效果 2.​​​​​代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts 实例</title><!-- 引入 echarts.js --><script src"https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js&…

Linux笔记之查看docker容器目录映射

Linux笔记之查看docker容器目录映射 —— 2024-04-15 code review! docker inspect 容器ID或容器名 | grep -A 20 Mounts实践 grep -A 参数详解&#xff1a; grep 的 -A 参数用于在输出中包括匹配行后的指定数目的行。 使用 -A 参数 该参数的基本语法如下&#xff1a; …