文件忽略——.gitignore文件

Git提供了文件忽略功能。当对工作区内某个目录或文件设置了忽略后,再执行git status查看状态时,被忽略的文件即使存在也不会显示为未跟踪状态。

注: 当添加忽略的文件已被添加进暂存区进行跟踪时,此时文件是不处于被忽略的状态的,此时需要先将指定文件git rm移出暂存区。

以下以一个简单的.gitignore文件简单展示一下常用方式:

# 我是注释
hello.java # 所有路径下名称为hello.java的文件及目录
*.class # 统配符指定所有带.class结尾的文件
!hello.class # 不忽略名称为hello.class的文件
/hello.java # 工作区下的hello.java文件
dir/ # 工作区下的dir目录

当所添加的忽略文件是该项目共享时,需要将该.gitignore文件添加到版本库。与该共享式忽略对应的是独享式忽略,分别有以下两种方式:第一种是设置.git/info/exclude来设置具体版本库的文件忽略;第二种是设置core.excludesfile指定全局的版本库文件忽略。

注: .gitignore文件一般是位于版本库的一级目录,但其位于版本库的其他目录能生效。

归档命令——git archive

指定某个提交,用该提交对应的目录树创建一个归档,被忽略的文件及.git目录不会加入其中,常用使用为git archive -o last.jar HEAD

版本表示法——git rev-parse

git rev-parse是Git的一个底层命令,功能非常复杂,常见用法如下。

显示引用:

命令 功能
git rev-parse --git-dir 展示git版本库的位置
git rev-parse --symbolic --branches 展示分支
git rev-parse --symbolic --tags 展示标签
git rev-parse HEAD 输出当前HEAD指向提交的SHA1值

显示对象对应的SHA1值:

命令 功能
git rev-parse HEAD 显示当前HEAD指向的提交的SHA1值
git rev-parse A-1-abcdef1 通过git describe输出解析为SHA1值
git rev-parse master refs/heads/master 显示分支指向的提交的SHA1值
git rev-parse A^{tree} 展示标签A对应目录树的SHA1值
git rev-parse master~1 展示master分支指向提交的父提交的SHA1值
git rev-parse master^0 展示master分支指向提交本身的SHA1值

版本范围表示:git rev-list

git rev-list列出指定的版本范围。

以下是简单的几个常见用法:

命令 功能
git rev-list <commit-id> 列出从<commit-id>开始的历史版本(即以其为终点开始的旧版本)范围
git rev-list <commmit-id-1> <commit-id-2> 列出<commit-id-1><commit-id-2>开始的版本范围的并集
git rev-list ^<commit-id-1> <commit-id-2> 列出<commit-id-2>开始的历史版本并排除其中从<commit-id-1>开始的历史的版本
git rev-list <commit-id-1>..<commmit-id-2> 同上,^..均为符号
git rev-list <commit-id-1>...<commit-id-2> 列出<commit-id-1><commit-id-2>开始的版本范围除了两者的交集剩下的版本范围
git rev-list <commmit-id>^@ 列出<commit-id>开始的历史版本(除去自身)

日志范围展示:git log

首先需要知道的是日志范围展示其实是在git rev-list展示版本号信息的基础上列出更多的信息。故可知git log命令也能接版本号,具体使用语法与git rev-list一致,不接版本号下默认接的是HEAD。

命令 作用
git log --graph 展示各提交间的关系图
git log --oneline 简洁展示各版本提交信息,包括缩略提交id及提交信息
git log -p 展示日志同时如需展示该提交的改动具体信息
git log -<N> 显示最近的N条日志
git log --stat 只显示提交改动的文件,不需要知道具体的改动信息
git log --pretty=raw 显示commit的原始数据,可以显示提交对应的树id
git log --pretty=fuller 同时显示作者和提交者
git log --pretty=oneline 简洁显示日志信息,提交id是完整id

注: 查看分析某一提交可以使用git showgit cat-file -p

文件追溯:git blame

显示文本文件每一行是什么时间点的哪个版本引入,一般用于发现BUG时定位BUG使用。常见用法如下:

git blame <file-name># 追溯指定文件的所有行
git blame <file-name> -L <n>,<m> # 追溯指定文件的从n到m行

二分法定位版本:git bisect

Git提供的git bisect命令是基版本库的、自动化的问题查找和定位工具。具体使用可以参考官方文档

一、手动定位版本

git checkout <branch> # 切换到指定分支
git bisect start # 启动二分法定位问题,此时是不在任何分支上的
git bisect bad # 标记当前版本为坏版本
git bisect good <commit-id> # 标记指定版本为好版本
                            # 由此逐步缩小范围,最终确定最早的坏版本
git bisect reset # 找到对应版本后重置掉打下的标记重新切回<branch>分支

注: git bisect可以从日志文件中检出和载入,git bisect log > <file-path>是将二分查找的日志保存到一个日志文件中,git bisect replay <file-path>是从指定的日志文件载入。

二、自动化定位版本

Git的二分查找命令支持run子命令,可以运行一个自动化测试脚本,实现自动的二分法查找。

脚本退出码及版本测试结果对应表如下:

退出码 测试结果
0 好版本
1至127(除125) 坏版本
125 测试版本被跳过

假如知道当前所在分支为一个“坏版本”且tag为A的版本为好版本,则先标记起始及结束版本,执行如下命令:

git bisect start master A

执行自动测试脚本,如下:

git bisect run sh good-or-bad.sh

找到定位到的“坏版本”:

git describe refs/bisect/bad