← 上一章:工作區、暫存區與儲存庫 下一章:【狀況題】如何在 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
越新的資訊會在越上面,從這段訊息,大概可以看得出來:
- Commit 作者是誰。(人是誰殺的)
- 什麼時候 Commit 的。(什麼時候殺的)
- 每次的 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」選項就可以看到所有的歷史紀錄:
我想這應該沒什麼好爭論的,使用圖形介面工具,比在終端機視窗使用 Git 指令清楚多了。所以我常會建議初學者(甚至我自己也是),在觀看紀錄的時候,使用圖形介面工具不僅可少打一些字,而且可以顯示更完整的資訊。
再更仔細的研究一下畫面上的資訊:
- 越新的 Commit 會在越上面。
- 在 Description 欄位除了 Commit 訊息之外,還有一個「master」字樣,這是在 Git 裡預設的分支的名字。關於分支會在「使用分支」章節介紹。
- 在這個區塊,這兩次的 Commit 分別在畫面上是以藍色的實心小圈圈呈現,而空心的小圈圈則是表示
HEAD
的位置。HEAD
通常是指向現在這個分支的最前端的地方,更多關於 HEAD 的說明,可參閱「【冷知識】HEAD 是什麼東西?」章節說明。 - 在 Commit 欄位,可以看到
cef6e40
跟cc797cd
,它其實就是cef6e4017eb1a16a7bb3434f12d9008ff83a821a
跟cc797cdb7c7a337824a25075e0dbe0bc7c703a1e
這兩串文字的「縮寫」。對 Git 來說,其實只要這 6 ~ 8 碼的 Commit 資訊,就足以識別了。那如果這個前 6 ~ 8 碼的縮寫真的重複了怎麼辦?別擔心,Git 會很貼心的告訴你「這個資訊沒辦法識別,請再提供更多位數的資訊以供識別」。
狀況題
以下是一些在使用 Git 查詢歷史紀錄的時候可能遇到的問題,這是目前的歷史紀錄:
【狀況題】我想要找某個人或某些人的 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」功能,即可進入搜尋畫面:
然後便可輸入關鍵字或是條件,例如我想找作者叫「Sherly」的人:
很快就可以查到想要查詢的資料了,相當方便吧!
Comments