一篇文章学会使用gitk 排查git问题就靠它了
现在软件开发已经离不开版本控制系统。版本控制系统不仅能保留每个文件所有版本的历史信息,还能够方便查找。另外,也能够让团队协作不受空间和时间的限制。
在DevOps端到端的流程管控中,我们需要知道每个阶段的具体详细信息。在开发阶段,版本控制系统能够告诉我们某个特定版本的源代码和配置文件是什么?任意两个版本之间的差异是什么?这个变更是什么时间,由谁修改的,为什么要修改?因此我们很容易知道软件的开发过程。
Git是一个开源的分布式版本控制系统,也是目前用的最多的版本控制系统。因此在平时的开发过程中也难免会遇到代码提交的问题,通过命令分析很不方便,这里介绍一个排查Git问题的工具gitk。
gitk是一个非常强大的图形化工具,现在安装git会自带gitk的应用程序,在代码库的根目录下直接输入gitk会打开这个界面,如下:
gitk的主界面主要包含5个部分:
1、主菜单栏显示区。
2、提交信息显示区,显示提交的基本信息,包括节点树、message、提交人和提交时间。
3、查询条件检索区,根据检索条件查找的窗口。
4、具体内容显示区,显示commit的变更记录或两个commit的diff内容。
5、文件列表显示区,显示的commit的文件列表或两个commit的diff文件列表。
下面将这五个部分详细介绍一下:
第一部分:主菜单栏显示区。
1、File
Update(F5):更新。如果在另一个屏幕上的命令行上做了什么,并希望将这些更改反映在gitk中。该操作更新引用并显示新值,同时仍显示旧值。它在执行了像rebase这样的操作之后最有用,因为可以比较前一个分支头和新的分支头。
Reload(Shift+F5): 完全刷新,扔掉以前显示的所有内容。
Reread/List references: references包括tags和branches(也可能是远程分支),可以reread、List并且可以选择任意一个显示。如下图:
2、Edit
Preferences:gitk的个人设置窗口。主要是最大显示行数,宽度,空格个数,颜色设置和字体设置。如下图。
3、View
这个菜单主要是设置快速查询视图。
通过New view...新建视图,如下图,可以选填一些查询条件,保存后直接点击这个View1 就能查看这个视图的提交记录。下面介绍一下查询条件的设置。
①references(space separated list):可以指定一个refs,可以是tag,branch,下面还可以选择All xxx。
②commit info(regular expressions):可以指定提交信息的Author、Committer、Message作为查询条件。
③Changes to Files:可以指定修改的文件内容作为查询条件,可以是固定的文本,也可以是正则表达式。
④Commit Date:可以指定时间范围作为查询条件。
⑤Limit and/or skip a number of revision:可以指定只显示revision数量,或者可以从头跳过一定数量的revisions,值为正整数。
⑥miscellaneous options:其他选项,比如:按时间排序,标记分支侧,限制只显示第一个parent,简单历史显示。还可以使用其他git log参数。
4、Help
①About gitk:gitk简介
②Key bindings:快捷键
第二部分:提交信息显示区,显示提交的基本信息,包括节点树、message、提交人和提交时间。
1、当切换不同的commit时,底层的SHA1 ID区域会显示当前commit ID。
SHA1 ID:当选择commit时,该commit的ID会在这里显示。
Row:当前行数/总行数。每个commit一行。
2、颜色和粗体
本地分支名称处于绿色背景中,如diffs分支①
远程分支名称处于混合的橙色/绿色背景中,如remotes/origin/diffs②
当前签出的分支名称以粗体显示,如diffs分支①
标签是在黄色背景上,如2.0.0-beta2③
黄色标志着当前的HEAD,如最顶上的HEAD④
黄色方块标记有“注释”的提交(git-notes)(无)
3、右键菜单
可以根据分支和commit显示不同的菜单,完成不同的操作。
①选中一个分支,比如diffs
check out this branch:检出这个分支,当有多个分支时且当前HEAD不在该分支时可用。
rename this branch:重命名分支。
Remove this branch:移除分支,当有多个分支时且当前HEAD不在该分支时可用。
Copy branch name:拷贝分支名称。
②选中一个commit。
当选中一个commit时,可用的菜单如上图。
***灰色说明***
Diff this->selected、Diff selected ->this、 Make patch这几个需要2个commit进行对比,此时为灰色。Return to mark、Find descendant of this and mark、Compare with marked commit、Diff this->marked commit、Diff marked commit->this 这几个是个marked commit相关,后面会说。
***可用菜单***
Create tag:基于选中的commit创建一个tag。
Copy commit summary:拷贝提交的信息,包括7位commit ID,message和提交日期。
Write commit to file:将该commit的详细信息写到一个文件,包括提交信息和提交内容。
Create new branch:基于该commit创建分支。
Cherry-pick this commit:将该commit应用到当前HEAD分支。
Reset ${BRANCH} branchs to here:将当前分支重置到当前commit。
Mark this commit:标记当前commit,标记后,右键其他commit时跟marked 相关的菜单可用,只能有一个Marked的commit。
Revert this commit:回退到当前commit。Revert和Reset是不一样的,Revert会生成一个新的commit,但Reset不会。
③基于上面选中且Marked的commit,右键其他任意一个commit,之前灰色的菜单就可用了。
Diff this-> selected:当前commit与选中的commit的diff。diff内容会在区域4中显示,diff文件列表在区域5中显示。
Diff selected-> this :选中的commit与当前commit的diff。diff内容会在区域4中显示,diff文件列表在区域5中显示。
Make patch:将这两个commit的diff生成一个patch文件。
Return to mark: 切换回到marked的commit。
Find descendant of this and mark:查找当前commit和Marked commit共同的后代节点。
Compare with marked commit:当前commit与Marked commit的比较。这里的比较和diff是不一样的。
Diff this->marked commit:当前commit和Marked commit的diff。
Diff marked commit->this:Marked commit与当前commit的diff,与上图相反。
这些是右键菜单的基本功能,可以找一个代码库多练习。第二部分就讲完了。
第三部分:查询条件检索区,根据检索条件查找的窗口。
这个窗口是强大的检索功能,能够根据作者、提交人、变更文件、变更内容等查找commit。当我们在排查问题时,一般不记得具体是在那次提交里做的变更,但我们可能会记得是哪个文件,是谁提交的,此时我们就可以通过检索查找commit,对于根据变更文件查找,可以配合使用区域5的文件树,效果会更好。
在Find这一行有几个区域:
1、Find ↑↓ commit:当根据检索条件检索出结果后,通过上下箭头切换不同的commit。
2、检索类型列表:
①containing:包含。与后面的范围配合使用。
②touching paths:文件路径。
③adding/removing string:变更内容添加/移除的文本。
④changing lines matching:变更的行数。
3、检索条件,用户输入想要检索的内容。
4、检索方式。
①Exact:精确匹配。
②IgnCase:忽略大小写。
③Regexp:正则表达式匹配。
5、检索范围。
①All fields:所有范围。
②Headline:commit的标题
③Comments:commit的注释
④Author:作者
⑤Committer:提交者
举几个例子:
1、查找标题里包含“request”字符串的commit。检索出的结果标题粗体显示,检索内容黄底标识。通过上下箭头切换。
2、检索变更过pom.xml文件的commit。检索标题粗体显示,通过上下箭头切换。
3、检索变更内容包含“diffutils.version”的commit。
一般常用的就是这几种情况,其他可以自行练习。
第四部分:具体内容显示区,显示commit的变更记录或两个commit的diff内容。
1、在顶部可用的工具说明:
①Search:可以检索当前显示区里的内容。
②Diff:显示两个版本的增删差异。该选项时,最后的Line diff,Markup words,Color words是按不同样式显示diff。
③Old version: 显示旧版本。
④New version:显示新版本。
⑤Lines of context:显示变更区域的上下文显示行数,当需要查看更多内容时,可将值设大。
⑥Ignore space change:是否忽略空格变化。
2、在区域的顶部显示本次提交的信息:
①Author:作者。
②Committer:提交者。
③Parent:当前commit的父节点,当为Merge节点时会显示多个Parent,此处为超链,可跳转到相应的节点。
④Child:当前节点的孩子节点,当从该节点新建不同分支时,会有多个Child,此处为超链,可跳转到相应的节点。
⑤Branches:当前节点最近的HEAD分支,当前签出的分支可跳转。
⑥Follows:当前节点最近的上一个Tag。
⑦Precedes:当前节点最近的下一个Tag,有可能是计划Tag。
⑧Tag:当前为tag时会显示标签信息。
第五部分:文件列表显示区,显示的commit的文件列表或两个commit的diff文件列表。
1、顶部工具说明
①Patch:显示只有变更的文件列表,默认显示此项。
②Tree:显示全部文件树,当想查看其他未变更文件内容时,可选择此项。
2、在文件路径上右键菜单
①Highlight this too:当其他文件已经高亮时,如此也想将变更文件包含该文件的commit也高亮可选择此项。
②Highlight this only:只将变更文件包含该文件的commit高亮显示。
③External diff:使用外部的diff工具查看。
④Blame Parent commit:能够查看该文件的全部内容的变更记录,并能够进行切换。
⑤Copy path:拷贝文件路径。
到此,gitk的使用教程就结束了,希望对工作中使用git的朋友有帮助,觉得有用可以分享给其他朋友,有问题可以联系交流。