GIT命令只会抄却不理解?看完原理才能事半功倍!

news2024/11/16 18:32:52

系列文章目录

手把手教你安装Git,萌新迈向专业的必备一步


在这里插入图片描述
上一次,我们简单介绍了为什么要用版本管理,以及怎么安装Git以及基本认识,为新手朋友们迈出了实操的第一步。而本期的内容其实笔者犹豫了很久,到底是先讲GIT的模型和原理,还是直接讲GIT常用命令? 最终笔者决定还是先从模型与原理下手,不仅是它是命令的前提,而且笔者发现虽然很多用GIT,但只限于几个常用命令,对其运行机制却知之甚少,一旦出现问题,就容易束手无策了,难以处理,所以本期我们还是先讲讲GIT的基础原理吧

📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 GIT 专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待


一、Git 的特征

1. 文件系统

我们都知道Git是个版本控制系统,但是如果你深入了解其原理,就不难发现它更像一个文件管理系统,如果你使用过其他版本控制器,不难发现它们的思路非常符合“版本控制”的逻辑,它们记录的是一个初始文件,以及后续对该文件的历次修改内容,如下:
在这里插入图片描述

而对于GIT,则是把你每次的“提交”当作一次相机的“快门”,GIT会为你把当时的全部文件内容都做一个快照,然后进行存储,这一系列的快照,每一个快照展开都是完整的文件系统。 当然,为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件

在这里插入图片描述

2. 分布式

我们可以把上次的图继续拿来使用,GIT的核心工作都是在本地完成的,即其主要工作都聚焦在工作区到本地仓库,这意味着,即使我们离线了,我们仍然能完成提交操作,GIT仍然能忠实的记录下我们的操作记录,而不像其他版本控制器,断网后版本控制功能就失效了。
在这里插入图片描述


二、GIT的术语

在接触GIT的时候,我们难免会接触到一些术语或概念,我们先对术语做个解释,如果你看了某些解释,觉得一头雾水,先别着急,我们在下面会慢慢解释

1. 区域术语

GIT一共分为四个区域,对于开发者来说,由远到近依次为:远程仓库本地仓库暂存区工作区

  • 远程仓库:可以是GitHub、GitLab,也可以是你自己的私有服务器,包含项目所有的版本控制信息和文件历史记录。

  • 本地仓库:你电脑上的存储库,它包含项目所有的版本控制信息和文件历史记录

  • 暂存区:也称为索引(Index),用于存储下一次提交时要包含哪些修改或变更。

  • 工作区:指项目的实际文件夹,即我们日常编辑的文件夹。

我们之前讲了三个部分,唯独没有讲暂存区。实际上,我们的代码不能直接从工作区就到仓库去,本地仓库只接收暂存区提供的内容,所以我们的任何新增、修改实际上都要先加入到暂存区
在这里插入图片描述

但是为什么这块暂存区存在感不强呢?主要是因为我们现在的各种工具在自动维护,比如我们添加文件时,IDEA会自动弹窗,当我们使用Tortoisegit时,提交时会让我们勾选文件,这些都让我们免于手动往暂存区进行手动添加,自然其存在感就稍弱了

在这里插入图片描述

2. 名词术语

1. 提交对象

我们每次把暂存区的内容放入本地仓库,称为一次提交,产生一个提交对象(也叫“提交点” 或 “提交”)。

除了手动提交,合并操作也会产生提交点,提交点包含了前一个提交点位置、文件变更信息、变更人、变更时间等所有信息,每个提交点都有自己的SHA-1哈希值作为唯一标志,一般在图中,用一个圈表示。因为提交点(除了首次提交)都会包含上一个提交点的地址,所以在实例图里一般呈链表状,如下图,就展示了三个提交点。

在这里插入图片描述

2. 分支

定义: 一个指向某个提交对象的指针,表示一个代码的分支。可以有多个分支,并行开发不同的功能或版本

对于分支这个概念,在讲解之前,如果你看过其他的教程,可能会经常看到类似下面的图

在这里插入图片描述
这样的话,你会认为这里有两个分支,一个是由C D E构成,一个是F G构成。的确,这里是有两个分支不假,但这张图更具体的样子应该是这样子

在这里插入图片描述
分支并不是树枝,图中真正的分支,其实只是两个指针,如图,分支iss94指向提交点G,分支master指向提交点E,理解了这个概念,你才能明白为什么Git鼓励大家,遇事不决就建立各种分支。在其他版本控制器中,拉个分支可能意味着所有的代码都要复制一遍,而在GIT中,仅仅是建立一个指针。

聪明的你可能想到了一个问题,建分支 = 建指针,那岂不是当我建分支的时候,会产生两个指针,指着同一个节点?,此时,如果我再次提交内容,岂不是乱了套?这个节点会算在哪个分支上?这时候就要用到另一个概念 HEAD

3. HEAD

定义HEAD是一个特殊的指针,它指向当前所在的分支提交。一般情况下,HEAD指向当前所在分支的最新提交。

没错,HEAD也是个指针,而且指向分支,如果你没有忘记分支也是个指针的话,那你应该能想象出下面的图例
在这里插入图片描述
这代表着HEAD指向了master分支,我们把前面分支的知识结合起来,现在如果我们想建立个名叫 iss95 的分支,图就会变成这样子
在这里插入图片描述
如果此时我们再进行一次提交,会变成什么样呢?
在这里插入图片描述
所以,你应该明白HEAD的作用了,它代表着你下次提交的位置,此处它指向master,所以我们的提交是提交至分支master上的。提交后,master指针自动移到C的位置。而iss95则没有任何变化,还是指向B。

严谨的小伙伴可能注意到我们定义中说了一句 一般情况下,HEAD指向当前所在分支的最新提交。那HEAD能指向历史提交吗?

答案是肯定的,我们可以使用 git checkout <commit> 命令将HEAD移动到某个历史提交点,如下图:
在这里插入图片描述

4. 标签(TAG)

定义:在 Git 中,Tag是一种重要的版本控制工具,它们是一些永久性的指针,指向某个特定的提交(commit),常用于代码发布、版本管理以及历史记录的标记等操作
.
简而言之,标签也是一个指针,只是这个指针不像分支HEAD 一样,它是不会移动的,我们可以看到JDK源码中就有大量的标签,用以标记节点
在这里插入图片描述

3. 动作术语

  • 添加 (Add): 将工作目录的文件加入暂存区,可以只选择部分文件进行添加

  • 提交(Commit):将暂存区的内容放入本地仓库,每个提交都有唯一的ID。

  • 合并(Merge):将两个或多个分支的修改合并到一起。

  • 拉取(Pull):将远程仓库的修改拉取到本地仓库,并更新工作区。

  • 推送(Push):将本地仓库的修改推送到远程仓库。

  • 检出(Checkout):切换某个分支,并同时切换工作目录。

如果前面你都学会了,相信这几个动作,你应该能理解,它们之前能汇聚成下面这张关系图
在这里插入图片描述

当然,这些命令实际上并不仅仅这么简单,比如 Checkout 不仅可以切换分支,还可以跟文件名,以 git checkout <file-name> 来还原文件。但是这些,我们留到下一篇文章再讲解。


三、Git 存储模型

1. GIT 数据库

前面我们三番五次的把 GIT 说成更像文件系统,这是很合理的。甚至可以说GIT是一个数据库,其实它的核心确实就是一个键值对数据库你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容

$ echo ‘test content’ | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4

如上,我们把标准输入内容 “test content” 存储进GIT,它就会返回给我们一个40字符的 SHA-1 哈希值,我们可以用这个值,重新获取存进去的内容

$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content

但注意,使用这种方式存入文件,返回的只有文件内容,等于说文件名我们丢失了,而文件名的遗失对于文件系统来说,是非常不合理的。所以我们还需要树

2. 树对象

比方说我们有一个简单的目录,目录下有两个文件,README 以及 Rakefile,并且还有个子目录lib,lib里有个文件simplegit.rb。那么当我们把这个目录及其所有文件纳入GIT管理时,其形态是这样的
在这里插入图片描述
它会把我们的文件存储成blob对象,目录变成tree对象。tree对象可以存文件信息,blob对象存文件内容,而且tree对象还能下辖另一个tree对象,这就和我们目录下还有子目录是一样的。如此一来,我们就可以把我们想存放的目录及其文件,以一棵树的形式完整的存入GIT中了。存是存进去了,但这仅仅是一次保存,存进去最多说GIT保存了我这个目录,那么它的版本控制又体现在哪呢?

3. 提交对象

我们上面说了整个目录能变成一个 Tree 对象存入GIT,它是什么时候情况下会存呢?其实就是GIT执行提交命令的时候,当我们提交时,GIT会把我们整个工作目录的所有文件汇聚成一个Tree,并且把这个Tree的引用放进一个提交对象中进行存储
在这里插入图片描述
也就是说,如上图,每一个圈(提交对象)不仅有本次提交人、提交时间等信息、而且还指向着一个Tree,所以提交对象实际上就是一个快照
在这里插入图片描述

如上图,三次提交实际上构成了一个不断往上摞的切面,为啥说是切面,是因为每一个切面都包含着一棵树,也就是当时整个目录的内容。因此信息量其实是很多的。当然,提交对象、和树对象或者文件对象一样,都会存进GIT,GIT也会返回一个40长度的 SHA-1 哈希值。

这样当我们查询提交历史时,查询到的就是所有过往的提交对象的信息,如果我们确定某个提交对象后,我们就能通过该提交对象的 SHA-1 哈希值能找回当时所有的文件

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

PS:Tree对象不是压缩包,它只是存储着当时那些文件对象的引用。另外,提交时形成的Tree并不是把所有的文件全部又做一遍保存,然后把引用放进Tree,而是只保存改动或新增的文件,那些没有改动过的文件已经存过了,不会再存,所以不用过分担心空间问题。


总结

本次我们比较形象的讲解了GIT的运行机制及存储模型,如果你意犹未尽,或对GIT想了解更多,也可以去官方的文档做更深入的了解,我把它的地址放在这里 官方中文文档 而对于大部分读者,本文中所说的内容已经足够支持我们后面的学习,那么下次我们就可以正式开始学习GIT的命令以及各种应用了。

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

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

相关文章

Unity UI与粒子 层级问题Camera depth Sorting Layer Order in Layer RenderQueue

Unity游戏开发中&#xff0c;模型、界面、特效等&#xff0c;需要规划好layer的概念&#xff0c;涉及到摄像机&#xff08;Camera&#xff09;、画布&#xff08;Canvas&#xff09;、Shader等相关内容。 在 Unity 中&#xff0c;渲染顺序是由多个因素共同决定的&#xff0c;大…

java八股文面试[多线程]——线程间通信方式

多个线程在并发执行的时候&#xff0c;他们在CPU中是随机切换执行的&#xff0c;这个时候我们想多个线程一起来完成一件任务&#xff0c;这个时候我们就需要线程之间的通信了&#xff0c;多个线程一起来完成一个任务&#xff0c;线程通信一般有4种方式&#xff1a; 通过 volat…

详解IP协议

在介绍IP协议之前&#xff0c;先抛出一个概念&#xff1a;IP地址的作用——定位主机&#xff0c;具有将数据从主机A跨网络传输到主机B的能力&#xff0c;有了TCP提供的策略&#xff0c;例如滑动窗口、拥塞控制等&#xff0c;IP去执行它&#xff0c;所以我们通常叫TCP/IP协议&am…

阿里云centos9stream安装宝塔+vscode(code-server)集成云端开发环境

一、 安装宝塔面板 官网 https://www.bt.cn/new/download.htm 题外话&#xff1a;虽然感觉现在宝塔没以前好用了&#xff0c;而且有centos7、8 mysql编译导致OOM服务器挂掉无法ssh登录的情况&#xff0c;但他还是远程管理服务器的好选择&#xff0c;提示宝塔只支持最新的centos…

基于广义正态分布算法优化的BP神经网络(预测应用) - 附代码

基于广义正态分布算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于广义正态分布算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.广义正态分布优化BP神经网络2.1 BP神经网络参数设置2.2 广义正态分布算法应用 4.测试结…

[管理与领导-60]:IT基层管理者 - 扩展技能 - 3 - 通过面试招到合适的人选

目录 前言&#xff1a; 一、招聘 1.1 什么是招聘 1.2 招聘 VS 招募 1.3 甄选 1.4 招聘中的重要原则 1.5 招聘的本质 1.6 人才匹配的维度 1.7 人员招聘中的误区 二、面试 2.1 何为面试 2.2 为什么面试 2.3 面试的注意事项 2.4 面试的误区 2.5 如何进行面试 前言…

Vulnstack----5、ATTCK红队评估实战靶场五

文章目录 一 环境搭建二 外网渗透三 内网信息收集3.1 本机信息收集3.2 域内信息收集 四 横向移动4.1 路由转发和代理通道4.2 抓取域用户密码4.3 使用Psexec登录域控4.4 3389远程登录 五、痕迹清理 一 环境搭建 1、项目地址 http://vulnstack.qiyuanxuetang.net/vuln/detail/7/ …

交互设计都有哪些准则?

UI交互设计的本质不是完全基于用户的需求&#xff0c;而是交互设计师需要学习根据用户描述的产品形式来了解用户需要什么。 在交互设计过程中&#xff0c;遵循科学交互设计的本质是整个交互设计过程的重要组成部分&#xff0c;这与产品使用过程中给用户带来的体验密切相关。本…

matlab函数 状态空间系统ss、能控性矩阵ctrb、矩阵的秩rank、能控标准型canon、零极点配置place、系统极点pole等函数(线性定常系统)

matlab函数 能控性矩阵ctrb、能控标准型canon、零极点配置place 第一章&#xff0c;线性定常系统 ss 如果已知线性定常系统的ABCD四个矩阵&#xff0c;可以得到状态空间系统 其他更具体的用法请直接看帮助文档。 用法&#xff1a;ss(A,B,C,D) 假如 可以输入 A [-1.5,-2…

Java连接websocket优雅断线、重连功能

为了实现优雅重连和重试&#xff0c;您需要在代码中添加一些逻辑来处理连接失败或断开连接的情况。 实现代码如下&#xff1a; import javax.websocket.*; import java.io.IOException;ClientEndpoint public class WebSocketClientEndpoint {private Session userSession n…

【区块链 | IPFS】浅谈 | IPFS数据存储原理

IPFS在数据存储方面采用的是分散式的文件存储,区别于HTTP协议的位置寻址,IPFS是基于内容寻址,当文件上传到IPFS节点存储时,节点会对文件进行Merkle DAG(默克尔有向无环图)的格式组织分块存储,在存储完毕后,文件将以Merkle DAG的根哈希数来表示该文件,用户可以从IPFS构…

【JAVA基础——JAVA虚拟机JVM】

JVM 文章目录 JVM一.JVM结构1.1.JVM包含两个子系统和两个组件1.2.运行时数据区1.2.1.简介1.2.2.程序计数器1.2.3.虚拟机栈1.2.4.堆1.2.5.本地方法栈1.2.6.方法区(永久代实现)java8-1.2.7.元空间(Metaspace)1.2.8.JVM字节码执行引擎1.2.9.直接内存(Direct Memory)1.2.10.垃圾收集…

three.js(三):three.js的渲染结构

three.js 的渲染结构 概述 three.js 封装了场景、灯光、阴影、材质、纹理和三维算法&#xff0c;不必在直接用WebGL 开发项目&#xff0c;但有的时候会间接用到WebGL&#xff0c;比如自定义着色器。three.js 在渲染三维场景时&#xff0c;需要创建很多对象&#xff0c;并将它…

C语言柔性数组详解:让你的程序更灵活

柔性数组 一、前言二、柔性数组的用法三、柔性数组的内存分布四、柔性数组的优势五、总结 一、前言 仔细观察下面的代码&#xff0c;有没有看出哪里不对劲&#xff1f; struct S {int i;double d;char c;int arr[]; };还有另外一种写法&#xff1a; struct S {int i;double …

Sublime Text汉化,主打简单明了

在Sublime中设置中文的步骤如下&#xff1a; 1.打开Sublime Text&#xff0c;使用快捷键ShiftCtrlP&#xff08;MacOS下cmdShiftP&#xff09;&#xff0c;弹出查找栏。 2.在搜索框中输入关键字"install"&#xff0c;出现下拉选项&#xff0c;点击选择其中的"P…

Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移

首先思考一个问题&#xff1a;如果 Dubbo 应用使用 ZooKeeper 作为注册中心&#xff0c;现在需要切换到新的 ZooKeeper 实例&#xff0c;如何做到流量无损&#xff1f; 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用&#xff0c;一个是服务提供者&…

北京收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中建博后许少辉八一新书

北京收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中建博后许少辉八一新书

【业务功能篇92】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue

三、CompletableFutrue 一个商品详情页 展示SKU的基本信息 0.5s展示SKU的图片信息 0.6s展示SKU的销售信息 1sspu的销售属性 1s展示规格参数 1.5sspu详情信息 1s 1.ComplatableFuture介绍 Future是Java 5添加的类&#xff0c;用来描述一个异步计算的结果。你可以使用 isDone方…

WPF工控机textbox获得焦点自动打开软键盘

1.通过nuget安装 osklib.wpf 2.在textbox getFoucs中敲入如下代码即可实现获得焦点弹出软键盘 private void txtPLC_IP_GotFocus(object sender, RoutedEventArgs e){try{// Osklib.OnScreenKeyboard.Close();Osklib.OnScreenKeyboard.Show();}catch (Exception ex){MessageB…

烟草企业物流管理信息系统的分析与设计(论文+源码)_kaic

摘要 在经济高速发展的今天&#xff0c;物流业已经成为支撑国民经济的基础性产业。作为一种新型服务业&#xff0c;物流业集仓储、运输、信息等为一体&#xff0c;发展成为复合型战略性产业。S烟草企业设计的物流管理信息系统利用B/S模式的三层结构&#xff0c;基于JSP技术和J…