头图

前言

我是在去年,也就是2020年的时候,进入一家新的公司才学习的 Git。

有时候,我们想要弄清楚某一行代码到底是谁加入进来的,此时我们需要从 git log 中翻找,很是麻烦。

最近才偶然发现 git blame 这个命令,正是解决“找出真凶”这个问题的快速方法。

找出“真凶”

首先,你要需要有一个项目,我最近需要查阅 openjdk 的源码分析一个问题,所以干脆就用它吧。

1.从 Gitee 克隆远程库:

git clone https://gitee.com/mirrors/openjdk.git
openjdk 现在已经在 Github 上面开源了, 下载比以前用 Mercurial 从 openjdk.java.net 下载方便多了

国内 Gitee 上面每天从 GitHub 上同步的 openjdk 镜像,对于国内开发者而言,那就更爽了。

2.进入工作目录

cd openjdk

3.查看标签

git tag

按方向键 或者 可以滚动查看, 输入 q 可以退出当前的查看。

加上 -l 或者 --list 命令使用通配符来过滤 tag。
例如过滤 jdk8 的标签

git tag -l "jdk8*"

4.切出标签

git checkout jdk8-b120

如果需要修改,比如加上个人的注释,需要根据标签 jdk8-b120 新切一个分支 feature-jdk8-b120

git checkout -b feature-jdk8-b120 jdk8-b120

5.查看文件目录

ls -al

列出文件目录:

假如我们要找 java.net.Socket, 那么就应该去 /jdk/src 目录下去寻找。

cd jdk/src


其中有两大类文件夹:

  • 一类表示操作系统命名的文件夹
  • 另一类则是 share 文件夹

进入 share/classes/java/net

cd share/classes/java/net

6.git blame

查看某个文件的每一行内容由谁所写:

git blame 文件名

以查看 Socket.java 为例:

git blame Socket.java

结果形式如图所示:

图中1)、2)这些符号代表文件的第多少行,符号后面就是文件当行的内容。

从上图我们就可以看出,J. Duke 这位同志,在 2007-12-01 00:00:00 这个时间点提交了第 1 行代码。

如果只查文件中某一部分由谁所写:

git blame 文件名 | grep "查找词"

或者:

git blame 文件名 -L a,b

-L 参数表示后面接的是行号(Line)

a,b 代表查询文件的第 a 行到第 b 行之间的文件内容情况。

a, 则代表从第a行到文件结尾

,b 则代表从文件开头到第b行。

6.1 查关键字

假如我们要查 setReceiveBufferSize 这个方法是谁引入进来的,命令则如下所示:

git blame Socket.java | grep "setReceiveBufferSize"

我们发现 setReceiveBufferSize 这个方法是 J. Duke 引入进来的。

6.2 查行数

比如我们知道构造函数 public Socket(Proxy proxy) 是 115 ~ 151 行, 我们可以查看一下哪些人参与编写了该构造函数:

git blame Socket.java -L 115,151

如果你想更加强大,这里有git blame命令的详细文档:https://git-scm.com/docs/git-...,供你慢慢啃。

参考博客

Git系列之git blame:找出真凶

Git: git tag 使用小结(给发布版本打标记,切换并修改某个历史版本)

OpenJDK 源码的目录结构

Gitee下载特定的Tag或分支


极客子羽
16 声望0 粉丝