Git 是一个强大的工具,但是使用起来却不是很友好。如果程序员们能够真正花时间去理解 Git 的构成,将会避免很多不必要的麻烦。

以下为译文:

初学 Git 就像一个不懂当地语言的人来到一个陌生的国家——如果你知道自己在哪,该去哪里,那还好。一旦你迷路了,那麻烦就大了。

网上有很多学习 Git 基本命令的文章,但是本文并不属于这一类文章。我在此处将尝试提供一个不同的学习思路。

初学者一般都很害怕 Git,很难不怕。毫无疑问,Git 是一个强大的工具,但是使用起来却不是很友好。使用 Git 要理解很多新的概念,将文件作为命令参数和不作为参数两者的含义大相径庭。

我认为要想克服这些困难,不仅要学习 Git 的 commit 和 push 的用法。如果我们能够真正花时间去理解 Git 的构成,将会避免很多不必要的麻烦。

一、研究 .git 目录

好的,我们现在开始吧。

当你通过 git init 创建 git 仓库时, git  就会创建 .git 目录。该目录包含让 git 能够正常工作所需的所有信息。直白点说,如果你不想在项目中继续使用 git ,直接将 .git 目录删除只保留项目文件即可。但是为什么这样做就可以呢?

下面是你第一次提交后 .git 文件夹的样子:

 ├── HEAD  ├── branches  ├── config  ├── description  ├── hooks  │ ├── pre-commit.sample  │ ├── pre-push.sample  │ └── ...  ├── info  │ └── exclude  ├── objects  │ ├── info  │ └── pack  └── refs  ├── heads  └── tags

HEAD

后面再讲。

config (配置)

该文件包含你的仓库配置,比如远程的 url ,你的邮箱和用户名等。每次你在控制台使用 git config... 都会对这里产生影响。

description(描述)

供 gitweb ( github  的一种前身) 使用,显示仓库的描述。

hooks (钩子)

这是一个有趣的特性。Git 提供了一套脚本,可以在每个有意义的 Git 阶段自动运行。这些被称为钩子的脚本可以在提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后运行。脚本命预示着它的执行时机。如我们可以编写 pre-push 的作为钩子,进行推送代码前的检查。

info (信息)

你可以将不想被 git 管理的文件记录到 .gitignore 文件中。排除文件的意思是不想共享这个文件。例如你不想共享你的 IDE 自定义配置,将其添加到 .gitignore 文件中即可。

二、一次提交包含哪些内容?

每次你创建一个文件,并追踪它,git 都将把文件进行压缩并存储在自己的数据结构中。被压缩的对象将具有唯一的名称和 hash 值,并将存储到对象 (object) 目录中。

在研究对象目录之前,我们必须明白一次提交的含义是什么。你可能会说,一次提交就是当前工作目录的一个快照,但事实远不止如此。

实际上,当你提交时,git 通过下面两个步骤对你的工作目录创建快照:

如果文件没啥变化,git 只是将压缩的文件(哈希值)添加到快照中。

如果文件发生了变化, git 将对其进行压缩并将其存储在 object 文件夹。最终,将这个压缩文件的名称(哈希值)添加到快照中。

这里给出一个简化的过程,实际上整个过程有点复杂,将在以后的文章中给出详细的介绍。

一旦快照被创建出来,它将会被压缩,以哈希值命名。那么这些压缩的对象存在哪里呢?他们被存在 object 文件夹中。

├── 4c
│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash
├── 86
│ └── 550c31847e518e1927f95991c949fc14efc711 // hash
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash
├── info // let's ignore that
└── pack // let's ignore that too

这是我创建了一个空的文件  1.txt 并提交后 object 文件夹的样子。请注意,如果你的文件哈希值为 "4cf44f1e…",git 会将其存储到 "4c"子目录中,并将其命名为"f44f1…"。这个小技巧,将 /objects 目录的数量减少到 255 个以内。

你要记住的是,一次提交包含 4 个部分:

  1. 工作目录快照名称(一个哈希值)。

  2. 一条评论/注释。

  3. 提交者信息。

  4. 父提交的哈希值。

如果我们解压提交的文件:

// 通过查看提交历史,你可以轻松地查询到提交的哈希值
// 你都不需要复制完整的哈希值字符串,
// 复制能够保证哈希值的唯一性的前面一段即可。
git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

得到下面的内容:

tree 86550c31847e518e1927f95991c949fc14efc711
author Pierre De Wulf <test\[@gmail.com\](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
committer Pierre De Wulf <\[test@gmail.com\](mailto:pierredewulf31@gmail.com)> 1455775173 -0500  commit A
</test\[

正如预想的一样,我们看到了快照的哈希值、作者信息和提交的注释。

有两个非常重要的事项:

  • 正如所预想的那样,快照的哈希 "86550…" 也是一个对象,你可以在对象文件夹中找到它。

  • 因为这是第一次提交,所以没有父提交的哈希值。

那么,在快照中存的是啥呢?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711  100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

我们找到之前存储的最后一个对象,也是我们快照中的唯一的一个对象。它是一个 blob 对象,这是另外的知识点,不在这里讨论。

三、分支, 标签, HEAD 都一样

你现在已经了解到,git 中的所有内容都可以通过正确的哈希值来获取到。现在让我们聚焦于 HEAD。那么什么是 HEAD?Git 高级用法,喜欢就拿去用。

cat HEAD
ref: refs/heads/master

HEAD 不是一个哈希,HEAD 可以理解为指向你正在使用的分支的顶端的指针。我们接下来看下 refs/heads/master:

cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

看起来眼熟吗?这和我们第一次提交的哈希值相同。这表明分支 ( branch) 和标签 (tag) 只不过是一个指向提交的指针。这就意味着,即使你删掉了你要删除的分支和标签,他们指向的提交依然还在那里,只不过删除后难获取这些提交更困难一些。如果你想了解更详细的内容,可以通过 git book 来学习。

四、写在最后

所以学到这里,你应该明白 git 提交就是把你当前工作目录的文件“压缩”,然后将其和其他信息一起存储到对象文件夹中。如果你对 git 足够熟悉,你就会知道哪些文件会包含在提交中,哪些文件不会被提交。

我这里说的提交,并不是指你的工作目录快照,而是指你要提交的文件快照。在实际执行之前,git 会在哪里存储你要提交的文件?

它将他们存储到索引文件中。不过,我们暂时不打算深入研究它。如果你真的感兴趣,可以通过这里

https://github.com/git/git/blob/master/Documentation/technical/index-format.txt

深入学习。

感谢阅读!希望通过阅读本文,你能够学到有价值的内容。希望本文能够帮你更轻松地使用 git。

原文:https://www.daolf.com/posts/git-series-part-1/
作者:Pierre de Wulf  
译者:明明如月,责编:郭芮
来源:CSDN(ID:CSDNnews)

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

Git基础: .git 目录详解相关推荐

  1. git bash here创建项目无法选择m_版本控制Git基础及使用详解

    1.Git简介 1.1.简介 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,用以有效.高速的处理 ...

  2. Windows系统Git安装教程(详解Git安装过程)

    Windows系统Git安装教程(详解Git安装过程)   今天更换电脑系统,需要重新安装Git,正好做个记录,希望对第一次使用的博友能有所帮助! 获取Git安装程序   到Git官网下载,网站地址: ...

  3. git checkout 命令图文详解

    git checkout 命令图文详解 git checkout branchname (切换本地分支) 切换远程分支 放弃修改 git checkout . git checkout -- file ...

  4. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解和Linux系统各个目录的作用 标签: linuxtcpfunctionclassfirefoxtimer 2012-01-11 23:08 45517人阅读 评论(2) ...

  5. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 我的世界服务器怎么找到指定路径,[小白]MC服务端目录详解

    服务器的前期准备工作都做好了,是时候上传服务端到服务器了.不过--先等等,在上传前你应该先了解一下服务端目录的结构以便于后期的维护! 如图所示的是MCPC+1.6.4的服务端结构示意图,其他开服端基本 ...

  9. linux基础配置脚本,Linux中selinux基础配置教程详解

    selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selin ...

  10. elastic stack 基础组件beats详解

    elastic stack 基础组件beats详解 fielbeat filebeat: spool_size: 1024 # 最大可以攒够 1024 条数据一起发送出去 idle_timeout: ...

最新文章

  1. MPB:南土所褚海燕组-​非靶标代谢组测定土壤可提取有机碳组分
  2. 温习 SQL 01(Z)
  3. Jackson 通过自定义注解来控制json key的格式
  4. oracle正在没落,Oracle停掉一个正在运行的job
  5. 【UIKit】UILabel使用
  6. 机器学习中的基本数学知识
  7. UA MATH563 概率论的数学基础 鞅论初步1 条件期望
  8. 身份证识别——iOS端实现身份证检测
  9. 求平方根sqrt()函数的底层算法效率问题
  10. Windows Phone开发(46):与Socket有个约会 转:http://blog.csdn.net/tcjiaan/article/details/7669315...
  11. LeetCode 题 - 88. 合并两个有序数组
  12. Android 工程师如何快速学会web前段
  13. 中国酸2-葡萄糖苷(AA2G)市场趋势报告、技术动态创新及市场预测
  14. Atitit.eclise的ide特性-------abt 编译
  15. 2022-2027年中国通信光缆市场规模现状及投资规划建议报告
  16. 旷视科技一面 2022.0804
  17. STM32--ADC
  18. 皮特测评:蓝牙耳机哪个品牌最好?300元内最好的蓝牙耳机
  19. 关于使用VMware Workstation Pro16 创建Kali-Linux虚拟环境的操作办法以及库源的配置
  20. 设计模式-装饰者模式(给阿姨倒杯卡布奇诺)

热门文章

  1. 瓶子个数计数halcon
  2. 永磁交流伺服电机的工作原理与更换新编码器后的常规零位校正方法
  3. Halcon —— 边缘检测算子详解
  4. faster rcnn的测试
  5. .net runtime占用cpu_.net 中的StringBuilder和TextWriter区别
  6. 数据结构与算法(6) -- heap
  7. HDU 1727 Hastiness(模拟)
  8. Codeforces Round #FF (Div. 1) A. DZY Loves Sequences
  9. [转]Design Pattern Interview Questions - Part 2
  10. HDU 3664 Permutation Counting(DP)