Git的原理与使用(一)

news2024/12/24 10:12:23

目录

Git初始

Git安装

Git基本操作

创建git本地仓库

配置git

工作区,暂存区,版本库

添加文件,提交文件

查看.git文件

修改文件

版本回退

小结


Git初始

git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理.

下面这个实例看理解下为什么需要版本控制

在工作或者学习中,我们可能经常会遇到这样的场景,例如当我们需要给领导提供一份资料的时候,我们先写出了一个版本,交给领导,但是领导看完不满意,让重新写,于是我们又写了第二个版本,领导还是不满意,于是又写了第三个版本,领导看完之后说还不如第二个版本的文档,于是就要第二个版本的文档.

这种情况下我们想要恢复到第二个版本的文档是不是就比较麻烦了.

但是如果我们将文档交给git进行管理之后,那个问题就不在是问题了.

对于Git这个工具,不管是在企业中还是学习中,适用频率都是很高的一个工具,在企业中我们需要合作开发项目,那么合作完成项目,git是必不可少的一个工具.

Git安装

工欲善其事必先利其器,接下来我们先安装git.

我们安装git环境是在CentOs.

后续的操作也是在CentOS上进行操作.

由于我们的系统上是没有git的,我们需要安装git.

在没有安装git之前,我们在控制台上输入git之后,会出现这样的场景:

git
-bash: git: command not found

上述情况只是系统提示我们没有安装git.

其实在linux上安装git非常简单,只需要一个命令即可:

 yum -y install git

当操作这个命令之后,我们可以在控制台输入 git --version来查看我们安装的版本.

目前为止我们的git已经安装完成了.可以看出git的安装是非常简单的,可以说是傻瓜式安装.

Git基本操作

接下来我们将介绍git的一些基本操作.这些基本操作一般使用频率最高.

创建git本地仓库

上述图片中的命令就是在我们本地创建一个新的git仓库.

git init 命令就是创建本地仓库的命令.

当我们创建完成之后,我们在当前仓库发现了一个.git的隐藏目录.这个目录就是用来管理这个仓库下的所有东西的.

以下就是.git目录下的所有东西.

关于这个.git目录中的东西我们在后面会详细进行介绍.

配置git

接下来就需要对git进行配置,这个配置是非常重要的,主要就是配置用户名和email地址,这个配置用来区分是那个用户进行提交的.

配置命令:

git config user.name "Your Name" 
git config user.email "email@example.com" 

 需要把user.name和user.email 换成自己的即可.

可以使用git config -l进行查看

--global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个 配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。

删除对应的配置命令:

git config  --unset user.name

git config  --unset user.email

如果需要删除全局的配置,只需要将 --global选项即可.

工作区,暂存区,版本库

工作区:工作区就是在git仓库下进行编写代码和文档的地方.

暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。

版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

图中左侧为⼯作区,右侧为版本库。

Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。

在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指 针叫 HEAD。(分⽀和HEAD的概念后⾯再说)

当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。

当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。

由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中 进⾏管理!!!

添加文件,提交文件

我们在包含.git目录的下新建一个文件,我们可以使用git add 命令将工作区的文件添加到暂存区.

  • 添加一个或多个文件到暂存区                    git add [file1] [file2] ...
  • 添加一个目录到暂存区                               git add [dir]
  • 添加当前目录下所用改动的文件到暂存区   git add

再使用git commit命令将暂存区中的文件提交的本地仓库中.

  • 提交暂存区全部内容到本地仓库中: git commit -m "message" 
  • 提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] ... -m "message"

注意:git commit -m选项要跟上这次提交的描述信息.这个不能缺少.用来记录你提交的细节,要好好描述.

[root@VM-8-9-centos TestGit]# git init
初始化空的 Git 版本库于 /root/TestGit/.git/
[root@VM-8-9-centos TestGit]# ls -a
.  ..  .git
[root@VM-8-9-centos TestGit]# touch 1.txt
[root@VM-8-9-centos TestGit]# touch 2.txt 3.txt
[root@VM-8-9-centos TestGit]# ls
1.txt  2.txt  3.txt
[root@VM-8-9-centos TestGit]# git add 1.txt
[root@VM-8-9-centos TestGit]# git add 2.txt 3.txt
[root@VM-8-9-centos TestGit]# git commit 1.txt -m "提交一个文件"
[master(根提交) da0d6e8] 提交一个文件
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.txt
[root@VM-8-9-centos TestGit]# git commit -m "将暂存区中所有文件都提交"
[master 890a29d] 将暂存区中所有文件都提交
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 2.txt
 create mode 100644 3.txt
[root@VM-8-9-centos TestGit]# ^C
[root@VM-8-9-centos TestGit]# 

 此时我们可以使用git log命令来查看提交记录:

该命令显示的是从进到远的日志.

 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

我们发现在上面都会有一些数字比如890a29.................,这个数字的话是我们每次进行提交的commit Id(版本号),git的commit id是通过一系列计算出来的16进制的数字.

要搞明白这些数字的含义,就需要进入.git目录.

查看.git文件

  • index就是暂存区,我们进行add的文件和代码都是在这个目录下
  • HEAD就是我们默认指向的master分支的指针

其实所谓的master分支就是: 可以看到master分支打印 了一串数字,其实这个数字就是我们最近提交的commit id

我们可以通过打印日志来看看:

[root@VM-8-9-centos TestGit]# git log --pretty=oneline
890a29d9bdb4b08ce1a6c62cb2f9686ca9c0e451 将暂存区中所有文件都提交
da0d6e8dbbda2503b782b862bb1d332dc2a6a5a1 提交一个文件
[root@VM-8-9-centos TestGit]# 

可以看到完全一致.也就是说我们现在是将文档提交到master分支上的.

  • objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容

当执⾏ git add 命令 时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处.

我们发现里面有很多的目录,查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。

找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的 ⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容:

 我们所有对本地仓库目录下的所有操作,都会被git记录下来,也就是在objects目录下,这里记录了所有对本地仓库的操作.

修改文件

Git ⽐其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,⽽⾮⽂件。

什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符, 也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。

我们可以将我们前面提交的文件进行修改,

我们使用vim 1.txt打开文件,在里面写入hello world,然后保存退出.

此时,仓库中的1.txt文件和我们工作区的1.txt文件是不同的.我们可以使用git status命令查看在你上次提交之后是否有对⽂件进⾏再次修改

 上述结果已经告诉我们了,1.txt已经被修改,但是还没有进行添加和提交.

此时我们是知道1.txt文件已经被修改了,但是并不知道修改了那些内容.我们可以使用命令:

git diff 1.txt 来查看修改了那些内容.

这里我们就能看到我们添加了一行hello world .

当我们知道我们修改了那些内容的时候,我们就可以进行添加和提交操作了.

当我们进行了add 之后再次查看的时候,就会发现他会提示你要提交的变更是那个了.然后我们进行提交就可以了.

版本回退

之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。

执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。

要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:

git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

  •  --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内 容,⼯作区⽂件保持不变。
  •  --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
  •  --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命 令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
  •  HEAD 说明:

可直接写成 commit id,表⽰指定退回的版本

HEAD 表⽰当前版本

HEAD^ 上⼀个版本

HEAD^^ 上上⼀个版本

以此类推...

可以使⽤ 〜数字表⽰:  

HEAD~0 表⽰当前版本

HEAD~1 上⼀个版本

HEAD^2 上上⼀个版本

以此类推..

为了方便测试,我们对1.txt文件进行三次修改 添加 和提交操作.

第一次:

第二次:

第三次:

查看历史的提交记录:

 现在,如果我们在提交完 version3 后, 发现 version 3 编写错误,想回退到 version2,重新基于 version 2 开始编写。由于我们在这⾥希望的是将⼯作区的内容也回退到 version 2 版本,所以需 要⽤到 --hard 参数,⽰例如下:

我们这里的回退是直接的commit Id进行回退的.

现在我们发现工作区的1.txt文件已经回退到了version2的版本了.同时也发现head已经指向了version2了

值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解 成如下⽰意图:

 

小结

本篇文章为git的基础篇,后续会持续更新git的其他操作以及高级的特性. 

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

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

相关文章

eocc1_Findings_candlestick_ohlc_volume_

An Unusually Tall Candle Often Has a Minor High or Minor Low Occurring within One Day of It异常高的蜡烛通常会在一天内出现小幅高点或小幅低点 I looked at tens of thousands of candles to prove this, and the study details are on my web site, ThePatternSite.com…

软件工程——名词解释

适用多种类型的软件工程教材,有关名词释义的总结较为齐全~ 目录 1. 软件 2. 软件危机 3. 软件工程 4. 软件生存周期 5. 软件复用 6. 质量 7. 质量策划 8. 质量改进 9. 质量控制 10. 质量保证 11. 软件质量 12. 正式技术复审 13. ISO 14. ISO9000 15.…

SpringBoot系列-2 自动装配

背景: Spring提供了IOC机制,基于此我们可以通过XML或者注解配置,将三方件注册到IOC中。问题是每个三方件都需要经过手动导入依赖、配置属性、注册IOC,比较繁琐。 基于"约定优于配置"原则的自动装配机制为该问题提供了一…

macOS使用conda初体会

最近在扫盲测序的一些知识 其中需要安装一些软件进行练习,如质控的fastqc,然后需要用conda来配置环境变量和安装软件。记录一下方便后续查阅学习 1.安装miniconda 由于我的电脑之前已经安装了brew,所以我就直接用brew安装了 brew install …

【yolov5】onnx的INT8量化engine

GitHub上有大佬写好代码,理论上直接克隆仓库里下来使用 git clone https://github.com/Wulingtian/yolov5_tensorrt_int8_tools.git 然后在yolov5_tensorrt_int8_tools的convert_trt_quant.py 修改如下参数 BATCH_SIZE 模型量化一次输入多少张图片 BATCH 模型量化…

Technology Strategy Patterns 学习笔记8- Communicating the Strategy-Decks(ppt模板)

1 Ghost Deck/Blank Deck 1.1 It’s a special way of making an initial deck that has a certain purpose 1.2 you’re making sure you have figured out what all the important shots are before incurring the major expense of shooting them 1.3 需要从技术、战略、产…

2023 年最新企业微信官方会话机器人开发详细教程(更新中)

目标是开发一个简易机器人,能接收消息并作出回复。 获取企业 ID 企业信息页面链接地址:https://work.weixin.qq.com/wework_admin/frame#profile 自建企业微信机器人 配置机器人应用详情 功能配置 接收消息服务器配置 配置消息服务器配置 配置环境变量…

[01]汇川IMC30G-E系列运动控制卡应用笔记

简介 IMC30G-E系列产品是汇川技术自主研制的高性能EtherCAT网络型运动控制器(卡),同时兼容脉冲轴的控制;IMC30G-E支持点位/JOG、插补、多轴同步、高速位置比较输出、PWM等全面的运动控制功能,具备高同步控制精度。 开发…

OpenWRT浅尝 / 基于RAVPower-WD009便携路由文件宝的旁路网关配置

目录 前言需求分析手头的设备家庭网络拓扑图旁路网关配置OpenWRT固件选择OpenWRT固件刷入旁路网关配置流程 旁路网关的使用前置工作日常存储/关键备份内网穿透24小时待命下载器 前言 近期由于个人需求,需要一台OpenWRT设备实现一些功能。所以本文主要还是为了自己后…

k8s-实验部署 1

1、k8s集群部署 更改所有主机名称和解析 开启四台实验主机,k8s1 仓库;k8s2 集群控制节点; k8s3 和k8s4集群工作节点; 集群环境初始化 使用k8s1作为仓库,将所有的镜像都保存在本地,不要将集群从外部走 仓库…

金和OA jc6 任意文件上传漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率…

学习率范围测试(LR Finder)脚本

简介 深度学习中的学习率是模型训练中至关重要的超参数之一。合适的学习率可以加速模型的收敛,提高训练效率,而不恰当的学习率可能导致训练过慢或者无法收敛。为了找到合适的学习率,LR Finder成为了一种强大的工具。 学习率范围测试&#x…

Django的ORM操作

文章目录 1.ORM操作1.1 表结构1.1.1 常见字段和参数1.1.2 表关系 2.ORM2.1 基本操作2.2 连接数据库2.3 基础增删改查2.3.1 增加2.3.2 查找2.3.4 删除2.3.4 修改 1.ORM操作 orm,关系对象映射,本质翻译的。 1.1 表结构 实现:创建表、修改表、…

思维模型 暗示效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。无形中引导他人的思想和行为。 1 暗示效应的应用 1.1 暗示效应在商业品牌树立中的应用 可口可乐的品牌形象:可口可乐通过广告、包装和营销活动,向消费者传递了一种…

【递归】求根节点到叶节点数字之和(Java版)

目录 1.题目解析 2.讲解算法原理 3.代码 1.题目解析 LCR 049. 求根节点到叶节点数字之和 给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点…

伙伴(buddy)系统原理

一、伙伴算法的由来 在实际情况中,操作系统必须能够在任意时刻申请和释放任意大小的内存,该函数的实现需要考虑延时问题和碎片问题。 延时问题指的是系统查找到可分配单元的时间变长,例如程序请求分配一个64KB的内存空间,系统查看…

Technology Strategy Patterns 学习笔记9 - bringing it all together

1 Patterns Map 2 Creating the Strategy 2.1 Ansoff Growth Matrix 和owth-share Matrix 区别参见https://fourweekmba.com/bcg-matrix-vs-ansoff-matrix/ 3 Communicating

STM32F407: CMSIS-DSP库的移植(基于库文件)

目录 1. 源码下载 2. DSP库源码简介 3.基于库的移植(DSP库的使用) 3.1 实验1 3.2 实验2 4. 使用V6版本的编译器进行编译 上一篇:STM32F407-Discovery的硬件FPU-CSDN博客 1. 源码下载 Github地址:GitHub - ARM-software/CMSIS_5: CMSIS Version 5…

开发者测试2023省赛--Square测试用例

测试结果 官方提交结果 EclEmma PITest 被测文件 [1/7] Square.java /*** This class implements the Square block cipher.** <P>* <b>References</b>** <P>* The Square algorithm was developed by <a href="mailto:Daemen.J@banksys.co…

AWS云服务器EC2实例进行操作系统迁移

AWS云服务器EC2实例进行操作系统迁移 文章目录 AWS云服务器EC2实例进行操作系统迁移1. 亚马逊EC2云服务器简介1.2 亚马逊EC2云务器与弹性云服务器区别 2. 亚马逊EC2云服务器配置流程2.1 亚马逊EC2云服务器实例配置2.1.1 EC2实例购买教程2.1.1 EC2实例初始化配置2.1.2 远程登录E…