点击上方 Java后端,选择 设为星标
优质文章,及时送达
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 只是将压缩的文件(哈希值)添加到快照中。
-
如果文件发生了变化, git 将对其进行压缩并将其存储在 object 文件夹。最终,将这个压缩文件的名称(哈希值)添加到快照中。
├── 4c
│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash
├── 86
│ └── 550c31847e518e1927f95991c949fc14efc711 // hash
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash
├── info // let's ignore that
└── pack // let's ignore that too
/objects
目录的数量减少到 255 个以内。
-
工作目录快照名称(一个哈希值)。
-
一条评论/注释。
-
提交者信息。
-
父提交的哈希值。
// 通过查看提交历史,你可以轻松地查询到提交的哈希值
// 你都不需要复制完整的哈希值字符串,
// 复制能够保证哈希值的唯一性的前面一段即可。
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
-
正如所预想的那样,快照的哈希 "86550…" 也是一个对象,你可以在对象文件夹中找到它。
-
因为这是第一次提交,所以没有父提交的哈希值。
git cat-file -p 86550c31847e518e1927f95991c949fc14efc711
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt
cat HEAD
ref: refs/heads/master
cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
作者:Pierre de Wulf
译者:明明如月,责编:郭芮
来源:CSDN(ID:CSDNnews)
如果看到这里,说明你喜欢这篇文章,请转发、点赞
。同时标星(置顶)本公众号可以第一时间接受到博文推送。
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
相关文章
暂无评论...