人勤病就懒,人懒病就勤。——佚名

git diff 是 Git 提供的一个关键命令,用于查看不同版本或状态之间的代码差异。虽然命令行输出的格式中会显示类似 diff --git a/file.txt b/file.txt 的内容,这实际上并不是命令,而是差异输出的一部分。本文将详细介绍如何使用 git diff 命令查看和分析代码差异。


什么是 git diff

git diff 用于比较文件内容的变更。常见的使用场景包括:

  1. 查看工作区中的更改。
  2. 查看已暂存(staged)但未提交的内容。
  3. 比较分支之间、提交之间或标签之间的差异。
  4. 查看某个特定文件或路径的变更。

基本用法

1. 查看工作区中的未暂存更改

1
git diff

此命令会比较 工作区暂存区 之间的差异。适用于查看修改了但尚未 git add 的文件。

输出示例:

1
2
3
4
5
6
7
diff --git a/file.txt b/file.txt
index e69de29..d95f3ad 100644
--- a/file.txt
+++ b/file.txt
@@ -0,0 +1,2 @@
+Hello, World!
+Welcome to Git.

解释:

  • diff --git a/file.txt b/file.txt 表示 file.txt 文件的对比。
  • @@ -0,0 +1,2 @@ 显示变更发生的行号。
  • + 表示新增的两行内容。

2. 查看已暂存但未提交的更改

1
git diff --cached

--cached 用于比较 暂存区最后一次提交 之间的差异。适合在执行了 git add 后但未提交时使用。

3. 查看工作区的所有更改(包括未暂存和已暂存)

1
git diff HEAD

HEAD 代表当前分支的最新提交,该命令会比较工作区和当前提交的所有差异。


高级用法

1. 比较两个分支的差异

1
git diff branch1 branch2

适用于查看分支之间的具体差异,帮助开发者了解不同分支的代码改动。

示例:

1
git diff main feature

会显示 feature 分支相对于 main 分支的所有代码差异。

2. 比较两个特定提交

1
git diff commit1 commit2

替换 commit1commit2 为具体的提交哈希值。例如:

1
git diff abc123 def456

输出显示这两个提交之间的代码变更。

3. 查看特定文件的差异

1
git diff [commit1] [commit2] -- path/to/file

指定文件路径可以缩小比较范围。例如:

1
git diff HEAD~1 HEAD -- src/app.js

查看最近一次提交与当前提交在 src/app.js 文件中的差异。


常用选项

1. 显示变更文件列表

1
git diff --name-only

只显示发生变更的文件名,不显示具体的内容。例如:

1
2
src/file1.js
src/file2.js

2. 显示文件变更状态

1
git diff --name-status

输出包含文件的变更状态:

  • A:新增
  • M:修改
  • D:删除

示例:

1
2
3
A  src/new_file.js
M src/modified_file.js
D src/deleted_file.js

3. 显示统计信息

1
git diff --stat

提供每个文件的修改统计信息,包括增加和删除的行数。例如:

1
2
3
src/file1.js | 5 +++--
src/file2.js | 8 ++++++--
2 files changed, 10 insertions(+), 3 deletions(-)

4. 忽略空白字符差异

1
git diff -w

此选项忽略因空格或缩进导致的差异,仅显示内容改动。例如:

1
2
- function test( ) {
+ function test() {

使用 -w 后,这样的改动会被忽略。


git diff 的输出结构

git diff 的输出可以分为以下几部分:

  1. 文件对比行

    1
    diff --git a/file.txt b/file.txt

    表示比较 file.txt 文件。

  2. 索引信息

    1
    index e69de29..d95f3ad 100644

    包括文件的哈希值和权限信息。

  3. 上下文范围

    1
    @@ -1,2 +1,3 @@

    表示变更的上下文区域。-1,2 是原文件的起始行和范围,+1,3 是新文件的起始行和范围。

  4. 具体改动

    1
    2
    - console.log("Old line");
    + console.log("New line");

使用场景总结

  • 开发中: 在修改代码后但未暂存时,用 git diff 检查具体改动。
  • 提交前: 使用 git diff --cached 确保暂存的更改符合预期。
  • 代码审查: 使用 git diff branch1 branch2 比较分支间的变更,评估合并的影响。
  • 问题排查: 使用 git diff commit1 commit2 找出具体提交导致的问题。

git diff 是一个灵活且高效的工具,无论是日常开发还是代码审查,都能帮助你快速了解代码变更,提高协作效率。通过掌握它的用法和选项,你可以更精准地管理代码变更,为项目保驾护航。