《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 <[email protected]> 变动操作者

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 <[email protected]>

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

?
?

r2

?
?

commit 1113041465c48519fc5a46eb0bed004af6d6c0d0

Author: 1000copy <[email protected]>

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起个准确的名字很重要啊。

?
?

时间: 2024-08-03 21:43:22

《Git小书》笔记:3 介绍的相关文章

《Git小书》笔记:1 前言

? ? 在图灵社区买了本<Git小书>,以前也买了一本<GitHub入门与实践>,看完了,觉得挺好,可是现在几乎都忘了,怎么感觉杀鸡用牛刀的赶脚,我完全用不上那些功能啊,可能是没有因为没有经历团伙作案的项目吧,git几乎成了文件备份工具了,自然而然地几乎只用到了推送功能.而那些复杂的命令虽然练了不少,但终究因为缺少累积理解也都忘了. Git推送代码,因为都是代码练习片段,没有形成库的形式,加上推送的时候总是纠结commit的写法,所以也渐渐不用了. 最近对C语言有了点感觉,感觉如果

《Git小书》笔记:6 分支

还记得在食堂排队吗,假设好多同学喜欢看到认识的同学就喜欢插队,只是他的插队不是直接插入,而站在队外面,然后来了新人看到了,又插到他后面,很快我们就看到食堂窗口那里变成了一颗树了. 好的,我们先来一个人排队: 查看分支: 我们开始插队,创建一个新分支roma: 在新分支上修改文件,然后提交一下,就相当于又插队了一个人: 好的,现在roma分支上我们已经完成了插队,而master分支还只有一个人"init",现在查看一下roma分支上有几个人了: 下面是简化SAH1输出的命令格式,一般情况

《Git小书》笔记:4 暂存区

这节讲了暂存区,我觉得讲的很好啊, 之前一起奇怪暂存区怎么用来的. 还用之前的比喻吧. 暂存区就好比侦探的那个相机嘛,暂存区的本质其实不是用来暂存的,如果说用来暂存的,至少会引起误解,因为我们会说为什么要暂存呢?直接存不就好了,为啥多此一举.的确,如果某种情况你要直接存当然不需要暂存区了. 但是暂存的是什么?暂存的是文件吗?正如那个侦探拍摄到的嫌疑人,他拍摄的是整个人吗?不是,他拍摄的一个行为.同理,暂存区暂存的是什么?暂存的是修改而非文件,我们要用改动的眼光看待文件,一个文件从诞生伊始,空无一

《Git小书》笔记:2 安装

git --version 登记一下: git config --global user.name "Your Name" git config --global user.email "[email protected]" 做实验的话,用 Line1 Line2 Line3 作为测试文件内容,大写L是为了便于区分吧,也没必要怕写一个大写L,因为重要的大写L这个形式 echo Line1 > file echo go > file 紧跟之后创建内容,不对

易学设计模式看书笔记(7) - 代理模式

代理模式 1.系统日志记录的例子:给系统中的业务逻辑加上日志 (1):最简单直接的做法 public class Test { private Logger logger = Loger.getLogger(this.getClass().getName()); public void doLgic(String name){ logger.log(name + "开始业务逻辑处理..."); //业务逻辑处理相关程序 System.out.println("业务逻辑处理相关

微信小程序管理后台介绍

微信小程序的管理后台,每次进入都需要扫码,还是特别不爽,现在微信小程序还没正式发布,很多人都还没看到管理后台,这里抢先发布出来 ------------------------------------------------------------ http://www.cnblogs.com/likwo/p/6057258.html 好推小程序统计:https://weixin.hotapp.cn关键指标分析推广效果,一行代码接入微信登录 ---------------------------

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

GIT & GitHub 学习笔记

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活, 干完后,需要把自己做完的活推送到中央服务器.集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网 速慢的话,就纳闷了. Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑 上.既然每个人的电脑都有一个完整的版本库

git/github学习笔记

郑重提示,本文来自这里,如果喜欢,请关注原作者. 1. git 版本控制系统 相比CVS\SVN优势: - 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度块 ps:关于git的更详细的介绍于优点在此就不介绍了,教大家怎么用是关键.:) ==============运行环境======== 系统:windows git : Git-1.7.3.1-preview20101002.rar  下载地址:http://d.download.csdn.net/do