首页 > 代码库 > 《Git小书》笔记:3 介绍

《Git小书》笔记:3 介绍

概念类比说明:

创建嫌疑人名单--git init pot--创建版本仓库

添加嫌疑人--echo line1 > file1--创建文件

第一次拍摄嫌疑人--git add file1--添加跟踪

侦探的相机--暂存区

老板--仓库区

嫌疑人--工作区

提交拍到的嫌疑人给老板--git commit -m "init"--提交修改

嫌疑人第一次作案--echo line2 >> file1--修改文件file1

侦探拍摄嫌疑人作案过程--git add file1--添加修改到暂存区

侦探提交修改到给老板--git commit -m "r1"--提交修改

...

老板查看侦探的汇报--git log--查看历史提交

老板对提交的汇报格式很不满意--命令别名机制

...

??

一下内容有些牵强附会,纯属为了方便记忆。

??

用Git管理代码库就好比你请了一个私家侦探来跟踪某几个人一样。

如果把一个文件夹比作一伙人,现在你请了一个私家侦探来监控这几个人,这几个人就好比一个一个团伙,你创建一个pot文件夹来监控这个团伙git init pot

??

创建版本仓库

git init pot pot就是版本仓库,可以把你要监控一组人比作一个项目的版本仓库

cd pot

ls -A 大写的A表示不显示.和..

??

创建文件

好的,现在这个团伙创建好了,现在你要告诉侦探你要监控的人,所以你创建了一个file1目标echo line1 > file1,好的你可以查看版本仓库的状态git status -s

??

跟踪新文件,提交修改

好的,现在你告诉侦探把file1列入监控名单,接下来侦探负责跟踪拍照,然后他再把拍到的照片交给你。跟踪拍照的过程就好比跟踪新文件这个过程,而把跟踪偷拍到的照片交给你,就好比提交修改

现在,你添加了一个新文件到仓库pot了,就好比王监控名单上写了一个人,轮到侦探跟踪拍照了git add file1,OK,照片偷拍好了,侦探把照片交给你就好比完成了一次提交,怎么交给你呢?交给你的动作就是git commit -m "init"

你可以把一次提交看做一个对象(也就是侦探的一次监控汇报),然后对象名是"init",对象地址(或者对象引用/对象管理权)是SHA1修订标识符。

每当嫌疑人file1有异常的一举一动,侦探都要给拍下来,然后向你汇报。

比如,现在嫌疑人file1又有新举动了,echo line2 >> file1,好家伙又偷偷加了一行进去,赶紧拍下来git add file1,照相机就好比暂存区(index/cache/stage),照片就好比文件改动,照片拍好了提交给老板(仓库)git commit -m "r1",真麻烦,每次跟老板汇报,都要总结一下汇报的内容,就是汇报嫌疑做了什么事,最好能在分析一下。

git add 只有一个功能,就是把改动提交到暂存区,改动分两种:一种是新加入的文件;一种是文件的修改。

好家伙,file1又有新动作了,它又偷了一行line3,echo line3 >> file1,赶紧拍下来存到暂存区(照相机)git add file1里面去,拍好了,取个名字"r2"提交给老板(仓库)git commit -m "r2"

??

看看参仓库修订

这个侦探听勤快,这么短时间就汇报了三次工作,把file1的盗窃行为原封不动地记录了下来。

你就是那个老板吧,现在改研究一下侦探的汇报材料了。先看看file1最近一次的盗窃行为是什么,git log head -1,head你可以看做是最近一次提交的名字(或者看做一个手指,指向最近的一次汇报提交)。

看到提交信息是:

commit 6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411 40位的修订对象标识符,这也太长了吧

Author: xxxx <xxxx@gmail.com> 变动操作者

Date: ? Thu May 19 20:24:03 2016 +0800 提交时间,非案发时间?

空行

r2

这里的Author是file1改动的作者啊,Date是提交时间,非案发时间。r2是侦探对这次事件提交起的名字啊。

head 既然是个引用,那么当然也能直接使用提交对象的地址也就是6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411

git log 6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411 -1 你也可以偷下懒,写成

git log 6bc5e70 -1 解释下,-1表示显示几个,因为默认git log是显示所有的,所以要加个表示数量的选项参数

我们来检验一下这两种方法输出是否一样

diff <(git log head -1) <(git log 6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411

-1)

还有没有其他查看监控报告的方法:有

git show head 还会显示show此修订和它的前一个修订之间的差异

git show head --quiet 不显示差异

head真是个强大的金手指啊!指哪打哪,还可以用它来显示多个修订

git show head~1 --quiet 你可以理解为 0~1,表示最近一次修订和之前的一次修订

git show head~2 --quiet 依次类推

如果要打印全部信息呢?git show适用用于显示特定次数的修订

git log 列出全部修订,最近的一次在最上面,新闻嘛,当然最新的最有价值。

commit 6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411

Author: 1000copy <1000copy@gmail.com>

Date: ? Thu May 19 20:24:03 2016 +0800 ?? ?

??

r2

??

commit 1113041465c48519fc5a46eb0bed004af6d6c0d0

Author: 1000copy <1000copy@gmail.com>

Date: ? Thu May 19 20:24:03 2016 +0800 ??

??

r1

??

每次都看到作者和日期,真的好烦人啊,有没有什么办法不显示作者和日期的,而且把SHA1和对象名字都放到同一行呢?有啊!

git log --pretty=oneling 解释一下,这里的pretty是一个属性,oneline是属性值,属性要加--,属性值用=赋值给属性即可

6bc5e700ef6cd8c1b3ed3dd015ab8f4e9df67411 r2

1113041465c48519fc5a46eb0bed004af6d6c0d0 r1

4c34c35cb760a71cd811b6defc9bf18b703d34fd init

??

每次都看到这么长的一坨乱七八糟的莫名其妙的修订标识符SHA1真的很不人性化啊!能不能短点?能!

git log --abbrev-commit --pretty=oneline 解释下,这里的abbrev-commit就是一个缩写提交的属性(自带属性值了)

6bc5e70 r2

1113041 r1

4c34c35 init

??

hist

好吧,得寸进尺些!有没有更人性化的显示方式,看到乱七八糟的数字就不爽,即使只有7个,我只要提交名就够了。

git log -pretty=format:‘%s‘

r2

r1

init

好是好,就是这个选项太长了吧!别担心,命令别名机制一劳永逸!

git config --global alias.hist ‘log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short‘

git 就好比sudo嘛

alias.hist 表示起别名,alias就好比一个类,然后hist相当于其中的一个数据域,所以用点号连接

‘引号里面的就是别名内容,可以理解为宏替换。

log 用于替换

--pretty=format:"%h %ad | %s%d [%an]"提交SHA1的缩写 日期缩写 提交名 (HEAD指向的分支名(如果HEAD是指向这个提交的话),分支名) [修改作者名]

--graph 图形和输出分支

--date=short data是修饰时间属性的参数,这里的值是short

对了,上面都是不可变参数,git log 还有个可变参数:-n 表示显示从最近一个提交开始的n个分支

git hist -2 就可以显示完美的效果了:

* b638182 2016-05-31 | r2 (HEAD -> roma, master) [1000copy]

* 8743400 2016-05-31 | r1 [1000copy]

??

mist

还记得我们之前的一个只输出提交名的那个命令吗:

git log --pretty=format:‘%s‘ 用的是格式化输出方式,稍微复杂的是 git log --abbrev-commit --pretyy=oneline

把git log --pretty=format:‘%s‘ 配置个别名:

git config --global alias.mist ‘log -pretty=format:"%s"‘

git mist -2

r2

r1

适用于无需修订标识符即可说明问题的场合,可见给commit起个准确的名字很重要啊。

? ?

《Git小书》笔记:3 介绍