在軟體開發過程中,檢視提交歷史記錄是不可或缺的環節。Git Log 作為 Git 的核心功能之一,提供了豐富的選項,方便開發者精確地篩選和定位提交記錄。除了基本的提交訊息、作者和日期等資訊外,Git Log 還支援更進階的篩選條件,例如提交數量限制、日期範圍、作者和提交者篩選、提交訊息篩選以及父提交篩選。這些進階篩選技巧可以幫助開發者快速找到特定提交,提升除錯效率和程式碼理解能力。
提交數量限制
-n
或--max-count
: 僅顯示前 n 個提交。--skip
: 跳過前 n 個提交,然後開始顯示提交。
日期篩選
--before
或--until
: 僅顯示在指定日期之前的提交。--after
或--since
: 僅顯示在指定日期之後的提交。
作者和提交者篩選
--author
: 僅顯示指定作者的提交。--committer
: 僅顯示指定提交者的提交。
提交訊息篩選
--grep
: 僅顯示提交訊息中包含指定正規表示式的提交。--grep-reflog
: 僅顯示 reflog 專案中包含指定正規表示式的提交。
父提交篩選
--min-parents
和--max-parents
: 僅顯示具有指定數量父提交的提交。--merges
: 僅顯示合並提交(具有多個父提交)。--no-merges
: 僅顯示非合並提交(具有單個父提交)。--first-parent
: 僅跟隨合並提交的第一個父提交。
這些進階選項可以幫助您更好地控制 Git Log 的輸出,從而更容易地找到您需要的提交資訊。
範例使用
git log -n 5
: 顯示最近 5 個提交。git log --before="2022-01-01"
: 顯示 2022 年 1 月 1 日之前的所有提交。git log --author="John"
: 顯示 John 作為作者的所有提交。git log --grep="fix"
: 顯示提交訊息中包含「fix」字串的所有提交。
圖表翻譯
graph LR A[Git Log] -->|篩選|> B(日期篩選) A -->|篩選|> C(作者篩選) A -->|篩選|> D(提交訊息篩選) A -->|篩選|> E(父提交篩選) B -->|before|> F[2022-01-01] C -->|author|> G[John] D -->|grep|> H[fix] E -->|min-parents|> I[2]
內容解密
上述範例使用了 Git Log 的進階選項,用於篩選和限制提交顯示。透過使用這些選項,您可以更好地控制 Git Log 的輸出,從而更容易地找到您需要的提交資訊。例如,使用 --before
選項可以篩選出在指定日期之前的提交,而使用 --author
選項可以篩選出指定作者的提交。同時,使用 --grep
選項可以篩選出提交訊息中包含指定字串的提交。這些選項可以組合使用,以實作更複雜的篩選條件。
Git 記錄篩選與檢視
Git 提供了多種方式來篩選和檢視提交記錄,讓開發者能夠快速找到所需的資訊。以下是幾種常用的篩選和檢視選項:
狀態篩選
使用 --diff-filter
選項可以根據檔案的狀態來篩選提交記錄。例如:
git log --diff-filter=A
這將只顯示新增檔案的提交記錄。其他可用的狀態篩選器包括:
A
: 新增檔案C
: 複製檔案D
: 刪除檔案M
: 修改檔案R
: 重新命名檔案T
: 檔案型別變更
正規表示式篩選
Git 支援正規表示式篩選,使用 -i
、-E
、-F
和 --perl-regexp
選項可以控制正規表示式的行為。例如:
git log -i --regexp-ignore-case
這將忽略大小寫差異,進行模糊查詢。
Reflog
使用 git log --walk-reflogs
(或 -g
)可以顯示 reflog,一個記錄您在儲存函式庫中執行的動作的日誌。這可以幫助您從錯誤中還原。
裝飾
使用 git log --decorate
可以顯示指向提交的參照。例如:
git log --decorate
這將顯示提交記錄,並附上指向提交的參照(如 HEAD
、master
等)。
範例
以下是一個範例,展示如何使用上述選項來篩選和檢視提交記錄:
git log --diff-filter=A --decorate --regexp-ignore-case
這將只顯示新增檔案的提交記錄,忽略大小寫差異,並顯示指向提交的參照。
第9章:瀏覽歷史記錄
Git 中的 git log
命令是用來瀏覽提交歷史記錄的。它可以顯示出所有提交的詳細資訊,包括提交的日期、作者、提交的內容等。
日期格式
git log
命令中,可以使用 --date
選項來指定日期的格式。這個選項有多個可選的值,包括:
local
:顯示日期的本地時間格式。relative
:顯示日期相對於現在的時間間隔(例如「2周前」)。default
:顯示日期的預設格式。iso
:顯示日期的ISO 8601格式(例如「2012-12-03 03:18:43 -0500」)。rfc
:顯示日期的RFC 2822格式(例如「Mon, 3 Dec 2012 03:18:43 -0500」)。short
:顯示日期的簡短格式(例如「2012-12-03」)。raw
:顯示日期的原始Unix時間戳(例如「1354522723 -0500」)。
以下是一些使用 --date
選項的例子:
$ git log -1 --format=compact --date=local
6faac5df Mon Dec 3 03:18:43 2012, "working on ch09"
$ git log -1 --format=compact --date=relative
6faac5df 2 weeks ago, "working on ch09"
$ git log -1 --format=compact --date=iso
6faac5df 2012-12-03 03:18:43 -0500, "working on ch09"
$ git log -1 --format=compact --date=rfc
6faac5df Mon, 3 Dec 2012 03:18:43 -0500, "working on ch09"
$ git log -1 --format=compact --date=short
6faac5df 2012-12-03, "working on ch09"
$ git log -1 --format=compact --date=raw
6faac5df 1354522723 -0500, "working on ch09"
內容解密:
在上面的例子中,我們使用了 --format=compact
選項來指定輸出的格式。這個選項會顯示提交的雜湊值、日期、提交者和提交的內容。
--date
選項用來指定日期的格式。不同的格式會顯示不同的日期資訊。
圖表翻譯:
flowchart TD A[Git Log] --> B[Date Format] B --> C{Local} B --> D{Relative} B --> E{Default} B --> F{ISO} B --> G{RFC} B --> H{Short} B --> I{Raw} C --> J[顯示本地時間格式] D --> K[顯示相對於現在的時間間隔] E --> L[顯示預設格式] F --> M[顯示ISO 8601格式] G --> N[顯示RFC 2822格式] H --> O[顯示簡短格式] I --> P[顯示原始Unix時間戳]
在這個圖表中,我們展示了 git log
命令中 --date
選項的不同值和對應的日期格式。
Git 日誌與檔案變更
Git 日誌(git log)是一個強大的工具,能夠顯示 Git 儲存函式庫中所有的提交記錄。除了顯示提交的日期、作者和提交訊息外,Git 還提供了多種選項來自定義日誌輸出的內容和格式。
顯示檔案變更
當您想要了解某個提交中哪些檔案發生了變化,可以使用 --name-status
選項。這個選項會在提交訊息後面列出所有變化的檔案,包括新增、修改和刪除的檔案。
git log --name-status
這個命令會輸出類別似以下的結果:
commit bc0ba0f7
Date: Wed Dec 19 23:31:49 2012 -0500
fix directory; misc diffs with older ghc
M keepmeta.hs
commit f6a96775
Date: Wed Dec 19 21:48:26 2012 -0500
在這個例子中,提交 bc0ba0f7
修改了 keepmeta.hs
檔案。
日期格式
Git 還提供了多種日期格式選項,包括:
local
:本地時間relative
:相對於現在的時間iso
:ISO 8601 格式rfc
:RFC 2822 格式(如同電子郵件)raw
:Git 內部格式
Mermaid 圖表:Git 日誌流程
flowchart TD A[Git Log] --> B[選擇日期格式] B --> C[Local] B --> D[Relative] B --> E[ISO 8601] B --> F[RFC 2822] B --> G[Raw] C --> H[顯示本地時間] D --> I[顯示相對時間] E --> J[顯示 ISO 8601 時間] F --> K[顯示 RFC 2822 時間] G --> L[顯示 Git 內部時間]
圖表翻譯:
這個 Mermaid 圖表展示了 Git 日誌的流程,從選擇日期格式開始,然後根據選擇的格式顯示不同的時間格式。
內容解密:
Git 日誌是一個強大的工具,能夠顯示 Git 儲存函式庫中所有的提交記錄。透過使用 --name-status
選項,可以顯示提交中變化的檔案。日期格式選項可以用來自定義日誌輸出的時間格式。
Git 記錄查詢:瞭解變更內容
Git 的 log
命令提供了多種選項來查詢提交記錄,包括 --name-only
和 --stat
。這些選項可以幫助我們更好地瞭解提交的內容和變更。
--name-only
選項
使用 --name-only
選項,可以列出提交中修改的檔案名稱,而不顯示檔案的變更狀態。
git log --name-only
--stat
選項
--stat
選項則提供了更詳細的資訊,包括檔案的變更統計資料。這個選項會顯示每個檔案的變更行數,並以 ASCII-art 的形式呈現變更的統計資料。
git log --stat
變更狀態程式碼
在提交記錄中,每個檔案名前會有一個單字母程式碼,表示檔案的變更狀態。這些程式碼與 --diff-filter
選項中的程式碼相同,分別代表:
A
: 新增檔案D
: 刪除檔案M
: 修改檔案
範例輸出
以下是使用 --stat
選項查詢提交記錄的範例輸出:
commit ddcd718b
Date: Sun Dec 9 23:47:50 2012 -0500
add KDC default referral feature
Two new realm configuration parameters:
* default_referral_realm (string, none)
* cross_realm_default_referral (boolean, false)
src/include/adm.h | 4 +
src/include/k5-int.h | 2 +
src/kdc/do_tgs_req.c | 52 +----------
src/kdc/extern.h | 4 +
src/kdc/main.c | 12 +
src/lib/kadm5/admin.h | 5 -
src/lib/kadm5/alt_prof.c | 15 +
在這個範例中,我們可以看到提交的日期、描述,以及修改的檔案列表。每個檔案名前的單字母程式碼表示檔案的變更狀態,後面的數字則表示檔案的變更行數。
Git 日誌分析
Git 日誌(git log
)是 Git 中一個強大的工具,允許您檢視提交歷史和變更記錄。透過使用不同的選項和引數,您可以自定義輸出以滿足您的需求。
目錄統計
git log --dirstat
命令提供了目錄變更的統計資訊,顯示了每個目錄中發生變更的百分比。這對於快速瞭解哪些目錄發生了最多變更非常有用。
$ git log --dirstat
這個命令會顯示最近提交的變更統計,包括每個目錄中新增和刪除的行數。
重新命名和複製偵測
Git 預設不會顯示檔案重新命名或複製的資訊,因為這需要更多的計算資源。然而,您可以使用 --find-renames
選項啟用重新命名偵測:
$ git log --find-renames
您還可以指定一個可選的整數 n
作為 --find-renames
的引數,以設定檔案相似度的閾值。例如,--find-renames=50
會將兩個檔案視為重新命名,如果它們的內容至少有 50% 相似。
檔案狀態
git log --name-status
命令顯示提交中每個檔案的狀態,包括新增(A)、刪除(D)和修改(M):
$ git log --name-status
這個命令對於快速瞭解提交中哪些檔案發生了變更非常有用。
範例提交
以下是一個範例提交記錄,顯示了檔案重新命名:
commit 4a933304 (HEAD, master)
Date: Thu Dec 20 01:08:14 2012 -0500
Rename foo; wouldn’t bar be better?
D foo
A bar
在這個範例中,檔案 foo
被刪除(D),而檔案 bar
被新增(A)。如果您使用 --find-renames
選項,Git 會將這兩個操作識別為檔案重新命名。
內容解密
在上面的範例中,git log --dirstat
命令顯示了目錄變更的統計資訊,而 git log --name-status
命令顯示了每個檔案的狀態。透過使用這些命令,您可以快速瞭解提交中哪些檔案發生了變更,以及哪些目錄發生了最多變更。
圖表翻譯
以下是一個 Mermaid 圖表,展示了 Git 提交記錄的流程:
flowchart TD A[Git 提交] --> B[目錄統計] B --> C[檔案狀態] C --> D[重新命名偵測] D --> E[提交記錄]
這個圖表顯示了 Git 提交記錄的流程,從目錄統計到檔案狀態和重新命名偵測,最終到提交記錄。
Git 記錄分析
Git 是一個強大的版本控制系統,提供了多種工具來分析和管理程式碼的變化歷史。其中,git log
命令是用來檢視提交記錄的重要工具。
Rename 和 Copy
當檔案被重新命名或複製時,Git 可以跟蹤這些變化,並提供相關的資訊。使用 git log --name-status -M
命令,可以檢視檔案的重新命名和移動記錄。例如:
$ git log --name-status -M
commit 4a933304 (HEAD, master)
Date: Thu Dec 20 01:08:14 2012 -0500
Rename foo; wouldn’t bar be better?
R100 foo bar
這裡,R100
表示檔案 foo
被重新命名為 bar
。
Follow
如果要跟蹤一個檔案的變化歷史,即使它被重新命名了,也可以使用 git log --follow
命令。例如:
$ git log --follow bar
commit 4a933304 (HEAD, master)
Date: Thu Dec 20 01:08:14 2012 -0500
Rename foo; wouldn’t bar be better?
commit 4e286d96
Date: Tue Dec 18 04:57:55 2012 -0500
Add “foo” in its glorious fooness!
這裡,Git 跟蹤了檔案 bar
的變化歷史,包括它被重新命名為 bar
之前的提交記錄。
Detecting Copies
Git 也可以偵測檔案的複製。使用 git log --find-copies[=n]
命令,可以檢視檔案的複製記錄。例如:
$ git log --find-copies
這裡,Git 會顯示檔案的複製記錄,包括檔案的來源和目的地。
Mailmap
Mailmap 是 Git 中的一個功能,允許使用者將不同的名稱和電子郵件地址對映到同一個身份。這樣可以方便地統一不同提交者的名稱和電子郵件地址。
Mailmap 檔案可以放在工作目錄的根目錄下,名稱為 .mailmap
,或是指定其他名稱並設定 git
的組態選項。
Mailmap 檔案的格式如下:
<desired@email.address> <random@other.address>
這裡,<desired@email.address>
是想要對映到的電子郵件地址,<random@other.address>
是原始的電子郵件地址。
例如:
richard@silverman.com <res@oreilly.com>
這裡,Git 會將提交者的電子郵件地址 res@oreilly.com
對映到 richard@silverman.com
。
Git 版本控制系統:檢視歷史記錄
Git 是一個強大的版本控制系統,允許我們檢視和管理程式碼的歷史記錄。在這篇文章中,我們將探討如何使用 Git 檢視歷史記錄,包括如何使用 git log
命令、如何自定義輸出格式、以及如何使用 “pickaxe” 查詢變更。
Git Log 命令
git log
命令是用於檢視 Git 歷史記錄的基本命令。它可以顯示所有提交的歷史記錄,包括提交者、提交時間、提交訊息等資訊。例如:
git log
這將顯示所有提交的歷史記錄,包括提交者、提交時間、提交訊息等資訊。
自定義輸出格式
我們可以使用 --format
選項自定義 git log
的輸出格式。例如:
git log --format=compact
這將顯示提交的歷史記錄,以 compact 格式顯示提交者、提交時間、提交訊息等資訊。
Pickaxe
Pickaxe 是 Git 中的一個功能,允許我們查詢變更。它可以查詢包含特定字串或正規表示式的提交。例如:
git log -S string
這將顯示包含字串 “string” 的提交歷史記錄。
顯示差異
我們可以使用 git log -p
命令顯示提交的差異。例如:
git log -p
這將顯示提交的差異,包括新增、刪除和修改的內容。
顏色差異
我們可以使用 --color
選項顯示差異的顏色。例如:
git log --color
這將顯示差異的顏色,新增的內容以綠色顯示,刪除的內容以紅色顯示。
字級差異
我們可以使用 --word-diff
選項顯示字級差異。例如:
git log --word-diff
這將顯示字級差異,新增、刪除和修改的內容以不同的標記顯示。
比較分支
我們可以使用 git log
命令比較分支之間的差異。例如:
git log A..B
這將顯示 A 和 B 分支之間的差異。
內容解密:
以上命令和選項可以幫助我們檢視和管理 Git 歷史記錄。透過自定義輸出格式、使用 pickaxe 和顯示差異,我們可以更好地瞭解程式碼的變化和演進。
圖表翻譯:
graph LR A[Git Log] --> B[自定義輸出格式] B --> C[Pickaxe] C --> D[顯示差異] D --> E[顏色差異] E --> F[字級差異] F --> G[比較分支]
這個圖表顯示了 Git Log 的不同功能之間的關係,包括自定義輸出格式、使用 pickaxe、顯示差異、顏色差異、字級差異和比較分支。
Git Log 的強大功能:掌握提交歷史
Git Log 是 Git 中一個非常重要的工具,讓我們可以瀏覽提交歷史,瞭解專案的變化過程。今天,我們要探討 Git Log 的一些高階用法,特別是當提交歷史涉及 cherry-pick 的時候。
Git Log 的基本用法
首先,讓我們回顧一下 Git Log 的基本用法。當我們執行 git log
命令時,Git 會顯示所有提交的歷史記錄,包括提交的雜湊值、作者、日期和提交訊息。然而,當我們想要比較兩個分支的提交歷史時,我們可以使用 git log
的 ..
運運算元。例如,git log master..other
會顯示那些在 other
分支中但不在 master
分支中的提交。
Cherry-Pick 的問題
但是,當我們使用 cherry-pick 功能從一個分支將提交應用到另一個分支時,Git Log 的預設行為可能不是我們想要的。cherry-pick 會建立一個新的提交,該提交具有與原始提交相同的變更集,但具有不同的雜湊值。因此,如果我們執行 git log master..other
,Git 會顯示這兩個提交,即使它們代表相同的變更集。
解決方案:–cherry-pick 選項
為瞭解決這個問題,Git Log 提供了 --cherry-pick
選項。當我們執行 git log --cherry-pick master..other
時,Git 會省略那些具有相同變更集的提交,只顯示那些具有不同變更集的提交。這樣,我們就可以看到兩個分支之間的實際內容差異。
–cherry-mark 選項
如果我們想要看到具有相同變更集的提交,但不想省略它們,我們可以使用 --cherry-mark
選項。這個選項會在具有相同變更集的提交前面加上一個等號(=),以便我們可以輕易地識別出這些提交。
圖表翻譯:
上述 Mermaid 圖表展示了 Git Log 的基本用法和高階用法,包括比較分支、使用 --cherry-pick
和 --cherry-mark
選項。圖表從 Git Log 的基本用法開始,然後展示瞭如何比較分支和使用 --cherry-pick
選項省略相同變更集的提交。最後,圖表介紹了 --cherry-mark
選項和其作用。
比較 Git 分支
當我們需要比較 Git 分支時,會使用 git log
命令加上分支名稱。例如,若要比較 master
和 other
分支,可以使用以下命令:
git log master..other
這個命令會顯示 other
分支中不在 master
分支中的提交記錄。
檢查 cherry-pick
如果想要檢查 cherry-pick 的提交,可以使用 --cherry-pick
選項。這個選項會顯示兩個分支之間的差異提交,以及哪些提交被 cherry-pick 到另一個分支。
git log --cherry-pick --right-only master...other
這個命令會顯示 other
分支中不在 master
分支中的提交記錄,並且只顯示右邊(other 分支)的提交。
顯示提交方向
如果想要顯示提交的方向,可以使用 --left-right
選項。這個選項會在每個提交記錄前面加上 <
或 >
符號,表示提交的方向。
git log --cherry-mark --left-right master...other
這個命令會顯示兩個分支之間的差異提交,並且在每個提交記錄前面加上 <
或 >
符號,表示提交的方向。
內容解密:
以上命令都可以用來比較 Git 分支,並且可以根據需要選擇不同的選項來顯示提交記錄。 --cherry-pick
選項可以用來檢查 cherry-pick 的提交,而 --left-right
選項可以用來顯示提交的方向。
圖表翻譯:
以下是使用 Mermaid 圖表來展示 Git 分支比較的過程:
flowchart TD A[Git Log] --> B[Master..Other] B --> C[Other 分支中的提交] C --> D[Cherry-pick 檢查] D --> E[右邊提交] E --> F[提交方向] F --> G[最終結果]
這個圖表展示了 Git 分支比較的過程,從 git log
命令開始,到最終顯示提交的方向。
Git 記錄查詢與簡化
Git 提供了強大的工具來查詢和簡化提交記錄,讓開發者能夠更好地理解專案的演變過程。其中,git log
是最常用的命令,用於顯示提交記錄。
Git Log 高效使用技巧:簡化提交歷史查詢
Git Log 是開發者日常工作中不可或缺的工具,但面對複雜的提交歷史,如何高效地查詢所需資訊至關重要。本文將介紹幾種簡化 Git Log 輸出,提高查詢效率的技巧。
格式化輸出:精簡資訊,突出重點
--pretty
選項可以控制 Git Log 的輸出格式,避免資訊冗餘。--oneline
選項將每個提交壓縮成一行,只顯示提交雜湊值和提交訊息,非常適合快速瀏覽提交歷史。--format
選項則提供了更精細的控制,可以自定義輸出格式,例如只顯示提交日期、作者和訊息。
# 只顯示提交雜湊值和訊息
git log --oneline
# 自定義輸出格式,顯示日期、作者和訊息
git log --pretty=format:"%ad - %an: %s"
篩選提交:精確定位目標提交
--grep
選項可以根據提交訊息篩選提交,例如查詢包含特定關鍵字的提交。--author
和 --committer
選項則可以根據提交的作者和提交者篩選提交。--since
和 --until
選項可以根據日期範圍篩選提交。
# 查詢包含 "fix" 的提交
git log --grep="fix"
# 查詢 John 的提交
git log --author="John"
# 查詢 2023 年 1 月 1 日之後的提交
git log --since="2023-01-01"
簡化圖形:清晰展現分支關係
--graph
選項可以以圖形方式顯示提交歷史,清晰地展現分支和合併的關係。--decorate
選項可以顯示分支名稱和標籤,使圖形更易於理解。--simplify-by-decoration
選項可以簡化圖形,只顯示被標籤或分支參照的提交。
# 以圖形方式顯示提交歷史,並顯示分支和標籤
git log --graph --decorate --oneline
路徑限定:聚焦特設定檔案或目錄
透過指設定檔案或目錄路徑,可以將 Git Log 的輸出限制在特設定檔案或目錄的提交歷史上。
# 顯示 src/ 目錄下的提交歷史
git log -- src/
組合使用:靈活應對各種查詢需求
以上選項可以組合使用,靈活應對各種查詢需求。例如,要查詢 John 在 2023 年 1 月 1 日之後對 src/ 目錄的修改,可以使用以下命令:
git log --since="2023-01-01" --author="John" -- src/
結論:
熟練掌握 Git Log 的各種選項和技巧,可以大幅提升查詢效率,更好地理解專案的歷史,從而更加高效地進行開發工作。 建議開發者多嘗試不同的組合方式,找到最適合自己工作流程的 Git Log 使用方式。
graph LR A[Git Log] --> B(格式化輸出) A --> C(篩選提交) A --> D(簡化圖形) A --> E(路徑限定) B --> F[--pretty, --oneline, --format] C --> G[--grep, --author, --committer, --since, --until] D --> H[--graph, --decorate, --simplify-by-decoration] E --> I[檔案/目錄路徑]