使用Git进行问题定位以及查找代码-Git详解(11)

概要

  • 使用git blame定位代码责任人
  • 使用git bisect查找问题引入版本
  • 使用grep查找指定内容的位置
  • 使用git log查找指定内容的历史记录

使用git blame定位代码责任人

git blame 可以定位每行的修改人,如下定位到1623695606这个用户的责任

1
2
3
4
5
6
7
8
9
$ git blame blame.c
^af6a144 (monk 2017-07-14 13:54:45 +0800 1) int min(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }
^af6a144 (monk 2017-07-14 13:54:45 +0800 4)
^af6a144 (monk 2017-07-14 13:54:45 +0800 5) int max(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 6) return 0;
^af6a144 (monk 2017-07-14 13:54:45 +0800 7) }
^af6a144 (monk 2017-07-14 13:54:45 +0800 8)

限制定位的代码行数

1
2
3
4
$ git blame -L 1,3 blame.c
^af6a144 (monk 2017-07-14 13:54:45 +0800 1) int min(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }

从第二行开始,2行

1
2
3
$ git blame -L 2,+2 blame.c
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }

使用git bisect查找问题引入版本

git blame 可以定位每行的修改人,如下定位到1623695606这个用户的责任

1
2
3
4
5
6
7
8
9
$ git blame blame.c
^af6a144 (monk 2017-07-14 13:54:45 +0800 1) int min(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }
^af6a144 (monk 2017-07-14 13:54:45 +0800 4)
^af6a144 (monk 2017-07-14 13:54:45 +0800 5) int max(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 6) return 0;
^af6a144 (monk 2017-07-14 13:54:45 +0800 7) }
^af6a144 (monk 2017-07-14 13:54:45 +0800 8)

限制定位的代码行数

1
2
3
4
$ git blame -L 1,3 blame.c
^af6a144 (monk 2017-07-14 13:54:45 +0800 1) int min(){
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }

从第二行开始,2行

1
2
3
$ git blame -L 2,+2 blame.c
120408ef (1623695606 2017-07-14 13:56:00 +0800 2) return 100;
^af6a144 (monk 2017-07-14 13:54:45 +0800 3) }

使用grep查找指定内容的位置

1
2
3
$ git grep int
blame.c:int min(){
blame.c:int max(){

-n 显示行号
–count 字符串出现次数
-p 会显示包含字串的方法名
-e 使用正则表达式

1
2
3
4
5
6
$ git grep -n -p return blame.c
blame.c=1=int min(){
blame.c:2: return 100;
blame.c=5=int max(){
blame.c:6: return 0;
blame.c:8:return 11;

使用正则表达式

1
2
$ git grep -e 'r[0]'
blame.c: int r0 =100;

组合

1
2
3
4
$ git grep -e 'lisi' --or -e 'wangwu' #or可省略
git_grep.txt:zhangsan lisi
git_grep.txt:wangwu
git_grep.txt:zhangsan wangwu

复杂组合

1
2
3
$ git grep -e 'zhangsan' --and \( -e 'wangwu' --or --not -e 'lisi' \)
blame.c:zhangsan
blame.c:zhangsan lisi wangwu

使用git log查找指定内容的历史记录

查看在哪个版本首次出现

1
2
$ git log -SLOG_BUF_MAX --oneline
432b865 first commit

查找函数的变更历史

1
$ git log -L :git_default_bound:git_log.c

当有些方法,git识别不出

1
$ git log -L '/unsigned long git_deflate_bound/',/^}/:git_log.c

查看指定行的历史记录

1
$ git log -L 2,5:git_log.c