git init 执行后发生了什么?

news2024/12/25 9:14:04

首先在磁盘中创建一个新目录 Git,进入该目录后执行 git init 初始化。这个时候目录下会创建一个隐藏目录 ./git,这个./git 目录叫做 Git 版本库或者仓库

$ git init
Initialized empty Git repository in D:/Git/.git/

image.png
在讲解.git 目录内容前,先来说说 git 中相关的概念:

一、Git 中的基本概念

  1. 仓库(Repository):Git使用仓库来存储项目的版本历史和文件。一个仓库可以包含完整的项目历史记录,包括所有的分支、标签和提交。
  2. 提交(Commit):提交是Git中的基本操作单元,它代表了项目中的一个版本快照。每个提交都包含一个唯一的哈希值,用于标识和引用该提交。
  3. 分支(Branch):分支是用于在项目中进行并行开发的重要概念。每个分支代表一个独立的代码线,可以在其上进行修改和提交。默认情况下,Git创建一个名为"master"的主分支。
  4. 标签(Tag):标签是用于标记项目中的重要点或里程碑的静态指针。与分支不同,标签通常用于标记稳定版本或发布版本,不会随着新的提交而移动。
  5. 远程仓库(Remote Repository):远程仓库是位于网络上的另一个Git仓库副本,用于协作和共享代码。常见的远程仓库托管服务包括GitHub、GitLab和Bitbucket。
  6. 克隆(Clone):克隆是从一个远程仓库创建一个本地副本的操作。克隆操作将复制远程仓库的所有历史记录和文件到本地,使得你可以在本地进行开发和提交。
  7. 拉取(Pull):拉取是从远程仓库获取最新更改的操作。它会将远程仓库的提交合并到本地仓库中,以确保你的本地副本是最新的。
  8. 推送(Push):推送是将本地仓库的提交上传到远程仓库的操作。它将本地的提交推送到远程仓库,以便与其他人共享和访问。
  9. 工作区(Working Directory):工作区是你当前正在编辑和修改文件的目录。它包含了项目的实际文件,包括源代码、配置文件等。就是指在当前根目录下,除了.git 目录下的其他文件。比如在工作区中创建一个 readme.txt 文件:
$ echo "read me" > readme.txt

在这里插入图片描述
10. 暂存区(Staging Area):暂存区是一个中间区域,用于存储将被包含在下一次提交中的更改。可以使用 git add 命令将修改的文件添加到暂存区。

接下来再回过头来看看初始化后的.git 目录:

二 、.git 目录

当执行命令 git init 后,创建的.git 目录结构为:

|   config               //存储仓库的配置信息
|   description					 //该git库的描述信息
|   HEAD                 //指向当前所在的分支。
|
+---hooks                //包含客户端或服务器端的钩子脚本,可以在特定事件发生时触发自定义操作。
|       applypatch-msg.sample
|       commit-msg.sample
|       fsmonitor-watchman.sample
|       post-update.sample
|       pre-applypatch.sample
|       pre-commit.sample
|       pre-merge-commit.sample
|       pre-push.sample
|       pre-rebase.sample
|       pre-receive.sample
|       prepare-commit-msg.sample
|       push-to-checkout.sample
|       sendemail-validate.sample
|       update.sample
|
+---info                //包含全局的Git配置文件
|       exclude
|
+---objects             //存储Git的对象,包括提交、树和文件的内容。
|   +---info            //Git对象内容
|   \---pack            //Git大对象压缩内容放在此处
\---refs                //存储分支和标签的引用。
    +---heads						//branch分支对应的commit引用
    \---tags            //tag标签对应的commit引用

config 文件

config 文件是.git 目录下一个重要的配置文件,它存储存储着Git仓库的各种配置选项。主要有三个地方存储:

  1. /etc/gitconfig 文件: 系统上所有用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
  2. ~/.gitconfig~/.config/git/config 文件:只针对当前用户。在执行 git config 时带上 --global 选项,就让 Git 读写此文件,此时会对当前用户系统上所有的仓库生效。
  3. 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 可以在执行 git config 时带上 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)
    每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
配置用户信息,比如用户名,邮件

能用 git config 命令配置用户信息

//查看所有的配置项
$ git config --list
//配置用户名和邮件, --global 选项会对当前系统所有的仓库生效
$ git config --global user.name "Your Name"
$ git config --global user.email "Your email"
//删除配置项
$ git config --global user.name
$ git config --global user.email

设置 Git 别名

比如利用 git co代替 git commit命令

$ git config --global alias.co commit
配置文本编辑器

当需要输入信息时,比如 git commit时的 message,如果不配置,会使用默认的编辑器,bash 界面中就是 vim。

//windows环境下,编辑时默认打开记事本
$ git config --global core.editor notepad

Index 文件

暂存区(staging Area)实际上就是.git 目录下的 Index 文件,当执行 git add命令时,就会在.git 目录下创建 Index 文件,所 add 的文件对象 ID 会被记录在 Index 文件中的索引中:

$ git add readme.txt

image.png

Objects 目录

当执行命令 git init初始化仓库时,会在.git 目录下创建 objects 目录和子目录 pack 和 info。
在执行 git add操作后,会将文件内容保存在.git/objects 目录下:

├─d9
│      b401251bb36c51ca5c56c2ffc8a24a78ff20ae
│
├─info
└─pack

个文件对应一条内容, 以该内容加上特定头部信息一起的 SHA-1 校验和为文件命名。 校验和的前两个字符用于命名子目录(比如上面的 d9),余下的 38 个字符则用作文件名。查看该文件内容:

//输入SHA-1值的一部分即可查到该文件对应的内容
$ git cat-file -p d9b401251bb
read me

refs 目录和 HEAD 文件

初始化时,该 refs 目录下的子目录 heads 和 tags 均为空。当执行 git commit命令后,heads 子目录会创建一个 master 文件,这个文件指向最新提交的引用:

$ git commit readme.txt
//查看当前的master文件内容:
$ cat .git/refs/heads/master
3894d195cda57b707f71a50bc2f97e06f73eae02

hooks 目录

钩子都被存储在 Git 目录下的 hooks 子目录中。 也就是项目中的 .git/hooks 目录 。 当执行 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。比如:

+---hooks                //包含客户端或服务器端的钩子脚本,可以在特定事件发生时触发自定义操作。
|       applypatch-msg.sample
|       commit-msg.sample
|       fsmonitor-watchman.sample
|       post-update.sample
|       pre-applypatch.sample
|       pre-commit.sample
|       pre-merge-commit.sample
|       pre-push.sample
|       pre-rebase.sample
|       pre-receive.sample
|       prepare-commit-msg.sample
|       push-to-checkout.sample
|       sendemail-validate.sample
|       update.sample

在特定的重要动作发生时触发这些脚本,主要有两种类型钩子:客户端钩子和服务器端钩子:客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。上述的示例脚本就是客户端钩子脚本。

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

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

相关文章

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1:rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址:https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…

《JVM由浅入深学习【七】 2024-01-11》JVM由简入深学习提升分享

亲爱的读者们,欢迎来到本篇博客,这是JVM第七次分享,下面是七个JVM常用常面的分享,请笑纳 目录 1. 几个与JVM 内存相关的核心参数2.如何计算一个对象的大小3.堆为什么要分为新生代和老年代4.JVM堆的年轻代为什么要有两个 Survivor…

分布式限流和本地限流那些事?

分布式限流和本地限流的目的是一样的,当然我建议技术人在自己的服务中优先考虑本地限流,那样对于自己的API的影响会小一点。 限流这种技术,在没有触发限流的阈值的时候,是不会有什么大的问题的,当时一旦触发阈值&…

全网独家:基于openEuler-22.03-LTS-SP4底包构建opengauss 2.1.0 rpm包安装的单机轻量版数据库容器

本文基于openEuler-22.03-LTS-SP4底包,使用rpm安装方式构建opengauss 2.1.0 单机轻量版数据库容器。 一、openEuler-22.03-LTS-SP4底包 1、下载镜像 下载链接 sha256:ffe6c97428d6e684519dd670c18d6681861bdc17719b0387c6e11a65e37a771f openEuler-docker.x86_64.tar.xz …

景联文科技:以高质量数据赋能文生图大模型

1月5日,在智求共赢・中国AIGC产业应用峰会暨无界AI生态合作伙伴大会上,中国AIGC产业联盟联合无界AI发布了《中国AIGC文生图产业白皮书2023》,从AIGC文生图发展历程、主流工具、产业实践以及规模预测等多个维度,全面揭示了中国AIGC…

electron+vue编辑Office Word?

Electron 桌面应用是基于 Chromium 内核的,而谷歌Chrome取消了对PPAPI插件支持后,在线Office方案纷纷失效,只能更换国产浏览器在低版本浏览器苟延残喘,不能用于electronvue项目。 经过小编不断的寻找,终于找到一款至今…

vue3的福音框架arco.design

前言: 在vue2于2023年底正式宣布不在维护,vue3使用越来越频繁的时刻,我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时,不过也有很多好的框架,功能也强大,比如我们今天说的…

数据交付变革:研发到产运自助化的转型之路

作者 | Chris 导读 本文讲述为了提升产运侧数据观察、分析、决策的效率,支持业务的快速迭代,移动生态数据研发部对数仓建模与BI工具完成升级,采用宽表建模与TDA平台相结合的方案,一站式自助解决数据应用需求。在此过程中&#xff…

限流算法之计数器法

文章目录 一、计数器法是什么?二、模拟限流算法java版效果 一、计数器法是什么? 计数器法是限流算法里最简单也是最容易实现的一种算法。 比如:对于一个接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做&#xff…

大话 JavaScript(Speaking JavaScript):第二十一章到第二十五章

第二十一章:数学 原文:21. Math 译者:飞龙 协议:CC BY-NC-SA 4.0 Math对象用作多个数学函数的命名空间。本章提供了一个概述。 数学属性 Math的属性如下: Math.E 欧拉常数(e) Math.LN2 2 …

论文阅读《Generalizing Face Forgery Detection with High-frequency Features》

高频噪声分析会过滤掉图像的颜色内容信息。 本文设计了三个模块来充分利用高频特征, 1.多尺度高频特征提取模块 2.双跨模态注意模块 3.残差引导空间注意模块(也在一定程度上体现了两个模态的交互) SRM是用于过滤图像的高频噪声 输入的图…

韩语干货-TOPIK韩语初级必备词汇|柯桥外语学校-小语种考级培训

물【名】水 좋다【形】好 나쁘다【形】坏,不好 맛있다【形】好吃 맛없다【形】不好吃,难吃 책【名】书 없다【形/动】没有/不在 있다【形/动】有,在 읽다【动】读 많다【形】多 적다【形】少 좋아하다【动】喜欢 싫다【形】讨厌 구두…

AI人工智能虚拟数字人行业运用那些领域较广?

AI人工智能虚拟数字人行业是一种新兴的技术应用领域,近年来得到了快速发展。据统计数据显示,该行业的市场规模逐年扩大,投资前景广阔。 首先,我们可以从技术创新的角度来分析AI人工智能虚拟数字人行业的发展情况。随着人工智能技…

已设定选项 ‘readonly‘ (请加 ! 强制执行)

这是vim编辑器报的错误,相信很多人都遇到过。在使用vi编辑一个需要sudo权限的文件后,保存的时候出现这样的错误。这个时候很多人做的事情可能就是不保存退出(敲命令:q!),然后再以sudo vi打开文件重新编辑一次。如果恰巧…

STL标准库与泛型编程(侯捷)笔记5

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

【软件测试】刚入行的测试人,“我“该怎么提升自己技术能力...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一个问题&#xf…

The Planets:Earth

靶机下载 The Planets: Earth ~ VulnHub 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-11 09:20 CST Nmap scan report for 192.168.1.1 Host is up (0.00036s latency). MAC Address: …

1872_S32K344 MCU基本信息了解

全部学习汇总: GreyZhang/g_s32k344: A new MCU learning notes. I would try to use MCAL instead of SDK. (github.com) 以下的摘录信息来自: S32K Auto General-Purpose MCUs | NXP Semiconductors 安全等级可以到ASIL D。 M7的内核,主频可…

黑暗酷炫风:Pyqt5打造的YOLOv5暗绿蓝调GUI - 非第三方组件库

基于YOLOv5的道路标志识别项目(yolov5界面GUI) English | 简体中文 这是一个关于yolov5的道路标志识别项目,使用Pyqt5开发界面,Yolov5训练模型,数据库Mysql,包含五个模块:初始化参数、标志识别…