【Git学习笔记】Git初识及其结构原理分析(一)

【Git学习笔记】Git初识及其结构原理分析(一)

🔥个人主页大白的编程日记

🔥专栏Git学习笔记


文章目录

前言

哈喽,各位小伙伴大家好!今天开始我们就进入新的篇章------Git学习!。今天我们来讲一下Git初始及其结构原理分析。话不多说,我们进入正题!向大厂冲锋

一.Git 初识

1.1 提出问题

不知道你工作或学习时,有没有遇到这样的情况:我们在编写各种文档时,为了防止文档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,比如:

"报告-v1"

"报告-v2"

"报告-v3"

"报告-确定版"

"报告-最终版"

"报告-究极进化版"

...

每个版本有各自的内容,但最终会只有⼀份报告需要被我们使用。但在此之前的工作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的文件就越来越多,文件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各自都是修改了什么吗?

文档如此,我们写的项目代码,也是存在这个问题的!!

1.1 如何解决--版本控制器

为了能够更方便我们管理这些不同版本的文件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业。

目前最主流的版本控制器就是Git。Git可以控制电脑上所有格式的文件,例如doc、excel、dwg、dgn、rvt等等。对于我们开发人员来说,Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件!

  • 注意事项

还需要再明确⼀点,所有的版本控制系统,Git也不例外,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等。版本控制系统可以告诉你每次的改动,比如在第5行加了⼀个单词"Linux",在第8行删了⼀个单词"Windows"。而图篇、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图篇从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

二. Git 安装

Git 是开放源代码的代码托管工具,最早是在Linux下开发的。开始也只能应用于Linux平台,后面慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。

  • Linux-centos
    安装Git:
bash 复制代码
 sudo yum -y install git

查看Git安装的版本:

bash 复制代码
git --version
  • Linux-ubuntu
    安装Git:
bash 复制代码
 $ sudo apt-get install git -y

查看git安装的版本:

bash 复制代码
$ git --version

Windows

参考链接:Windows安装git

三.Git 基本操作

3.1创建Git本地仓库

要提前说的是,仓库是进行版本控制的⼀个文件,目录。我们要想对文件进行版本控制,就必须先创建⼀个仓库出来。

创建⼀个Git本地仓库对应的命令为git init

注意命令要在文件件目录下执行,例如:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ pwd
/ home / qcj / gitcode
qcj@139 - 159 - 150 - 152:~/ gitcode$ git init
Initialized empty Git repository in / home / qcj / gitcode / .git /
qcj@139 - 159 - 150 - 152:~/ gitcode$ ll - a
total 12
drwxrwxr - x  3 qcj qcj 4096 May  5 15 : 49 . /
drwxr - xr - x 13 qcj qcj 4096 May  5 15 : 47 .. /
drwxrwxr - x  7 qcj qcj 4096 May  5 15 : 49.git /

我们发现,当前目录下多了⼀个.git 的隐藏文件,

.git 目录是Git来跟踪管理仓库的,不要手动修改这个,目录录里面的文件,不然改乱了,就把Git仓库给破坏了。

其中包含Git仓库的诸多细节,有兴趣的同学可以进如看看。

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ tree.git /
.git /
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch - msg.sample
│   ├── commit - msg.sample
│   ├── fsmonitor - watchman.sample
│   ├── post - update.sample
│   ├── pre - applypatch.sample
│   ├── pre - commit.sample
│   ├── pre - merge - commit.sample
│   ├── prepare - commit - msg.sample
│   ├── pre - push.sample
│   ├── pre - rebase.sample
│   ├── pre - receive.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
├── heads
└── tags
9 directories, 16 files

3.2. 配置Git

当安装Git后首先要做的事情是设置你的用户名称和e-mail地址,这是非常重要的。配置命令为:

bash 复制代码
git config [--global] user.name "Your Name"   
git config [--global] user.email "email@example.com"  
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可。

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

查看配置命令为:

bash 复制代码
git config -l

删除对应的配置命令为:

bash 复制代码
git config [--global] --unset user.name
 git config [--global] --unset user.email

四. 认识工作区、暂存区、版本库

  • 工作区:是在电脑上你要写代码或文件的目录。
  • 暂存区:英文叫 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 命令才能将文件添加到仓库中进行管理!!!

4.1 添加文件--场景⼀

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

  • 添加一个或多个文件到暂存区:git add [filel][file2]

  • 添加指定自录到暂存区,包括子目录:git add[dir]

  • 添加当前目录下的所有文件改动到暂存区:git add

    再使用 git commt 命令将暂存区内容添加到本地仓库中:提交暂存区全部内容到本地仓库中:gitcommit-m"message"提交暂存区的指定文件到仓库区:
    git commit [filel] [file2]注意 git commit 后面的 -m 选项,要跟上描述本次提交的 message,由用户自己完成,这部分内

    容绝对不能省略,并要好好描述,是用来记录你的提交细节,是给我们人看的。-m "message"

c 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello bit
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcje139 - 159 - 150 - 152 : ~/ gitcode$ git commit - m "commit my first file'
[master(root - commit)c614289]commit myfirst file
1 file changed, 2 insertions(+)
create mode 100644 ReadMe

git commit命令执行成功后会告诉我们,1个文件被改动(就是我们新添加的ReadMe文件),插入了两行内容(ReadMe有两行内容)。

我们还可以多次add不同的文件,而只commit⼀次便可以提交所有文件,是因为需要提交的文件是通通被add到暂存区中,然后⼀次性commit暂存区的所有修改。如:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ touch file1 file2 file3
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add file1
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add file2
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add file3
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m "add 3 files"
[master 23807c5] add 3 files
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3

截至目前为止,我们已经更够将代码直接提交至本地仓库了。我们可以使用git log

命令来查看下历史提交记录:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$
commit 23807c536969cd886c4fb624b997ca575756eed6(HEAD->master)
Author : qcj91 <2689241679@qq.com>
Date : Sat May 6 11 : 27 : 32 2023 + 0800
add 3 files
commit c61428926f3853d4ec6dde904415b0e6c1dabcc6
Author : qcj91 <2689241679@qq.com>
Date : Sat May 6 11 : 25 : 50 2023 + 0800
commit my first file

该命令显示从最近到最远的提交日志,并且可以看到我们commit 时的日志消息。

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

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git log --pretty = oneline
23807c536969cd886c4fb624b997ca575756eed6(HEAD->master) add 3 files
c61428926f3853d4ec6dde904415b0e6c1dabcc6 commit my first file

需要说明的是,我们看到的一大串类似 23807c5...56eed6 的是每次提交的 commit(版本号),Git的 commit id 不是1,2,3......递增的数字,而是一个SHA1 计算出来的一个非常大的数字,用十六进制表示(你看到的 commit id 和我的肯定不一样,以你自己的为准)。

4.2 查看.git文件

先来看看我们的.git 的目录结构:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ tree.git /
.git /
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch - msg.sample
│   ├── commit - msg.sample
│   ├── fsmonitor - watchman.sample
│   ├── post - update.sample
│   ├── pre - applypatch.sample
│   ├── pre - commit.sample
│   ├── pre - merge - commit.sample
│   ├── prepare - commit - msg.sample
│   ├── pre - push.sample
│   ├── pre - rebase.sample
│   ├── pre - receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│
└── heads
│
└── master
├── objects
│   ├── 23
│   │   └── 807c536969cd886c4fb624b997ca575756eed6
│   ├── 83
│   │   └── 0a8c9feefbdc098bbae2cdc25e5034ce1920d7
│   ├── 8f
│   │   └── add50161b6fafa53ce7e79d278dc490240c946
│   ├── 9c
│   │   └── 9e1f0f6bff3015df71a0963004476f5e6cfd54
│   ├── c6
│   │   └── 1428926f3853d4ec6dde904415b0e6c1dabcc6
│   ├── e6
│   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   ├── info
│   └── pack
└── refs
├── heads
│   └── master
└── tags
18 directories, 27 files
  1. index 就是我们的暂存区,add 后的内容都是添加到这里的。
  2. HEAD 就是我们的默认指向 master 分支的指针:
bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / HEAD
ref : refs / heads / maste

而默认的 master 分支,其实就是:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat
.git / refs / heads / master
23807c536969cd886c4fb624b997ca575756eed6

打印的23807c536969cd886c4fb624b997ca575756eed6 是什么东西呢?保存的就是当前最新的commit id。

  1. obiects 为 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于".git/objects"目录下,让我们来看看这些对象有何用处:
bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ ls
.git / objects /
23  83  8f  9c  c6  e6  info  pack

查找 obiect 时要将commit id 分成2部分,其前2位是文件夹名称,后38位是文件命称

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

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcodes git cat - file - p
23807c536969cd886c4fb624b997ca575756eed6
tree 830a8c9feefbdc098bbae2cdc25e5034ce1920d7
parent c61428926f3853d4ec6dde904415b0e6cldabcc6
author qcj91 < 2689241679@qq.com>
1683343652 + 800
committer qcj91 < 2689241679qq.com>1683343652 + 0800
add 3 files
#这就是我们最近一次的提交!

其中,还有一行 **tree 830a8c9feefbdc098bbae2cdc25e5034ce1920d7,**我们使用同样的方法,看看结果:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git cat - file  
830a8c9feefbdc098bbae2cdc25e5034ce1920d7
100644 blob 9c9elfof6bff3015df71a0963004476f5e6cfd54  ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391  file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391  file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391  file3

在看ReadMe对应的 9c9elfof6bff3015df71a0963004476f5e6cfd54:

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git cat - file - p
9c9e1fof6bff3015df71a0963004476f5e6cfd54
hello bit
hello bit
#这是我们对ReadMe做的修改!!被git记录了下来!!

总结一下,在本地的 git 仓库中,有几个文件或者目录很特殊

  • index:暂存区, git add 后会更新该内容。
  • HEAD: 默认指向 master分支的一个指针。
  • refs/heads/master:文件里保存当前 master
    分支的最新 commit id。
  • objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

后面再学习过程中,最好能将常见的 git 操作与.git 目录当中的结构内容变化对应起来,这样有利于我们理解git 细节流程。我们后面还会学习什么分支,标签什么的,那我想后面同学就应该学习对应着研究了!

4.3添加文件--场景二

学习到这里,我们已经清楚了如何向仓库中添加文件,并且对于工作区、暂存区、版本库也有了一定的认识。那么我们再展示一种添加文件的场景,能加深对工作区、暂存区、版本库的理解,示例如

bash 复制代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ touch file4
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add file4
qcj@139 - 159 - 150 - 152:~/ gitcode$ touch file5
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"add file"  
[master 3d406c0] add file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file4

提交后发现打印了

1 file changed insertions(+)0 deletions(-),

意思是只有一个文件改变了,这时我们提出了疑问,

不是新增了两个文件吗 ?

再来回忆下,git add 是将文件添加到暂存区,git commit 是将暂存区的内容添加到本地仓库中。由于我们并没有使用 git add file5 ,file5 就不在暂存区中维护,所以我们commit 的时候其实只是把已经在暂存区的 file4 提交了,而遗漏了工作区的 fie5。如何提交 file5 呢 ? 很简单,再次add, commit 即可

后言

这就是Git初始及其结构原理分析。大家自己好好消化!今天就分享到这!感谢各位的耐心垂阅!咱们下期见!拜拜~

相关推荐
Jose_lz11 小时前
C#开发学习杂笔(更新中)
开发语言·学习·c#
Chloeis Syntax11 小时前
接10月12日---队列笔记
java·数据结构·笔记·队列
QT 小鲜肉11 小时前
【个人成长笔记】Qt 中 SkipEmptyParts 编译错误解决方案及版本兼容性指南
数据库·c++·笔记·qt·学习·学习方法
颇有几分姿色11 小时前
Git将本地项目推送到GitLab
git·gitlab
A9better11 小时前
嵌入式开发学习日志41——stm32之SPI总线基本结构
stm32·单片机·嵌入式硬件·学习
Cathy Bryant12 小时前
矩阵乘以向量?向量乘以向量?
笔记·神经网络·考研·机器学习·数学建模
Lynnxiaowen13 小时前
今天我们学习python编程常用模块与面向对象
运维·python·学习·云计算
递归不收敛13 小时前
Conda 常用命令汇总(新手入门笔记)
笔记·conda
前端橙一陈14 小时前
Salesforce Developer Edition(开发者版) 搭建测试环境
经验分享·笔记·其他
电子小子洋酱14 小时前
BearPi小熊派 鸿蒙入门开发笔记(4)
笔记·华为·harmonyos