学会Git很简单(上)

Git初始化

在我们探索Git的奥秘之前,除了需要安装Git环境以外,我们还需先配置Git的初始变量。

配置Git初始变量

配置用户名和邮箱(提交的时候需要):

$ git config --global user.name "USERNAME"
$ git config --global user.email "EMAIL@qq.com"

也可以设置命令的别名:

$ git config --global alias.st status

这样设置了之后,以后再用到 git status 时可用 git st 进行替代。

完成基本的初始化工作之后,我们就可以正式开始Git之旅了。

创建Git版本库及首次提交

$ cd /Users/jy/Desktop
$ git init demo    
Initialized empty Git repository in /Users/jy/Desktop/demo/.git/

进入到我们制定的目录, git init demo 会为我们创建一个demo目录,并为其初始化Git版本库。

$ ls -a
.    ..   .git

可见,初始化版本库之后目录下会有一个.git的隐藏目录,这个文件就是整个版本控制实现的关键。

然后我们在目录中创建一个新文件:

$ echo "hello git" > hello.txt

然后我们进行第一次提交:

$ git add hello.txt
$ git commit -m "first commit"
[master (root-commit) 505f1bc] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 hello.txt

从输出可以看出,(root-commit)表示master分支的首次提交,提交的commit ID 为 505f1bc;

在Git工作区的某子目录执行git操作时,会从工作区的目录依次递归向上地查找.git目录,在非Git工作区执行git命令时,会提醒fatal: Not a git repository (or any of the parent directories): .git

Git 暂存区

理解Git暂存区

在执行 git statusgit diff 命令时,会扫描工作区改动,先根据.git/index 文件中的时间戳、长度等信息判断文件是否有改动,若有改变则读取index中内容进行对比;若没有改动,则更新时间戳。
.git/index实际上是一个包含文件索引的目录树,记录了文件名和状态信息(时间戳和文件长度等)。而文件内容并没有存在这儿,内容保存在Git对象库.git/objects目录中,文件索引建立了文件和对象库中对象实体之间的对应关系。

工作区、版本库、暂存区原理图

git diff 命令

查看HEAD(版本库中当前提交)指向的目录树:

$ git ls-tree -l HEAD
100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f      10    hello.txt

// 1. -l: 显示文件大小  当前文件大小为10B
// 2. 100644:  文件属性 (rw-r--r--)
// 3. blob: blob对象(文件)
// 4. 8d0e41...: 40位的SHA1哈希值格式的ID

我们先新建个文件夹以及文件,再将其添加到暂存区中。

$ mkdir -p file/test
$ echo "my second file" >> file/test/second.txt
$ git add .

如果要查看暂存区的目录树:

$ git ls-files -s
100644 75d6370ae31008f683cf18ed086098d05bf0e4dc 0   file/test/second.txt
100644 8d0e41234f24b6da002d962a26c2495ea16a425f 0   hello.txt

如果想针对暂存区目录树使用 git ls-tree 命令,需要先将暂存区的目录树写入Git对象库(使用 git write-tree )。

$ git write-tree
667f37c2876a1aac5b56a2617dc6312bf36a60a2

$ git ls-tree 667f37
040000 tree 645cf3cf0dedc40f52cb66dc152653e4adb143df    file
100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f    hello.txt

git diff 带不同参数的区别:

不同参数的 git diff

(1) 工作区和暂存区的比较:

$ git diff
diff --git a/hello.txt b/hello.txt
index 8d0e412..a497e7c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
 hello git
+second.

(2) 暂存区与HEAD比较:

diff --git a/file/test/second.txt b/file/test/second.txt
new file mode 100644
index 0000000..75d6370
--- /dev/null
+++ b/file/test/second.txt
@@ -0,0 +1 @@
+my second file

(3) 工作区与HEAD比较:

diff --git a/file/test/second.txt b/file/test/second.txt
new file mode 100644
index 0000000..75d6370
--- /dev/null
+++ b/file/test/second.txt
@@ -0,0 +1 @@
+my second file
diff --git a/hello.txt b/hello.txt
index 8d0e412..a497e7c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
 hello git
+second.

Git 对象

探索Git对象

通过 git log 命令,查看日志信息:

$ git log -l --pretty=raw

commit 3f3c6f4f91e29e08c72874f1dc5309eefd998b66
Author: JYGod <jiangyu@teddymobile.cn>
Date:   Thu May 31 16:28:46 2018 +0800

    second commit

commit 505f1bcf709e4cc1d4f5c7d150718444fba652e6
Author: JYGod <jiangyu@teddymobile.cn>
Date:   Tue May 22 14:09:09 2018 +0800

    first commit

我们可以看到之前的两次提交的相关信息。然后我们可以通过 git cat-file 命令来查看相应ID对应的Git对象的相关信息。

$ git cat-file -t 3f3c6f4f
commit

$ git cat-file -p 3f3c6f4f
tree 6bffd1c96739426e0025993332c7b0cc63d94e00
parent 505f1bcf709e4cc1d4f5c7d150718444fba652e6
author JYGod <jiangyu@teddymobile.cn> 1527755326 +0800
committer JYGod <jiangyu@teddymobile.cn> 1527755326 +0800

second commit

通过提交的ID进行对象查看,我们可以知道该对象属于commit对象,而该commit对象中记录了一个tree和parent。

$ git cat-file -t 6bffd1c
tree

$ git cat-file -t 505f1bcf
commit

这两个分别是tree对象和commit对象,也就是说,当前commit对象记录了本次提交所对应的目录树以及上一次提交的commit对象信息。我们再来看看那个tree对象里面有什么:

$ git cat-file -p 6bffd1c
040000 tree 645cf3cf0dedc40f52cb66dc152653e4adb143df    file
100644 blob a497e7c6e2891fe4ebab8995e18f169c8f0ae882    hello.txt

通过以上信息,我们可以在得知,在完成提交后,会生成一个commit对象,一个commit对象代表一次提交。tree对象表示一个目录,而blob对象代表一个单独的文件。

现在我们将命令 git log 的结果以一种更明了的图形结构来表示其commit对象对应的结构:

git log --pretty=raw --graph

* commit 3f3c6f4f91e29e08c72874f1dc5309eefd998b66
| tree 6bffd1c96739426e0025993332c7b0cc63d94e00
| parent 505f1bcf709e4cc1d4f5c7d150718444fba652e6
| author JYGod <jiangyu@teddymobile.cn> 1527755326 +0800
| committer JYGod <jiangyu@teddymobile.cn> 1527755326 +0800
|
|     second commit
|
* commit 505f1bcf709e4cc1d4f5c7d150718444fba652e6
  tree 07ed5a7aebb914e3a02edf6d622b82d364037e3c
  author JYGod <jiangyu@teddymobile.cn> 1526969349 +0800
  committer JYGod <jiangyu@teddymobile.cn> 1526969349 +0800

      first commit

对应的数据结构如下图所示:

Git版本库结构图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,855评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,905评论 0 11
  • 这幅画其实在国庆假期前已经画好,但要伺候各路过节的大员就一直没有发表。还是先起稿,用2B铅笔画,注意狗的头部...
    晴晨2017阅读 2,513评论 2 5
  • 咖啡,给人的感知是苦涩的,又谁知咖啡是香醇的,让人回味、让人陶醉、更让人如痴如醉…… 咖啡是一种往事、更是一种回忆...
    路焱阅读 361评论 0 0
  • 读一遍只知道大意,书要重读。这句话我理解的不透,但是贯穿了我读余秋雨、庄子、宋玉等等。 没读诗经前以为书中都是“蒹...
    徐子为阅读 444评论 0 2