首页 > 代码库 > 《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 介绍