跳转到内容

查看修改内容

在执行 git addgit commit 之前,最重要的习惯就是检查你到底修改了什么。git diff 是 Git 中最常用的命令之一,它能帮助你精确地掌控代码变更。

当你修改了文件但还没有执行 git add 时,这些改动位于工作区。使用不带参数的 git diff 命令可以查看工作区暂存区之间的差异。

Terminal window
git diff

让我们来逐行解读一下这些输出内容的含义。

Git 的差异输出使用标准的 diff 格式:

  • diff --git a/file.txt b/file.txt: 表示正在比较的文件。
  • --- a/file.txt: 减号 (---) 代表变动前的文件(旧版本)。
  • +++ b/file.txt: 加号 (+++) 代表变动后的文件(新版本)。
  • @@ -1,4 +1,5 @@: 定位标记,表示变更发生的行号范围。

颜色含义

  • - 红色行:表示被删除的内容(或旧内容)。
  • + 绿色行:表示被新增的内容(或新内容)。

如果你已经执行了 git add 将文件放入了暂存区,此时想看下一次提交(commit)会包含哪些内容,需要使用 --staged--cached 参数。

这两个参数是等价的,它们比较的是 暂存区 (Index)最后一次提交 (HEAD) 之间的差异。

Terminal window
# 推荐使用 --staged,语义更清晰
git diff --staged
# 或者使用别名(历史遗留习惯)
git diff --cached

假设你修改了 README.md,添加了一行文字,然后执行了 git add README.md

  1. 运行 git diff无输出(因为工作区相对于暂存区没有变化)。
  2. 运行 git diff --staged显示差异(显示暂存区的新内容相对于上一次提交的变化)。
命令比较对象 A比较对象 B用途
git diff工作区 (Working Directory)暂存区 (Staging Area)查看还没 add 的修改
git diff --staged暂存区 (Staging Area)最新提交 (HEAD)查看已经 add 但还没 commit 的修改
git diff HEAD工作区最新提交 (HEAD)查看所有修改(不管有没有 add)

虽然命令行的 diff 输出很高效,但在处理大量修改或复杂冲突时,图形化工具(GUI)通常更加直观。Git 允许你配置 git difftool 来启动外部比较工具,如 VS Code、Beyond Compare 或 Meld。

如果你使用 VS Code,可以通过以下配置将其设为默认工具:

Terminal window
git config --global diff.tool vscode
git config --global difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE"

配置完成后,当你想要查看差异时,只需运行:

Terminal window
git difftool
# 或者查看暂存区的差异
git difftool --staged

Git 会依次打开每个变更文件的对比视图,左侧是旧版本,右侧是新版本,非常便于阅读。