阅读开源代码小技巧:Git历史记录快速翻页式签出

举报
云上有未来 发表于 2019/08/23 14:33:17 2019/08/23
【摘要】 通过阅读源码来学习开源项目是最直接也最有效的方法。而想要了解一个开源项目,最好是从第一个commit开始看起,特别是第一个最小可用版本发布前的commits,通过阅读对每一次commit提交源码,能够最直接的理解作者的设计思路和开发过程中的思考。

通过阅读源码来学习开源项目是最直接也最有效的方法。而想要了解一个开源项目,最好是从第一个commit开始看起,特别是第一个最小可用版本发布前的commits,通过阅读对每一次commit提交源码,能够最直接的理解作者的设计思路和开发过程中的思考。

在GitHub的repository页面上可以很方便的看到所有历史记录及其演进。不过,使用IDE或有跳转功能的编辑器来阅读会更方便。这就需要我们将代码仓Clone到本地。

Clone下来的开源Git仓,想要签出第一次commit也简单:通过 git log --reverse 倒序展示log,排在第一个的即是第一次commit,拷贝commit sha值,然后 git checkout commit_sha 便可以签出该commit的代码。

当我们想继续跟着作者的节奏看接来下开发的内容,便需要再次show log,并找出下一次的commit sha值,如果commit记录很多,找起来就不那么容易了。因此我在看git代码历史的时候想,能不能将git commits历史记录当成像网站页面一样可以分页查看呢,通过简单的上翻下翻命令来checkout到各commit节点的代码。

其实也不难,无非是用管道将上面提到的命令串起来,写成shell可执行文件放到git安装的bin目录即可。签出第一次Commit节点代码的shell脚本如下:(通过 git log --reverse --pretty=%H 可以将log记录倒序并只显示sha值,然后通过args获取管道输出checkout。)

#!/bin/sh

first() {
	branch=refs/heads/master
	git log --reverse --pretty=%H $branch | head -1 | xargs git checkout 
}
first

将它存为 git-first 可执行文件,放到git安装的bin目录(Linux、Mac或Windows皆可)。在git仓中执行 git first 即可checkout出第一次commit节点的代码。

签出当前commit记录的下一个节点代码要稍微复杂些,不过也就是多了些命令的组合,stackoverflow搜一下就能找到。通过 git rev-parse HEAD 可获取当前工作区代码的commit sha值,然后用 grep -A 找出倒序log后当前commit sha值的后一条记录,得到sha值后进行Checkout操作。git-next 的脚本如下:

# git-next

next() {
	branch=refs/heads/master
	git log --reverse --pretty=%H $branch | grep -A 1 $(git rev-parse HEAD) | tail -1 | xargs git checkout
}
next

同样的,签出最后一条记录(git-last)和上一条记录(git-prev)也可以通过命令组合来实现。我还增加可选参数,可以一次上翻/下翻 n条commit。四个脚本的源码放在了GitHub Gist上。

在查看git仓库源码时便可以通过 git nextgit prev 来轻松逐个commit进行checkout了。也可以通过 git next 5 来签出当前commit依次往后第5条commit的代码。 通过git firstgit last 来签出第一条commit及最后一条节点的代码。

于是,拿到一份开源代码后,我便首先通过 git first 签出第一次commit的代码,然后通过 git next 逐个commit进行阅读。为了快速了解commit之间的差异,可以通过执行 git diff HEAD^ HEAD 来了解当前commit改了哪些内容。(嫌每次执行diff命令太长,可以设置alias: git config --global alias.df 'diff HEAD^ HEAD'。这样,每次仅需执行 git df 便可以快速浏览差异了。)

在调试脚本时发现一个问题,shell中的函数如果写上function在Ubuntu等Linux上反倒执行会报错。比如first() {...} 写成 function first() {...}. 执行时会报 syntax error: "(" unexpected. 的错误。上网查了一下,了解到在某些Linux发行版上 sh 指向 dash,不识别 function标志符。 解决办法是要么将脚本的执行器改成 bash ,或直接将 function 去掉,这也是能兼容多种shell的最好方式。

最后再附一遍脚本地址,如果你觉得有用,请加star: https://gist.github.com/hutusi/e4f32e2bcd8d53ec86de8254ab0d5127

本文作者胡智勇,转载自https://hutusi.com/blog/2019/08/18/git-paging ,如需转载,请联系作者获取授权。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。