Git 教程 - 比較版本差異

Jinku Hu 2023年1月30日 2018年7月19日
  1. 檢查工作區和倉庫之間的差異
  2. Git diff 外部工具
  3. 檢視暫存區和倉庫之間的差異
Git 教程 - 比較版本差異

我們將在本節來介紹如何檢視工作區(現在正處理的檔案)和倉庫版本之間的更改或差異。然後我們會在第二部分中來介紹如何在暫存區和倉庫之間進行比較。

檢查工作區和倉庫之間的差異

在更改和儲存檔案後,工作區上的檔案與我們的倉庫中的檔案就會有所不同。但我們究竟如何檢視這些變化呢?因為有時候我們對檔案進行了一些更改,並且我們想要檢視倉庫中的檔案,並且比較它們之間的差異。當我們編寫程式碼時這種情況經常發生,因為你想要確切地知道哪一些進行了更改以及它們是如何影響整個專案的。

所以我們可以做的第一件事是檢查 git status,它將會列出被修改的檔案,這意味著它與主專案或主倉庫中的檔案不同。

如果你輸入 git diff 並執行它,它將顯示它們之間的差異。

$ git diff
diff --git a/test1.txt b/test1.txt
index e1dd8e3..448ad04 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1,2 +1,2 @@
-This is my first Git repository.
-New added text.
\ No newline at end of file
+This was my first Git repository.
+This line is updated.
\ No newline at end of file

git bash 中的紅色文字顯示倉庫中的內容,綠色文字顯示文字是當前工作文字有哪些修改。

如果在上次提交後有多個檔案更新,Git 則會逐個列出每個檔案的差異。

Git diff 外部工具

如果你還沒有習慣使用 Git 預設 diff 工具,可以將 difftool(差異比較工具)配置為你習慣的工具。

下面的例子是如何配置 kdiff3 工具為 Git 的 diffmerge 的外部工具。

更改 .gitconfig 檔案目錄

在 Windows 作業系統中,開啟 C:\Users\username 目錄中的 .gitconfig 檔案並將下面的文字新增到檔案中,

[diff]
    tool = kdiff3
[difftool "kdiff3"]
    path = "C:/Program Files/KDiff3/kdiff3.exe"
    trustExitCode = false
[difftool]
    prompt = false
[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = "C:/Program Files/KDiff3/kdiff3.exe"
    trustExitCode = false
[mergetool]
    keepBackup = false

這裡,path 應是實際的 kdiff3 安裝的路徑,你電腦上的實際路徑可能與例子中的不同。

通過 git bash 配置 difftool

你也可以使用 git bash 中的命令來配置 difftoolmergetool(合併工具)。

git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add difftool.kdiff3.trustExitCode false
git config --global --add difftool.prompt false

它的作用跟直接 .gitconfig 檔案內容是一樣的。

檢視暫存區和倉庫之間的差異

你可以使用 git difftool 命令來檢視工作區與倉庫中檔案之間的檔案差異。

Git Difftool-kdiff3

git diff 顯示工作區和倉庫之間的區別,並且在檔案已新增到暫存區後,git diff 將不會顯示此檔案的任何差異,因為它不會將暫存區與倉庫進行比較,因此這就是為什麼你用 git status 來檢視後,看起來所有內容都是最新的,即使檔案仍然與你的倉庫中的檔案有所不同。

用於比較暫存區和倉庫的正確命令是在 git diff 後面加上 --staged 選項。

$ git diff --staged
diff --git a/test1.txt b/test1.txt
index e1dd8e3..448ad04 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1,2 +1,2 @@
-This is my first Git repository.
-New added text.
\ No newline at end of file
+This was my first Git repository.
+This line is updated.
\ No newline at end of file
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn