学好Git 拒绝背锅

仓库demo

今天下午同事找到我,说有个锅要我背一下,在vsc的gitLens看到某个文件里面的某行代码是我写的。

但是我有印象这些代码是我复制过来的,大概的场景是这样:

先有个a文件,写了某些代码,后面发现说a文件的某些代码应该归到b文件里面,所以就把这块代码移过去,这时候整个仓库就只有b文件出现这些代码,看文件历史的时候就会觉得这些代码是我写的…

这时候我们就需要找一下这些代码是从哪里copy过来的

git blame
git blame [<options>] <file> 可以查看某文件的每一行是什么时候谁修改的,类似 vsc的gitLens FILE HISTORY
这个命令可以加个 -C 的选项,Git 会分析你正在标注的文件, 并且尝试找出文件中从别的地方复制过来的代码片段的原始出处。

不过这个功能我没试过是有用的…比如这次就没有提示说这行代码是从哪里复制过来的

这时候我们就要用git的另一个搜索工具 git log

git log -S Text可以查看Text出现在哪些commit中,这就很有用了。

直接 git log -S "userName = 'jsonz1993'"查看发现在之前a同事提交过

1
2
3
4
5
6
7
8
9
10
11
12
13
git log -S "userName = 'jsonz1993'"

commit ac9390164c24e4abc60f65a5604a3e2cb1f3ad66 (HEAD -> master)
Author: jsonz1993 <jsonz@qq.com>
Date: Thu Apr 9 17:08:16 2020 +0800

把user信息都归到一起

commit ee7f357fa8a9b8eefc99e6f446bd983b7020ba34
Author: a同事 <jsonz@qq.com>
Date: Thu Apr 9 17:06:08 2020 +0800

添加userName

切换到 ee7f357f 再查看文件历史,确保没有丢错锅

1
2
3
git checkout ee7f357f; git blame a.js

^ee7f357 (a同事 2020-04-09 17:06:08 +0800 1) export const userName = 'jsonz1993'

查看之后发现这个文件只有a同事改过…成功甩锅