← 上一章:工作區、暫存區與儲存庫 下一章:【狀況題】如何在 Git 裡刪除檔案或變更檔名? →


檢視紀錄

接下來,我們來看看怎麼檢視之前 Commit 的紀錄吧。

因為目前我們只有一次的 Commit,所以這裡我很快的再新增另一次的 Commit,順便也複習一下上一章介紹的內容:

$ touch index.html                      # 建立檔案 index.html
$ git add index.html                    # 把 index.html 加至暫存區
$ git commit -m "create index page"     # 進行 Commit

使用 Git 指令

檢視 Git 紀錄,使用的是 git log 指令。這個指令執行後的結果看起來會像這樣:

$ git log
commit cef6e4017eb1a16a7bb3434f12d9008ff83a821a (HEAD -> master)
Author: Eddie Kao <[email protected]>
Date:   Wed Aug 2 03:02:37 2017 +0800

    create index page

commit cc797cdb7c7a337824a25075e0dbe0bc7c703a1e
Author: Eddie Kao <[email protected]>
Date:   Sun Jul 30 05:04:05 2017 +0800

    init commit

越新的資訊會在越上面,從這段訊息,大概可以看得出來:

  1. Commit 作者是誰。(人是誰殺的)
  2. 什麼時候 Commit 的。(什麼時候殺的)
  3. 每次的 Commit 大概做了些什麼事。(怎麼殺的)

至於那個看起來像亂碼的 cef6e4017eb1a16a7bb3434f12d9008ff83a821a,其實是有著特殊用意的。在 Git 裡每串這種看起來像亂碼的文字,都是使用 SHA-1(Secure Hash Algorithm 1)演算法所計算的結果。計算的方式會在「【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的?」章節有更詳細的介紹,現在可先把它當做一種重複機率非常非常非~~~~常低的一段文字(比連中好幾期樂透的機率還低)。Git 使用這樣的字串做為識別。每個 Commit 都有一個這樣的值,你可把它想像成是每個 Commit 的身份證字號一樣,不會重複。

注意!

這邊用身份證字號舉例其實不太精準,因為在台灣身份證字號是會重複的,而且重複的機會還滿高的,遠比 SHA-1 重複的機會高得多。

在使用 git log 指令時,如果加上額外參數,可以看到不一樣的輸出格式,例如可加上 --oneline--graph

$ git log --oneline --graph
* cef6e40 create index page
* cc797cd init commit

輸出的結果就會更為精簡,可以一次看到更多的 Commit。

使用圖形介面(推薦!)

如果使用 SourceTree,點擊左邊的「History」選項就可以看到所有的歷史紀錄:

image

我想這應該沒什麼好爭論的,使用圖形介面工具,比在終端機視窗使用 Git 指令清楚多了。所以我常會建議初學者(甚至我自己也是),在觀看紀錄的時候,使用圖形介面工具不僅可少打一些字,而且可以顯示更完整的資訊。

再更仔細的研究一下畫面上的資訊:

image

  1. 越新的 Commit 會在越上面。
  2. 在 Description 欄位除了 Commit 訊息之外,還有一個「master」字樣,這是在 Git 裡預設的分支的名字。關於分支會在「使用分支」章節介紹。
  3. 在這個區塊,這兩次的 Commit 分別在畫面上是以藍色的實心小圈圈呈現,而空心的小圈圈則是表示 HEAD 的位置。HEAD 通常是指向現在這個分支的最前端的地方,更多關於 HEAD 的說明,可參閱「【冷知識】HEAD 是什麼東西?」章節說明。
  4. 在 Commit 欄位,可以看到 cef6e40cc797cd,它其實就是 cef6e4017eb1a16a7bb3434f12d9008ff83a821acc797cdb7c7a337824a25075e0dbe0bc7c703a1e 這兩串文字的「縮寫」。對 Git 來說,其實只要這 6 ~ 8 碼的 Commit 資訊,就足以識別了。那如果這個前 6 ~ 8 碼的縮寫真的重複了怎麼辦?別擔心,Git 會很貼心的告訴你「這個資訊沒辦法識別,請再提供更多位數的資訊以供識別」。

狀況題

以下是一些在使用 Git 查詢歷史紀錄的時候可能遇到的問題,這是目前的歷史紀錄:

image

【狀況題】我想要找某個人或某些人的 Commit…

例如我只想找一位叫做 Sherly 的作者的 Commit:

$ git log --oneline --author="Sherly"
930feb3 add pig
51d54ff add lion and tiger

只會查到這兩個。同時可以再用 |(中文「或者」的意思) 來查詢「Sherly 以及 Eddie 這兩個人的 Commit 紀錄」:

$ git log --oneline --author="Sherly\|Eddie"

【狀況題】我想要找 Commit 訊息裡面有在罵髒話的…

使用 --grep 參數,可以從 Commit 訊息裡面搜尋符合字樣的內容:

$ git log --oneline --grep="WTF"

還好目前看起來沒有!

【狀況題】我要怎麼找到哪些 Commit 的檔案內容有提到 “Ruby” 這個字?

使用 -S 參數,可以搜尋在所有 Commit 的檔案中,哪些符合特定條件的:

$ git log -S "Ruby"

【狀況題】主管:「你再混嘛!我看看你今天早上 Commit 了什麼!」

在查歷史資料的時候,可以搭配 --since--until 參數查詢:

$ git log --oneline --since="9am" --until="12am"

這樣就可以找出「今天早上 9 點到 12 點之間所有的 Commit」。還可以再加一個 after

$ git log --oneline --since="9am" --until="12am" --after="2017-01"

這樣可以找到「從 2017 年 1 月之後,每天早上 9 點到 12 點的 Commit」

以上這些指令,在 SourceTree 都可以很方便的完成。點選左邊的側邊選單,在 WORKSPACE 選單下有個「Search」功能,即可進入搜尋畫面:

image

然後便可輸入關鍵字或是條件,例如我想找作者叫「Sherly」的人:

image

很快就可以查到想要查詢的資料了,相當方便吧!


← 上一章:工作區、暫存區與儲存庫 下一章:【狀況題】如何在 Git 裡刪除檔案或變更檔名? →

Comments