前端工程化基础(四):Git代码版本控制工具详解

Git版本控制工具详解

认识版本控制(版本控制)

  • 是维护 工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程
  • 版本控制也是 一种软件工程技巧,借此能在软件开发的过程中,确保不同的人所编辑的同一程序都能得到同步

版本控制的功能

  • 不同版本的存储管理
    • 一个项目不断进行版本迭代,来修复之前的一些问题,增加新的功能等
    • 如果手动维护的话,效率很低
  • 重大版本的备份维护
  • 恢复之前的项目版本
  • 记录项目的点点滴滴
  • 多人开发的代码合并

集中式版本控制

CVS和SVN属于集中式版本控制系统

  • 他们的主要特点是 单一的集中管理的服务器,保存所有文件修订版本
  • 系统开发人员通过客户端 连接到这台服务器,取出最新的文件或者提交更新
  • 但是存在一个核心问题 :中央服务器不能出现故障
    • 如果宕机一个小时,在这一个小时之内,谁都无法提交更新,也就无法协同工作
    • 如果中心数据库所在的磁盘发生了损坏,且没有做备份,将会丢失所有的数据
  • 项目的历史版本都会存在于中央服务器中

分布式版本控制

  • Git是属于分布式版本控制系统

  • 客户端并不只提取最新版本的文件快照,而是把 代码仓库完整的镜像下来,包括完整的历史记录

  • 这么一来,任何一处协同工作用的 服务器发生故障事后都可以用任何一个镜像出来的本地仓库恢复

  • 因为每一次克隆操作,实际上都是一次对代码仓库的完整备份

  • 与中央服务器不同的是,项目的历史版本,都会被克隆到协作开发的本地电脑,即每台电脑上都有备份

Bash-CMD-GUI区别

  • Bash是Unix shell的一种Linux与Mac OS X都将它作为默认的shell
    • Git Bash 就是一个shell,是 windows下的命令行工具,可以执行Linux命令
    • Git Bash是基于CMD的,在CMD的基础上增加了一些新的命令与功能
  • Git CMD
    • 命令提示符(CMD)是Windows操作系统上的命令行解释程序
    • 其实就是 windows上面的CMD
  • Git GUI
    • 针对于不喜欢命令行界面的人
    • 提供了一个 图形用户界面来运行Git命令

获取Git仓库 git clone/git init

  • 当从零到一创建一个项目的时候,可以使用 git init创建一个新的仓库
    • 会生成一个.git文件

image.png

  • 运行 git add .用于告诉git 管理当前目录下的所有文件
  • 运行 git commit -m "描述"将本地文件提交到本地的git仓库中
    • 但没有提交到远程服务器中
  • 当已经有一个项目,就可以复制远程仓库的地址,运行 git clone xxxxx

文件状态的划分

  • Git在管理项目文件的时候,会对项目划分为以下几种状态
    • **未跟踪:**一般在已经被Git管理的项目中,创建新文件的情况下
    • **已跟踪:**当我们在项目文件中运行 git add .的命令后,就会将文件变为已跟踪的状态
      • **staged:**暂缓区中的文件状态,一般是在运行完 git add .命令后,就会放入暂缓区中
      • **Unmodified:**运行完 git commit -m ""命令后,文件所处的状态,代表已经将代码提交到了本地的git仓库
      • **Modified:**当对文件进行修改时候,文件的状态
  • 运行命令顺序为
    • git add .
    • git commit -m ""
    • 同时可以通过 git commit -a -m ""合并成一行代码

检查文件状态-git status

  • 在项目目录下,输入命令 `git status,可以查看项目中的文件状态

image.png

git忽略文件

项目中存在特殊的文件(比如node_modules等),不希望git对其进行跟踪和管理的,可以对其进行忽略

  • 创建 .gitignore文件即可啊,在文件中写入需要忽略的文件
    • 实际开发中,不需要手动创建,通常框架的脚手架会自动生成
    • 必要时候可以自己添加即可
    • 在文件中写入的文件,使用 git status将不会查看该文件状态
test.js
  • github中有一个 gitignore项目,可以查看开发项目需要忽略的文件

Git的校验和

image.png

  • 当我们输入 git log命令的时候,就可以查看到 commit后面跟着的字符串,这个字符串即为 校验和
  • 校验和可以当作本次提交的唯一标识符,可以通过查看本次提交对文件的修改
  • 校验和是通过SHA-1散列的算法生成的

查看提交的历史 - git log

  • 前面我们知道,可以通过 git log命令查看提交记录

image.png

  • 同时为了方便查看,我们可以使用 git log --pretty=oneline

image.png

  • 通常在实际开发过程中,会有多个分支的出现,此时使用 git log --pretty=oneline --grapg 进行查看

image.png

版本回退 - git reset

当我们对一个项目进行了多次的提交,想要回退到之前的版本,可以使用git reset命令进行操作

  • 在上面的学习中,我们可以看到在最后一次提交后,commit的校验和后面都跟着一个 HEAD–>master
  • git reset实际上就是在 修改 HEAD的指向
    • git reset --hard HEAD^回退到上一版本
    • git reset --hard xxxxx回退到指定的版本

image.png

  • 但是当我们回退到了指定的版本后,再通过 git log查看提交记录,会发现丢失了部分的提交记录

image.png

  • 此时我们若想回到最新的提交记录,需要使用 git reflog命令进行查看所有的提交记录

image.png

  • 之后通过 git reset --hard xxxxx命令即可恢复到最新的版本

远程仓库的操作

目前常用的三方远程仓库有:GitHub、Gitee以及GitLab

接下来我们以Gitee为例子,进行远程仓库的学习

创建Gitee账号以及创建一个仓库

  • 登录Gitee官网进行账号注册
  • 注册成功后,登录账号来到首页,创建一个新的仓库

image.png

  • 输入仓库的名称,仓库的介绍等信息,之后选择创建仓库

image.png

  • 此时我们就完成了一个仓库的创建

image.png

远程仓库拉取/提交代码 - git clone

当我们有了一个远程仓库的地址,可以使用 git clone的方式将仓库中的代码克隆下来

但是在克隆的前,需要进行验证

远程仓库的验证-凭证

通过HTTPS协议克隆代码

  • 因为HTTP协议是无状态的连接所以每一次连接都需要输入用户名和密码

  • 但是 Git拥有一个凭证系统,来保证我们只需要第一次输入凭证即可

  • 当我们使用 git clone克隆代码的时候,会出现以下现象

image.png

  • 当我们输入完用户密码之后,Git就会将凭证自动保存下来,在后续的操作中,不用再输入凭证
  • 随后我们就可以将修改完的代码进行提交
    • git add .
    • git commit -m "描述"
    • git push

本地仓库与远程仓库创建连接并push代码

当我们本地有一个项目,且通过 git init初始化了本地的仓库

同时,再Gitee上面,有一个线上仓库

那么,我们想让这两个仓库创建连接,应当怎么做

  • 首先进入到项目目录中,通过输入 git remote add '远程仓库地址'
  • 这样就建立了相应的连接
  • 但是我们要清楚,本地仓库中有可能存在多个分支,远程仓库中也存在很多的分支

image.png

  • 因此,为了顺利拉取提交代码,需要指定远程仓库的分支 git pull <remote> <branch>
本地分支的上游分支

每次拉取/提交代码的时候,都需要指定远程仓库的分支,会很麻烦,因此我们可以设置一下本地分支的上游分支,可以省略重复的步骤

  • 通过输入命令 git branch --set-upstream-to=<远程仓库>/<远程仓库的分支> <本地仓库的分支>

  • 例如 git branch --set-upstream-to=origin/master master

  • 这样就设置了本地仓库的上游分支,可以直接通过 pull/push对代码进行提交以及拉取

拒绝合并不相干的历史

通常我们做了以上操作后,拉取代码的时候依旧会发生错误

image.png

  • 在过去 git merge允许将两个没有共同基础的分支进行合并
    • 比如,我在本地创建了一个本地仓库,在Gitee上创建了一个远程仓库,这两个分支就没有共同的基础
    • 这样造成 新创建的项目可能被一个维护者合并了很多没有必要的历史,到一个已经存在的项目中
  • 而在 Git2.9版本之后,对 git merge进行了纠正,而我们可以通过 git merge --allow-unrelated-histories来恢复之前的操作
  • 这样我们就可以正常的拉取代码了

Git标签(tag)

目的就是在某一个重大版本,打上版本的标签

创建标签

  • 创建轻量标签 git tag v1.0.0
  • 创建附注标签 git tag -a v1.0.1 -m "附注标签"

查看标签

  • 查看简单的标签 git tag

image.png

  • 查看某一个tag的详细信息 git show v1.0.0

image.png

提交tag

  • 提交某一个tag git push origin v1.0.1
  • 提交所有的tag git push origin tags

删除tag

  • 删除本地的tag git tag -d v1.0.0
  • 删除远程的tag git push origin -d v1.0.1

检出tag

回退到某一个tag的版本

  • 使用 git checkout v1.0.0即可

Git提交对象(Git原理)

前面我们对Git的基本操作进行了学习,那么它的底层原理是怎么样的

  • 我们从0-1创建一个项目,首先需要使用 git init初始化本地仓库
    • 在项目文件夹下面会自动生成一个 .git的隐藏文件夹
    • 而我们项目的文件就会保存在 .git/objects文件夹下面

image.png

  • 我们在项目中新增一个 test.js文件,其中写入 console.log(123)代码
    • 此时objects文件夹中没有变化

image.png

  • 当我们运行 git add .命令后,会生成一个文件夹
    • 文件夹里面会包含一长串的字符串

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image.png

  • 我们可以通过 git cat-file -p 文件夹名称+文件名称查看这个文件中的具体内容
    • git cat-file -p 97eb
    • 由此我们可以知道,git add .命令就会将我们的文件转成二进制文件保存在 objects文件夹中

image.png

  • 当我们执行 git commit -m "描述"命令
    • 会生成两个文件夹,41和e6
    • 分别查看两个二进制文件,会发现在e6文件中,有一个tree 指向了41文件
    • 而41 文件右指向了97中的文件

image.png

  • 可以通过以下图形,进行理解

image.png

  • 多次提交

image.png

Git master分支

  • 我们可以使用 git branch 分支名称来创建一个分支:例如创建一个 dev分支 git branch dev
  • 而Git实现分支的切换,实际上是通过控制HEAD的指向进行控制的

image.png

  • 我们可以使用 git checkout dev来切换分支

image.png

  • 当我们在 dev分支进行了改动,并执行了 git add. git commit -m "描述"命令,会发生什么

image.png

  • 同时我们可以使用一条命令创建分支的同时,并切换过去 git checkout -b prod,这样git的分支就切换到了 prod上面

为什么需要使用分支

  • 我们在开发一个项目的时候,通常默认会在 master分支下进行开发
    • 当开发到了一定进展的时候,就会发布,并打上tag标签

image.png

  • 但是上线的 v1.0.0版本,此时发现了bug,此时,就需要创建一条新的分支hotfix,用于修复bug

image.png

  • 同时在后续的版本中,需要将master分支和 hotfix分支的代码进行合并操作
  • 首先切换到主分支 git checkout master
  • 而后通过命令 git merge hotfix进行代码的合并,并提交代码

image.png

查看和删除分支

  • 查看分支 git branch

image.png

  • 查看每个分支的最后一次提交 git branch -v

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 删除一个分支 git branch -d 分支名称
    • 注意删除的只是这个指针,所提交的文件不会删除

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

tcp/ip模型中,帧是第几层的数据单元?

在网络通信的世界中&#xff0c;TCP/IP模型以其高效和可靠性而著称。这个模型是现代互联网通信的基石&#xff0c;它定义了数据在网络中如何被传输和接收。其中&#xff0c;一个核心的概念是数据单元的层级&#xff0c;特别是“帧”在这个模型中的位置。今天&#xff0c;我们就…

有趣的css - 简约的动态关注按钮

页面效果 此效果主要使用 css 伪选择器配合 css content 属性&#xff0c;以及 transition(过渡)属性来实现一个简约的动态按钮效果。 此效果可适用于关注按钮、详情按钮等&#xff0c;增强用户交互体验。 核心代码部分&#xff0c;简要说明了写法思路&#xff0c;看 css 部分的…

一文详解docker swarm

文章目录 1、简介1.1、涉及到哪些概念&#xff1f;1.2、需要注意什么&#xff1f; 2、集群管理2.1、创建集群2.2、将节点加入集群2.3、查看集群状态。2.4、将节点从集群中移除2.5、更新集群2.6、锁定/解锁集群 3、节点管理4、服务部署4.1、准备4.2、服务管理4.2.1、常用命令4.2…

[C++]继承(续)

一、基类和派生类对象赋值转换 在public继承时&#xff0c;父类和子类是一个“is - a”的关系。 子类对象赋值给父类对象/父类指针/父类引用&#xff0c;我们认为是天然的&#xff0c;中间不产生临时对象&#xff0c;也叫作父子类赋值兼容规则&#xff08;切割/切片&#xff…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

又涨又跌 近期现货黄金价格波动怎么看?

踏入2024年一月的下旬&#xff0c;现货黄金价格可以说没了之前火热的状态&#xff0c;盘面上是又涨又跌。面对这样的行情&#xff0c;很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型&#xff0c;一…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)

文章目录 10.1 区块链的未来展望10.1.1 基础知识10.1.2 主要案例&#xff1a;区块链在金融领域的发展10.1.3 拓展案例 1&#xff1a;区块链在供应链管理中的应用10.1.4 拓展案例 2&#xff1a;区块链在身份管理和隐私保护中的应用 10.2 新兴技术与区块链的融合10.2.1 基础知识1…

智能家居的网关新形态:Aqara 方舟智慧中枢 M3 体验

如果说在刚刚结束的 2023 年有哪些备受期待的智能家居产品&#xff0c;Aqara 方舟智慧中枢 M3 一定榜上有名&#xff0c;我的多位朋友也曾在装修过程中多次向我询问是否有这款产品的相关资讯&#xff1b;谁能想到自从在 2022 年 11 月首次亮相之后&#xff0c;这款产品一直等了…

vulhub靶机activemq环境下的CVE-2015-5254(ActiveMQ 反序列化漏洞)

影响范围 Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象&#xff0c;利用该漏洞执行任意代码。 漏洞搭建 没有特殊要求&#xff0c;请看 (3条消息) vulhub搭建方法_himobrinehacken的博客-CSD…

iOS图像处理----探索图片解压缩到渲染的全过程以及屏幕卡顿

一&#xff1a;图像成像过程 ①、将需要显示的图像&#xff0c;由CPU和GPU通过总线连接起来&#xff0c;在CPU中输出的位图经总线在合适的时机上传给GPU &#xff0c;GPU拿到位图做相应位图的图层渲染、纹理合成。 ②、将渲染后的结果&#xff0c;存储到帧缓存区&#xff0c;帧…

【脑电信号处理与特征提取】P7-贾会宾:基于EEG/MEG信号的大尺度脑功能网络分析

基于EEG/MEG信号的大尺度脑功能网络分析 Q: 什么是基于EEG/MEG信号的大尺度脑功能网络分析&#xff1f; A: 基于脑电图&#xff08;EEG&#xff09;或脑磁图&#xff08;MEG&#xff09;信号的大尺度脑功能网络分析是一种研究大脑活动的方法&#xff0c;旨在探索脑区之间的功能…

【JavaSE篇】——继承

目录 &#x1f393;继承 ✅为什么需要继承 ✅继承概念 ✅继承的语法 ✅父类成员访问 &#x1f6a9;子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量的情况 2. 子类和父类成员变量同名 &#x1f6a9;子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员…

SAM:基于 prompt 的通用图像分割模型

Paper: Kirillov A, Mintun E, Ravi N, et al. Segment anything[J]. arXiv preprint arXiv:2304.02643, 2023. Introduction: https://segment-anything.com/ Code: https://github.com/facebookresearch/segment-anything SAM 是 Meta AI 开发的一款基于 prompt 的通用视觉大…

100%涨点!2024最新卷积块创新方案盘点(附模块和代码)

在写论文时&#xff0c;设计高效、创新的卷积块可以显著提升模型的性能&#xff0c;保障工作的有效性和先进性。另外&#xff0c;合理利用卷积块还可以帮助我们提升实验结果、拓展研究的视野和应用场景&#xff0c;增加论文的创新点。因此&#xff0c;对于论文er来说&#xff0…

BSV区块链将凭借Teranode的创新在2024年大放异彩

​​发表时间&#xff1a;2024年1月15日 2024年1月15日&#xff0c;瑞士楚格 – BSV区块链协会研发团队今日官宣了Teranode的突破性功能&#xff0c;这些功能将显著提升BSV区块链网络的效率和速度。在不久的将来&#xff0c;BSV区块链的交易处理能力将达到每秒100万笔交易。 T…

粒子群优化算法

PSO算法 粒子群算法&#xff08;Particle,Swarm Optimization,PSO&#xff09;由Kennedy和Eberhart于1995年提出&#xff0c;算法模仿鸟群觅食行为对优化问题进行求解。 粒子群算法中每个粒子包含位置和速度两个属性&#xff0c;其中&#xff0c;位置代表了待求问题的一个候选…

安装GPU版本Pytorch(全网最详细过程)

目录 一、前言 二、安装CUDA 三、安装cuDNN 四、安装Anacanda 五、安装pytorch 六、总结 一、前言 最近因为需要安装GPU版本的Pytorch&#xff0c;所以自己在安装过程中也是想着写一篇博客&#xff0c;把整个过程记录下来&#xff0c;在整个过程中也遇到了不少的问题&a…

【开源】基于JAVA+Vue+SpringBoot的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…