VSCode裏有個叫Git Blame的插件,當你的光標放在某行代碼上時,左下角會顯示該行代碼是由誰貢獻的和貢獻時間。
當然這個功能Git本身也是包含的,如果你要查看文件的每個部分是誰修改的,直接在Git bash裏輸入:git blame [filename]
會顯示整個文件的每一行的詳細修改信息:包括SHA-1串、日期和作者。
例如下邊內容:
[Live@Live-PC][ /fortunes/data ] (master)
$ git blame song100 # 輸入的命令在這裏哦
15108174 (Duke 2016-11-14 20:59:20 +0800 1) 題目:《塞上》
15108174 (Duke 2016-11-14 20:59:20 +0800 2) 作者:柳開(946-999)
15108174 (Duke 2016-11-14 20:59:20 +0800 3) 鳴[骨交]直上一千尺,天靜無風聲更幹。
15108174 (Duke 2016-11-14 20:59:20 +0800 4) 碧眼胡兒三百騎,盡提金勒向雲看。
15108174 (Duke 2016-11-14 20:59:20 +0800 5) %
15108174 (Duke 2016-11-14 20:59:20 +0800 6) 題目:《寒食》
15108174 (Duke 2016-11-14 20:59:20 +0800 7) 作者:王禹偁(954-1001)
15108174 (Duke 2016-11-14 20:59:20 +0800 8) 今年寒食在商山,山裏風光亦可憐:
15108174 (Duke 2016-11-14 20:59:20 +0800 9) 稚子就花拈蛺蝶,人家依樹系鞦韆。
15108174 (Duke 2016-11-14 20:59:20 +0800 10) 郊原曉綠初經雨,巷陌春陰乍禁菸。
15108174 (Duke 2016-11-14 20:59:20 +0800 11) 副使官閒莫惆悵,酒錢猶有撰碑錢。
15108174 (Duke 2016-11-14 20:59:20 +0800 12) %
################################### 以下省略 ###################################
1、具體參數
git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
[-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
[--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>..<rev>]
[--] <file>
2、實用參數
-L <start>,<end> | 範圍。<start>爲開始位置,<end>爲結束位置,可以是數字也可以是正則表達式。可以組合顯示。 |
-b | 對邊界提交顯示空白的SHA-1(連續的SHA-1中間顯示空白)。 |
-l | 顯示長SHA-1。 |
--show-stats | 輸出末尾包括其他統計信息。 |
-p | 以專爲機器使用而設計的格式顯示。 |
--score-debug | 包括與文件之間的行移動有關的調試信息和文件內的行移動。 |
-e, --show-email | 顯示郵箱地址。 |
-w | 比較父版本和子版本時,請忽略空格以查找行的來源。 |
例一、查看指定行
查看第 6 行到第 11 行,如下:
[Live@Live-PC][ /fortunes/data ] (master)
$ git blame -L 6,11 song100 # 輸入的命令在這裏哦
15108174 (Duke 2016-11-14 20:59:20 +0800 6) 題目:《寒食》
15108174 (Duke 2016-11-14 20:59:20 +0800 7) 作者:王禹偁(954-1001)
15108174 (Duke 2016-11-14 20:59:20 +0800 8) 今年寒食在商山,山裏風光亦可憐:
15108174 (Duke 2016-11-14 20:59:20 +0800 9) 稚子就花拈蛺蝶,人家依樹系鞦韆。
15108174 (Duke 2016-11-14 20:59:20 +0800 10) 郊原曉綠初經雨,巷陌春陰乍禁菸。
15108174 (Duke 2016-11-14 20:59:20 +0800 11) 副使官閒莫惆悵,酒錢猶有撰碑錢。
例二、從指定行開始顯示多少行
+:爲往下。
- :爲往上。
從第6行開始顯示5行(總共顯示5行):
[Live@Live-PC][ /fortunes/data ] (master)
$ git blame -L 6,+5 song100 # 輸入的命令在這裏哦
15108174 (Duke 2016-11-14 20:59:20 +0800 6) 題目:《寒食》
15108174 (Duke 2016-11-14 20:59:20 +0800 7) 作者:王禹偁(954-1001)
15108174 (Duke 2016-11-14 20:59:20 +0800 8) 今年寒食在商山,山裏風光亦可憐:
15108174 (Duke 2016-11-14 20:59:20 +0800 9) 稚子就花拈蛺蝶,人家依樹系鞦韆。
15108174 (Duke 2016-11-14 20:59:20 +0800 10) 郊原曉綠初經雨,巷陌春陰乍禁菸。
例三、正則表達式
從“int main”開頭的行到“return 0;”結尾的行:
[Live@Live-PC /Hello ] (master)
$ git blame -L '/^int main/','/return 0;$/' Hello.cpp # 輸入的命令在這裏哦
59575828 (Duke 2019-12-25 18:49:55 +0800 3) int main(void)
^3dedd1c (Duke 2019-12-25 18:46:54 +0800 4) {
59575828 (Duke 2019-12-25 18:49:55 +0800 5) printf("Hello World!\n");
^3dedd1c (Duke 2019-12-25 18:46:54 +0800 6) return 0;
提示:我這用Git Bash(git version 2.24.1.windows.2)沒法正常顯示,而使用Cygwin(git version 2.21.0)可正常顯示。
例四、組合
[Live@Live-PC /Hello ] (master)
$ git blame -L '/^int main/,+5' Hello.cpp # 輸入的命令在這裏哦
59575828 (Duke 2019-12-25 18:49:55 +0800 3) int main(void)
^3dedd1c (Duke 2019-12-25 18:46:54 +0800 4) {
59575828 (Duke 2019-12-25 18:49:55 +0800 5) printf("Hello World!\n");
^3dedd1c (Duke 2019-12-25 18:46:54 +0800 6) return 0;
^3dedd1c (Duke 2019-12-25 18:46:54 +0800 7) }
例五、其它方式
git blame v2.6.18.. -- history.cpp # 按Tag查看
git blame --since=3.weeks -- history.cpp # 查看3周前