[教學] git-14 特定檔案紀錄 - 討論區

[教學] git-14 特定檔案紀錄

文章瀏覽次數 1578 文章回覆數 0

特種兵

特種兵圖像(預設)

2020-03-07 16:49:50

From:1.161.134.251

與該檔案相關的紀錄

之前我們介紹過 git log 指令來查看我們提交的 log 紀錄。

但我們如果是想觀察跟某個檔案有關的所有 log 提交紀錄時該怎麼辦?

那就加上該檔案的檔名作為參數,即可列出與該檔案相關的紀錄。

$ git log hello.txt                                                             
 commit d321f73c6d05ab8b96c5c7f4abb75099d55b823e                                 
 Author: Logo Kuo <logo@forblind.org.tw>                                         
 Date:   Sun Feb 23 22:30:28 2020 +0800                                          

     將 welcome.txt 更名為 hello.txt 並加入 test.py 檔案                         

當然還是可以搭配之前提的 --oneline 等參數使用。

該提交的實際行為

可是光看到這些紀錄的提交訊息,有時還是無法確定當時到底對他做了什麼事情,

像有時候程式中加了某個功能,在提交紀錄時可以看到說明,但實際到底加了什麼內容還是不清楚,

可以加上 -p 參數,先來加一筆修改紀錄:

# 在 hello.txt 檔案最後加一行字,該行內容為測試兩個字
$ echo '測試' >> hello.txt                                                      
# 列出檔案內容
$ cat hello.txt                                                                 
 你好                                                                            
 我很好                                                                          
 測試                                                                            
# 存到暫存區並提交
$ git add .                                                                     
$ git commit -m '在 hello.txt 最後加了一行字'                                   
 [master b7df611] 在 hello.txt 最後加了一行字                                    
  1 file changed, 1 insertion(+)                                                 

接著看一下詳細 log

$ git log -p hello.txt
 commit b7df611332a5a7f44b667c24e40da1bcc92c00c5                                 
 Author: Logo Kuo <logo@forblind.org.tw>                                         
 Date:   Fri Feb 28 21:31:22 2020 +0800                                          

     在 hello.txt 最後加了一行字                                                 

 diff --git a/hello.txt b/hello.txt                                              
 index 65c6e5c..68032d3 100644                                                   
 --- a/hello.txt                                                                 
 +++ b/hello.txt                                                                 
 @@ -1,2 +1,3 @@                                                                 
  你好                                                                           
  我很好                                                                         
 +測試                                                                           

 commit d321f73c6d05ab8b96c5c7f4abb75099d55b823e                                 
 Author: Logo Kuo <logo@forblind.org.tw>                                         
 Date:   Sun Feb 23 22:30:28 2020 +0800                                          

     將 welcome.txt 更名為 hello.txt 並加入 test.py 檔案                         

diff --git a/hello.txt b/hello.txt                                              
 new file mode 100644                                                            
 index 0000000..65c6e5c                                                          
 --- /dev/null                                                                   
 +++ b/hello.txt                                                                 
 @@ -0,0 +1,2 @@                                                                 
 +你好                                                                           
 +我很好 

雖然格式與內容看起來有點複雜,但大致還是可以看出:

  • 第一筆紀錄的檔案內容 測試 前面有個加號,就表示是該次新增的內容,減號就是刪除的內容
  • 第二筆紀錄是改名,所以有 new file 的標示,內容那兩行就都算是新增出來的,應該還記得更名就是刪除再新增吧

完整內容

上面的紀錄看起來是該提交所做的事情,但我們如果是想看某個檔案的全部內容狀況呢?

例如你發現 hello.txt 的第三行是有問題的,想知道是誰在什麼時候加了這一行,就可以列出檔案完整資訊來觀察,

指令是 blame 後面加檔名:

$ git blame hello.txt                                                           
 ^0fdb52f welcome.txt (Logo Kuo 2020-02-16 13:01:25 +0800 1) 你好                
 ^0fdb52f welcome.txt (Logo Kuo 2020-02-16 13:01:25 +0800 2) 我很好              
 b7df6113 hello.txt   (Logo Kuo 2020-02-28 21:31:22 +0800 3) 測試                

以上的資訊非常清楚,包括 hello.txt 還沒被改名時的紀錄都有,

資訊大致上包括:

  • 提交的版本號
  • 檔名
  • 提交者
  • 時間
  • 檔案內的行號
  • 該行的內容

如果檔案很大,只想看某個區間的紀錄,可以使用 -L 參數並指定行號,注意是大寫字母。

$ git blame -L 2,7 test.py                                                      
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 2)         '''這是一個銀行類別,裡 
 面有存款金額與存錢、提錢等功能'''                                               
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 3)                                 
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 4) class Riches:                   
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 5)         ''' 這是一個財富類別    
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 6)         裡面有兩個屬性,分別是 m
 oney 現金與 mybank 銀行存款                                                     
 d321f73c (Logo Kuo 2020-02-23 22:30:28 +0800 7)         '''                     

以上顯示的是該檔案 test.py 第 2 到 7 行的紀錄。

有時一個專案很久沒碰了,想要繼續更新或新增功能時,可以利用上面這些指令幫你回憶一下上次做了什麼。

當然系統被改壞了用來抓兇手也是很普遍的用法。

所以在使用 log 時可以針對某些條件來調出紀錄,也可以針對某個檔案讀取紀錄,

對於該 log 做了什麼事也能看到,這樣讓我們可以更靈活的利用 git 管理檔案。

補充

以上這些輸出的資訊會比較多,在超過一頁資訊時 git bash 的提示符號會變成 :

此時表示進入了瀏覽狀態,常用指令如下:

  • 空白鍵:下一頁
  • p 上一頁
  • q 離開瀏覽狀態回到 $

而看到提示符號 (END) 就表示看完囉。

如果覺得這樣瀏覽還是不方便,或者有編輯的需求,那就在原本的指令後面加上 > 檔名 把資訊導入某個檔案再使用瀏覽器開啟該檔案進行瀏覽或編輯。

$ git blame test.py > look.txt                                                  

還記得之前使用 echo 來把內容加到檔案中吧,就是利用這個原理。

再次提醒,一個大於會把後面的檔案內容清空,然後再新增資訊進去,而兩個大於是把資訊添加在該檔案後面,

而這兩種方式當沒有指定的檔案時都會自行建立一個並添加內容。