文件忽略——.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 show
或git 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