前言
我是在去年,也就是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-...,供你慢慢啃。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。