Git系列之基础篇--add

简介

前两篇分别介绍Git版本控制系统和Git仓库的一些知识,从本章起将正式深入Git的使用;

在第一篇文章《Git系列--初识》中提到了文件状态的几种类型,除了已提交状态之外,Git工作目录下不外乎就两种文件状态:已跟踪或未跟踪。

  1. 已跟踪:是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
  2. 未跟踪:工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
文件的状态变化周期

从上图中可以看出无论是Untracked或Modified状态的文件最终都需要转换成Staged状态的文件才能被Git管理,一般称Staged状态的文件为存入暂存区的文件。

status

在正式使用add命令之前,在这里先引入status命令,其作用为检查当前文件状态;一般的,Git工作目录下的文件除上述介绍的几种文件状态之外,还有一种特殊的状态,即未更改状态--代表所有已跟踪文件在上次提交后都未被更改过。

语法为:git status

add

add命令在Git版本控制中其含义是将所有Untracked和Unstaged的文件放入暂存区,暂存区的文件即可被Git跟踪管理的文件。

初级使用

一般的,使用git add命令开始追踪一个文件,其语法为:git add [<options>] [--] <pathspec>...(options可通过git add -h查看,亦可查阅add)

所以如下实例:

➜  test git:(master) ✗ echo "test" > test.txt
➜  test git:(master) ✗ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    test.txt

nothing added to commit but untracked files present (use "git add" to track)
➜  test git:(master) ✗ git add test.txt   (亦可为 git add . 为添加当前目录所有未跟踪或未暂存文件)
➜  test git:(master) ✗ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   test.txt

上述实例中当创建一个新文件test.txt时,使用git status命令查看,Git会提示Untracked files:(use "git add <file>..." to include in what will be committed);而当执行add操作后,会提示Changes to be committed:(use "git rm --cached <file>..." to unstage),可使用git rm --cached命令将该文件移除暂存区;所以读者可勤用git status命令,Git会友好的提示一些命令。

再次修改文件test.txt使用git status查看发现修改已暂存的文件出现modified状态的文件,根据git status提示,若需要应用此次修改则使用git add,若不应用则使用git checkout --

➜  test git:(master) ✗ echo "test11" > test.txt
➜  test git:(master) ✗ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   test.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test.txt
➜  test git:(master) ✗ git add .
➜  test git:(master) ✗ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   test.txt

高级使用

前文中使用git add命令可将文件放入暂存区进行追踪,那么Git还提供了一套高级命令来完成git add操作;

Git是一个内容寻址文件系统,其核心部分是一个简单的键值对数据库(key-value data store)。它会为每一个暂存区的文件使用SHA-1 哈希算法计算校验和,生成一个blob对象。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。 可以通过底层命令 hash-object 来演示上述效果——该命令可将任意数据保存于 .git 目录,并返回相应的键值。

➜  test git:(master) ✗ ls
test.txt
➜  test git:(master) ✗ git hash-object -w test.txt
cb19826acbc17d65e6b492abf2b5b10930c184f3
➜  test git:(master) ✗  git cat-file -p cb19826acbc17d65e6b492abf2b5b10930c184f3
test11
➜  test git:(master) ✗ git cat-file -t cb19826acbc17d65e6b492abf2b5b10930c184f3
blob
➜  test git:(master) ✗ git update-index --add --cacheinfo 100644 cb19826acbc17d65e6b492abf2b5b10930c184f3 test.txt
➜  test git:(master) ✗ git st
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   test.txt

  1. git hash-object -w 数据来源(stdin或文件) :
    输出长度为 40 个字符的校验和(一个将待存储的数据外加一个头部信息(header)一起做 SHA-1 校验运算而得的校验和)
  2. git cat-file -p SHA-1 :
    输出校验值对应的内容,-p是判断其值并显示其内容 , -t为输出该hash的类型,取值有blob,tree,commit
  3. git update-index --add --cacheinfo 文件模式 SHA-1 文件名 :
    必须为上述命令指定 --add 选项,因为此前该文件并不在暂存区中;同样必需的还有 --cacheinfo 选项,因为将要添加的文件位于 Git 数据库中,而不是位于当前目录下。
    文件模式:
    • 100644:普通文件
    • 100755:可执行文件
    • 120000:符号链接
    • 三种模式即是 Git 文件(即数据对象)的所有合法模式(当然,还有其他一些模式,但用于目录项和子模块)。

此时可查看.git目录下的objects内容(根据SHA-1的hash值存储的文件):

objects内容

从上述的实例中我们再次能感受到Git其内部原理是键值对数据库(key-value data store),通过文件的hash值来定位文件的修改。

总结

git add命令是将未暂存的文件存入暂存区,其内部原理是计算出该文件对应的hash值,并存储至objects目录下,以通过其内容来管理变更。

SHA-1 哈希算法

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。

上一篇:Git系列--Git仓库

下一篇:Git系列之基础篇--commit

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

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,672评论 1 17
  • 今天不想大鱼大肉吃 就做炖蛋、茄子烧毛豆加了些虾皮、韭菜炒豆腐干加了鸡肉丁还很美味哦。 今天的鸡肉丁很成功。鸡肉脯...
    紫微妈咪阅读 287评论 0 0
  • 文/池香衣 我与凰梧见过两次,第一次同车,我们聊着天,她忽然感慨:“好羡慕你,真年轻啊。” 我告诉她,她才值得羡慕...
    池香衣阅读 252评论 8 2
  • find Linux find命令用来在指定目录下查找文件。 实例 找出dev下以 std 开头的文件 find指...
    谢小帅阅读 627评论 0 3