Git 介绍、分布式版本管理软件介绍

news2025/1/11 21:42:44

文章目录

  • 一. 分布式文件版本管理系统
  • 二、Git 介绍
    • 2.1. Git 的最基本使用
    • 2.2. 工作中使用版本管理工具的经验
    • 2.3. Git 的存储方式简介

一. 分布式文件版本管理系统


在分布式文件版本管理系统到来之前,市面上的文件版本管理软件都是集中式的(svn 就是典型的集中式文件版本管理系统),其软件会分为客户端软件和服务端软件两个部分,服务端软件主要功能是管理,比如对我们提交的文件的版本、分支等信息进行集中保存和管理,客户端软件主要功能是操作,比如从服务端中拉取文件、提交修改后的文件到服务端等,如下图:

集中式管理

集中式的管理有个致命的缺点,文件版本信息都在服务器端保存管理,一旦服务器坏了,这些管理信息就丢失了,丢失了会有什么影响呢,简单的一个例子,线上代码出问题了,需要回滚到之前的版本,那这个需求就无法实现

基于上述缺点,分布式文件版本管理系统出现了,其软件不再有客户端和服务端之分,不再是客户端操作后,请求服务端对操作进行记录、对版本进行管理的模式了,而是对文件操作后,直接在本地进行版本的管理和操作的记录,最后再将修改的文件和版本管理信息一并推送到远端。从远端拉取时也不仅仅是拉取文件,还会拉取完整的版本信息

这里需要注意的是,分布式模式中本地和远端的关系,不同于集中式中客户端和服务端的关系,集中式模式中客户端和服务端的功能是不一样的,而分布式模式中本地和远端的功能是相同的,远端只是另一台安装了分布式版本管理软件的机器(甚至可以是相同机器的不同路径),可以理解为本地和远端只是相对的叫法,每一个本地都可以成为另一个本地的远端

分布式

上图就是一个分布式系统的基础模型,图中也体现出了任何一个本地都可以是另一个本地的远端的结论,站在机器B的角度来说,机器B就是本地,机器A就是远端,站在机器C的角度来说机器C就是本地,机器B就是远端。

在这种分布式模式下,当机器A坏了,并不会影响机器B,因为从机器A拉取时,机器B已经包含了完整的版本信息,假设线上代码出现问题并且机器A坏了,这时机器B可以直接根据本地版本信息进行回滚,并将新的版本信息记录到本地,然后将回滚后的代码发布即可解决问题,最后等机器A恢复时,再将本地的版本信息推送给机器A保持本地和远端信息同步

二、Git 介绍


Git 是一个经典的分布式文件版本管理系统,后面的篇幅,将对 Git 作一个简单的介绍,Git 官网

2.1. Git 的最基本使用


在开始使用 Git 前,我们首先要知道 Git 的分区结构,因为 Git 的基本操作,都是围绕着分区来进行的,前面已经介绍过在分布式模式中,本地和远端的功能与结构是一样的,接下来就站在本地的角度介绍 Git 中的三大分区,如下图:

Git分区

  • 工作区:编写文件的地方,编写后需要通过 git add 命令添加到暂存区
  • 暂存区:将编写后的文件暂存的地方,这里的文件可以通过 git commit 命令提交到仓库中
  • 本地仓库(仓库):包含文件和文件版本等信息,可以通过 git push 命令将文件和信息推送到远端

对 Git 的分区有个大概了解后,就可以开始演示最基本的 Git 操作流程了

1. 新建 Git 仓库

(1)在想要创建 Git 仓库的地方,打开 git 命令行工具:

打开命令行工具

(2)如果是首次使用 Git,我们需要设置一下 Git 的用户名和邮箱,这个用户名和邮箱的作用就是别人查看提交历史时,可以知道是谁提交的,联系方式是什么,没有别的意义。直接在 Git 命令行窗口输入如下命令:

git config --global user.name "用户名"
git config --global user.email "邮箱地址"

(3)前置准备做好了, 可以开始创建 Git 仓库了,利用下面命令:

git init 仓库名

创建成功后,就会在打开 Git 命令行的目录多出一个新建的目录,这个目录就是 Git 仓库,其内部结构如下:

git目录结构

2. 在工作区添加文件

有了 Git 仓库后,我们就可以在仓库的工作区创建文件了,添加一个文件,如下图:

创建文件

文件创建后,我们通过 git status 命令,来查看一下 Git 仓库状态:

未追踪的文件

此时,Git 仓库的状态提示是 Untracked files ,意思是,工作区中有文件还未被添加到暂存区

3. 将工作区的文件添加到暂存区

当 Git 仓库的状态提示是 Untracked files 时,我们需要将工作区的文件添加到暂存区,命令如下:

git add 文件名

添加到暂存区的命令执行后,再次通过 git status 命令,来查看一下 Git 仓库状态:

未提交的文件

此时,Git 仓库的状态提示是 Changes to be committed ,意思是,暂存区中有文件还未被提交到仓库

4. 将暂存区的文件提交到仓库

当 Git 仓库的状态提示是 Changes to be committed 时,需要将暂存区的文件提交到仓库,命令如下:

git commit -m '注释' 文件名

提交到仓库的命令执行后,再次通过 git status 命令,来查看一下 Git 仓库状态:

全部提交

此时,Git 仓库的状态提示是 nothing to commit, working tree clean ,代表所有文件已全部提交到仓库

至此,一个本地仓库的最基本操作流程就已经演示完成了,至于其他更多操作,分支、回滚、远端推送、克隆等命令,在其他文章中均有记录

2.2. 工作中使用版本管理工具的经验


先说说是不是一定要用分布式

其实通过上面演示可以感觉出来 Git 的操作与集中式的 Svn 相比是比较繁琐的,所以工作中,不一定就非得要选择 Git 作为版本管理工具,要根据实际需求来决定

如果使用版本管理工具的目的只是为了将文件共享给其他人,而不太在意分支、版本等功能,其实选择 Svn 是可以的,我分享一下我在工作中对版本管理工具的选择经验

  • 集中式(svn):我会用其管理项目进度表、需求说明书等文档类的东西,因为这类东西只是为了共享给组员看,对版本信息、分支信息等功能没有什么需求,还有重要的一点,一般这类都是 Office 文件,属于二进制文件,而 Git 不适合管理二进制文件
  • 分布式(git):我会用其来管理代码,因为代码经常设计到分支、版本等功能,所以必须保证其容灾性,如果选择集中式软件,那么服务器宕了,会有很大影响,还有一点就是代码都是纯文本文件,Git 适合管理纯文本文件

使用 Git 最好搭配图形化工具

完全通过代码命令来使用 Git,不仅效率低,而且巨难受,所以推荐搭配图形化工具来操作 Git,图形化工具我感觉还可以分为两类,一类适合用作本地,一类适合用作远端

  • 适合用作本地的:SmartGit、Sourcetree、TortoiseGit 等
  • 使用用作远端的:GitHub、GitLab、Gogs 等

(1)先说说这两类工具的区别:

SmartGit 等工具只是单纯的操作 Git 仓库,仓库的存放目录是我们自己决定的

GitLab 等工具是用来集中管理所有 Git 仓库的,通过 GitLab 创建的 Git 仓库的存放目录是由 GitLab 内部来管理的,我们无法控制,最终 GitLab 会生成一个用于克隆的地址

(2)再说一下实际工作中怎么搭配使用这两类工具:

实际项目中,负责人会在服务器上用 GitLab 创建 Git 仓库,然后组员将仓库克隆到本地后,再通过 SmartGit 操作

这里有必要说一下,身边很多人认为,只有通过 GitLab 等工具创建出来的仓库才能当作远端,其实不是这样的,这些工具只是辅助工具,就算什么工具也不用,单纯的通过 Git 命令创建一个仓库,这个仓库仍可以成为远端。之所以会被迷惑,是因为 GitLab 等工具创建 Git 仓库后,会返回一个仓库的克隆路径。而使用命令创建的仓库,他们不知道仓库的克隆路径是什么,所以就感觉通过命令创建的仓库不能当作远端。我这就列举下通过命令创建的 Git 仓库当作远端时的克隆路径:

# 前面提到过,Git 仓库当作远端有两种场景,第一种是跨路径,第二种是跨机器

# 第一种的克隆路径:
git clone 远端仓库在本机中的路径
# 第二种的克隆路径:
git clone ssh://远端仓库所在机器的登录名@远端仓库所在机器的IP/远端仓库在所在机器中的存放路径

2.3. Git 的存储方式简介


网上有很多对内部存储结构进行超详细解析的,感兴趣可以自行搜索,本文只是大概作一个介绍

本文通过下图的项目目录结构,介绍 Git 的内部存储结构:

在这里插入图片描述

使用 git commit 提交后,Git 会生成 commit、tree、blob 三个对象

  • blob:存储原文件的内容
  • tree:一个树形结构,这个树形其实就是和我们项目目录相对应,内部保存 blob 地址或下一层 tree 的地址
  • commit:内部保存项目根目录的 tree 地址

上文提交后,Git 生成的三个对象的结构如下图:

git内部存储结构

有了这个结构,当需要回滚时,只需找到目标 commit 地址,就可以回滚整个项目历史版本

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

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

相关文章

演讲实录:DataFun 垂直开发者社区基于指标平台自主洞察北极星指标

在7月14日举办的 Kyligence 用户大会的数智新应用论坛上,DataFun COO 杜颖女士为大家带来了《垂直开发者社区基于指标平台自主洞察北极星指标》的主题演讲。接下来,我们一起看看 DataFun 如何在没有专门的 IT 团队的情况下,实现对北极星指标的…

开源框架中的责任链模式实践

作者:vivo 互联网服务器团队-Wang Zhi 责任链模式作为常用的设计模式而被大家熟知和使用。本文介绍责任链的常见实现方式,并结合开源框架如Dubbo、Sentinel等进行延伸探讨。 一、责任链介绍 在GoF 的《设计模式》一书中对责任链模定义的:将…

基于TensorFlow+CNN+协同过滤算法的智能电影推荐系统——深度学习算法应用(含微信小程序、ipynb工程源码)+MovieLens数据集(七)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 模型训练1)数据集分析2)数据预处理3)模型创建4)模型训练5)获取特征矩阵 2. 后端Django3. 前端微信小程序1)小程序全局配置文件2&#xff09…

时序预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-LSTM鹈鹕算法优化卷积长短…

C语言每日一题(1):实现库函数strlen()

文章主题:库函数strlen()的实现所属专栏:C语言每日一题作者简介:每天不定时更新C语言的小白一枚,记录分享自己每日的所思所想。个人主页:[₽]的个人主页 目录 前言 函数介绍 编程起因 设计思路 1.整体逻辑 2.参…

Postman 的使用教程(详细)

Postman 使用教程 1. 是什么 Postman 是一个接口测试工具软件,可以帮助开发人员管理测试接口。 官网:https://www.getpostman.com/ 2. 安装 建议通过官网下载安装,不要去那些乱七八糟的下载平台,或者留言获取 官网下载地址&am…

【unity】关于技能释放shader.CreateGPUProgram造成卡顿,优化和定位方法。

关于优化方法,UWA这边有介绍 Unity移动端游戏性能优化简谱之 CPU耗时调优|单帧|动画|调用|unity|实例化_网易订阅 对此,我们可以将Shader通过ShaderVariantCollection收集要用到的变体并进行AssetBundle打包。在将该ShaderVariantCollection资源加载进内…

30.CSS文本悬停过渡效果

效果 源码 index.html <!doctype html> <html> <head><meta charset="utf-8"><title>CSS Focus Text Hover Effects</title><link rel="stylesheet" href="style.css"> </head> <body>…

自动化发布npm包小记

1.注册npm账号 打开npm官网&#xff0c;并注册自己的npm账号 2.申请AccessToken 1.登录npm官网&#xff0c;登录成功后&#xff0c;点开右上角头像&#xff0c;并点击Access Tokens选项 2.点开Generate New Token下拉框&#xff0c;点击Classic Token(和Granular Access To…

ChatGPT WPS AI 一键制作各类汇报型PPT演示文档

在WPS AI中生成一个PPT文档。 操作步骤如下 :

Vue中使用VueAMap

npm 安装 npm install vue-amap --save注册:高德地图 // 在main.js中注册:高德地图 import VueAMap from "vue-amap"; Vue.use(VueAMap); VueAMap.initAMapApiLoader({key: "你的高德key",plugin: ["AMap.AutoComplete", //输入提示插件"A…

Android12之Codec2.0配置编解码器为H264实现(四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

NSS [NISACTF 2022]middlerce

NSS [NISACTF 2022]middlerce 开题&#xff0c;直接给了源码。 由语句$command json_decode($txw4ever,true)[cmd];可得&#xff0c;$txw4ever一定是json格式的数据&#xff0c;但是&#xff0c;preg_match()函数却过滤了{&#xff0c;同时.*贪婪匹配后又匹配括号里的字符&am…

讯飞星火认知大模型Java后端接口

文章目录 1.免费申请星火大模型套餐2.Java后端接口说明2.1 项目地址2.2 项目说明2.3 项目结构2.4 项目代码&#x1f340; maven 依赖&#x1f340; application.yml 配置文件&#x1f340; config 包&#x1f4cc; XfXhConfig &#x1f340; dto 包&#x1f4cc; MsgDTO&#x…

【漏洞复现】五、seacms 远程命令执行(CNVD-2020-22721)

五、seacms 远程命令执行 &#xff08;CNVD-2020-22721&#xff09; 5.1、漏洞原理 在w1aqhp/admin_ip.php下第五行使用set参数&#xff0c;对用户输入没有进行任何处理&#xff0c;直接写入文件。攻击者可利用该漏洞执行恶意代码&#xff0c;获取服务器权限 5.2、影响版本 …

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言 百度APP包体积经过一期优化&#xff0c;如无用资源清理&#xff0c;无用类下线&#xff0c;Xcode编译相关优化&#xff0c;体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP&#xff0c;业务迭代非常多…

PlotNeuralNet resnet34和resnet18绘图

文章目录 resnet18resnet34 PlotNeuralNet网络 可以发现&#xff0c;resnet34和resnet18只有块的数量不一样&#xff0c;经过简单的修改即可得到 resnet18 \documentclass[border12pt, multi, tikz]{standalone} \usepackage[fontsize14pt]{fontsize} \usepackage{import} \su…

Spark 【分区与并行度】

RDD 并行度和分区 SparkConf setMaster("local[*]") 我们在创建 SparkContext 对象时通常会指定 SparkConf 参数&#xff0c;它包含了我们运行时的配置信息。如果我们的 setMaster 中的参数是 "local[*]" 时&#xff0c;通常代表使用的CPU核数为当前环境…

DevOps与CI/CD常见面试问题汇总

01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗&#xff1f; 答&#xff1a;尽管DevOps与敏捷方法&#xff08;这是最流行的SDLC[Software Development Life Cycle]方法之一&#xff09;有一些相似之处&#xff0c;但两者在软件开发方面都是根本不同的方法。以下是两者之…