Git的原理与使用(一)

目录

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的其他操作以及高级的特性. 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CountDownLatch和CyclicBarrier详解

1. CountDownLatch 1.1 简介 CountDownLatch 是 Java 中并发包(java.util.concurrent)提供的一种同步工具,用于在多线程环境中协调多个线程之间的执行顺序。它的作用是允许一个或多个线程等待其他线程完成操作。 CountDownLatch 通过一个计…

java使用geotools导出shp文件

SHP格式是一种矢量数据格式,用于存储地理信息系统(GIS)数据。 SHP文件由一系列有序的文件组成,我们导出的shp文件包括.shp、.shx、.dbf、.prj以及.fix文件。 .shp(shape)文件:存储矢量地图数据&…

自定义类型:联合和枚举

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联合体对比 1.4 联合体大小的计算 1.5 联合的一个练习 2. 枚举类型 2.1 枚举类型的声明…

思维模型 目标效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。明确目标,激发内在动机。 1 目标效应的应用 1.1 目标效应在教育领域的应用-棉花糖实验 美国斯坦福大学心理学系的教授米歇尔(Walter Mischel)曾经进行了…

1204. 错误票据

题目: 1204. 错误票据 - AcWing题库 思路: 将输入的数据存入数组,从小到大排序后遍历,若 (a[i] a[i - 1])res1 a[i]--->重号;若(a[i] - a[i - 1] > 2)res2 a[i] - 1--->断号。 难点:题目只告诉我们输入…

1977 智慧校园平台开发与实现JSP【程序源码+文档+调试运行】

摘要 本文旨在设计和实现一个智慧校园平台系统,以满足管理员、教师和学生三类用户的需求。管理员拥有最高管理权限,可对教师和学生用户进行管理;教师用户可查看和管理本班学生信息、成绩等;学生用户可查看个人信息、考试成绩等。…

Leetcode139单词拆分及其多种变体问题

1 声明 1.1 首先,大家常常把这道题当作了背包问题来做,因为其循环结构和背包问题刚好相反,但事实如此嘛? 背包问题通常都是组合问题,这其实是一道“”面向目标值的排列问题“,具体和背包问题有什么不同可…

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

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

【Nginx】深入浅出搞懂Nginx

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 反向代理服务器? 经常听人说到一些术语,如反向代理,那么什么是反向代理&a…

Pinia 状态管理器 菠萝:Option Store风格

Pinia介绍: Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。 Pinia 大小只有 1kb 左右,超轻量级,你甚至可能忘记它的存在! 相比 Vuex,Pinia 的优点: 更贴合 Vue 3 的 Composition API 风…

【Python】KDtree的调用

前言 查询点集中与目标点最近的k个点 from scipy.spatial import cKDTree import numpy as npdata np.array([[1,2],[1,3],[4,5]]) # 生成 100 个三维数据 tree cKDTree(data) # 创建 K-D Tree result tree.query(np.array([5, 5]), k2) # 查询与 [0.5, 0.5, 0.5] 最近的三…

Jvm虚拟机

问题: 计算机能识别的语言是二进制,Java文件是程序员编写的,如何能够在计算机上运行? 以及Java为什么可以实现跨平台? 一Java的jdk中有jvm虚拟机 可以将文件转换为字节码文件 使得它可以在各种平台上运行,这…

计算机组成原理之处理器(流水线)

引言 为什么不采用单周期实现,硬件比较简单? 主要是因为效率太低,处理器中最长的路径(一般是ld指令)决定了时钟周期 流水线概述 流水线是一种能使多条指令重叠执行的技术。 流水线更快的原因是所有的工作都在并行执行,所以单位…

按键编程 pal库和标准库

按钮的电路设计 电路的搭建 原理与编程 创建了两个变量 用来捕捉按键的状态 先让两个变量都为1 previous和current都为1 (按键没按下) 然后让current去捕捉按键的状态通过读gpioA的pin0 如果为0就是按键按下 如果为1就是按键没按下 然后赋值给current …

论文笔记:Deep Trajectory Recovery with Fine-Grained Calibration using Kalman Filter

TKDE 2021 1 intro 1.1 背景 用户轨迹数据对于改进以用户为中心的应用程序很有用 POI推荐城市规划路线规划由于设备和环境的限制,许多轨迹以低采样率记录 采样的轨迹无法详细说明物体的实际路线增加了轨迹中两个连续采样点之间的不确定性——>开发有效的算法以…

哈希表之闭散列的实现

闭散列实现哈希表 在闭散列实现哈希表中,我们选择线性探测法来解决哈希冲突。在哈希表的简介部分,我们已经介绍过线性探测法啦! 线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止…

Carla之语义分割及BoundingBox验证模型

参考: Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera) Carla自动驾驶仿真五:opencv绘制运动车辆的boudingbox(代码详解) Carla官网Bounding Boxes Carla官网创建自定义语义标签…

【离散数学必刷题】谓词逻辑(第二章 左孝凌版)刷完包过!

专栏:离散数学必刷题 本章需要掌握的重要知识: 1.利用谓词表达式表示命题 2.变元的约束 3.谓词公式的定义、谓词公式的赋值 4.谓词公式的翻译(注意在全总个体域时使用特性谓词) 5.有限论域上量词的消去 6.谓词公式中关于量词的等价…

软件工程——名词解释

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

思维模型 暗示效应

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