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