在軟體開發過程中,檢視提交歷史記錄是不可或缺的環節。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

這將顯示提交記錄,並附上指向提交的參照(如 HEADmaster 等)。

範例

以下是一個範例,展示如何使用上述選項來篩選和檢視提交記錄:

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 命令加上分支名稱。例如,若要比較 masterother 分支,可以使用以下命令:

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[檔案/目錄路徑]