Git筆記(6) 查看提交歷史


1. 提交歷史

在提交了若干更新,又或者克隆了某個項目以後
也許想回顧下提交歷史git

完成這個任務最簡單而又有效的工具是 git log 命令。github

使用 「simplegit」 項目做爲示例
首先克隆該項目:web

$ git clone https://github.com/schacon/simplegit-progit

2. 查看

在此項目中運行 git log 命令時,能夠看到下面的輸出:shell

在這裏插入圖片描述
默認狀況下,git log按時間前後順序 列出全部的提交,最近的更新排在最上面
列出了每一個提交的 SHA-1 校驗和、做者名字和電子郵件地址、提交時間以及提交說明bash


3. 經常使用選項

選項 說明
-p 按補丁格式顯示每一個提交引入的差別
–stat 顯示每次提交的文件修改統計信息
–shortstat 只顯示 --stat 中最後的行數修改添加移除統計
–name-only 僅在提交信息後顯示已修改的文件清單
–name-status 顯示新增、修改、刪除的文件清單
–abbrev-commit 僅顯示 SHA-1 校驗和全部 40 個字符中的前幾個字符
–relative-date 使用較短的相對時間而不是完整格式顯示日期(好比,「2 weeks ago」)
–graph 在日誌旁以 ASCII 圖形顯示分支與合併歷史
–pretty 使用其餘格式顯示歷史提交信息。選項包括 oneline,short,full,fuller 和 format

3.1. 差別

其中一個比較有用的選項是 -p,它會顯示每次提交所引入的差別
與此同時,也能夠使用 -2 選項來僅顯示最近的兩次提交app

$ git log -p -2

在這裏插入圖片描述
該選項除了顯示基本信息以外,還附帶了每次 commit 的變化svg

適用於當進行代碼審查
或者快速瀏覽某個搭檔提交所帶來的變化的時候函數


3.2. 總結

能夠使用 --stat 選項,查看每次提交的簡略統計信息:工具

$ git log --stat

在這裏插入圖片描述
在每次提交的下面列出全部被修改過的文件、有多少文件被修改了測試


3.3. 自定義格式

能夠使用 --pretty選項,自定義格式的方式展現提交歷史
這個選項有一些內建的 子選項


3.3.1. 整合一行

好比 oneline 會將每一個提交 放在一行顯示,在瀏覽大量的提交時很是有用

在這裏插入圖片描述


3.3.2. 詳盡程度

另外還有 shortfullfuller 選項,它們展現信息的 格式詳盡程度 不一:

在這裏插入圖片描述


3.3.3. 定製格式

還有 format,能夠 定製要顯示的記錄格式
這樣的輸出對後期提取分析格外有用

$ git log --pretty=format:"%h - %an, %ar : %s"

在這裏插入圖片描述
下表列出了經常使用的格式佔位符寫法及其表明的意義:

選項 說明
%H 提交的完整哈希值
%h 提交的簡寫哈希值
%T 樹的完整哈希值
%t 樹的簡寫哈希值
%P 父提交的完整哈希值
%p 父提交的簡寫哈希值
%an 做者名字
%ae 做者的電子郵件地址
%ad 做者修訂日期(能夠用 --date= 選項定製格式)
%ar 做者修訂日期,按多久之前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期(距今多長時間)
%s 提交說明

做者:實際做出修改的人
提交者:最後將此工做成果提交到倉庫的人

因此,當你爲某個項目發佈補丁,而後某個核心成員將你的補丁併入項目時
你就是做者,而那個核心成員就是提交者


3.4. 形象展現

--graph 選項添加了一些 ASCII 字符串來形象地展現分支、合併歷史
onelineformat 與另外一個 log 選項 --graph 結合使用時尤爲有用:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

3.5. 限制輸出長度

Git 默認會將全部的輸出傳送到 分頁程序
因此一次只會看到一頁的內容

除了定製輸出格式的選項以外,
git log 還有許多很是實用的限制輸出長度的選項,也就是隻輸出一部分的提交

選項 說明
-(n) 僅顯示最近的 n 條提交
–since, --after 僅顯示指定時間以後的提交
–until, --before 僅顯示指定時間以前的提交
–author 僅顯示做者匹配指定字符串的提交
–committer 僅顯示提交者匹配指定字符串的提交
–grep 僅顯示提交說明中包含指定字符串的提交
-S 僅顯示添加或刪除內容匹配指定字符串的提交

3.5.1. 時間

相似 --since--until 這種按照時間做限制的選項頗有用
例如,下面的命令會列出最近兩週的全部提交:

$ git log --since=2.weeks

該命令可用的格式十分豐富——能夠是相似 「2014-11-10」 的具體的某一天
也能夠是相似 「2 years 1 day 3 minutes ago」 的相對日期


3.5.2. 過濾

還能夠過濾出匹配指定條件的提交
--author 選項顯示指定做者的提交
--grep 選項搜索提交說明中的關鍵字

請注意,若是要 同時對做者和提交說明進行過濾 就必須添加 –all-match 選項
不然該命令將會匹配知足其中任意一個條件的提交

另外一個很是有用的過濾器是 -S
它接受一個字符串參數,而且只會顯示那些添加或刪除了該字符串的提交

假設想找出添加或刪除了對某一個特定函數的引用的提交,能夠調用:

$ git log -Sfunction_name

3.5.3. 路徑

若是隻關心某些文件或者目錄的歷史提交
能夠在 git log 選項的最後指定它們的路徑(path)

在這裏插入圖片描述

由於是放在最後位置上的選項
因此用兩個短劃線(–)隔開以前的選項和後面限定的路徑名


3.5.4. 實例

若是要查看 2008 年 10 月期間 Git 源代碼倉庫中
由 Junio Hamano 提交的修改了測試文件而且還沒有合併的提交,能夠使用下面的命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

在近 40000 條提交中,上面的輸出僅列出了符合條件的 6 條記錄


參考: git

以上內容,均根據git官網介紹刪減、添加和修改組成


相關推薦:

Git筆記(5) 狀態記錄
Git筆記(4) 獲取倉庫
Git筆記(3) 安裝配置
Git筆記(2) 入門認知
Git筆記(1) 版本控制


謝謝