Git diff 命令是检查仓库中不同状态之间差异的强大工具。默认情况下,不带任何额外参数运行 git diff 命令会比较您当前工作目录中的文件与暂存区(也称作索引)中的内容。虽然这种默认比较很有用,但有时您需要进行更具体的比较,尤其是在区分已暂存的修改和尚未暂存的修改时。理解这种区别有助于您编写精确的提交。让我们来明确这些比较:未暂存的修改: 这些是您在工作目录中对已跟踪文件所做的修改,时间在您上次对它们运行 git add 之后(如果您尚未暂存任何内容,则为自上次提交以来)。已暂存的修改: 这些是您使用 git add 明确标记为要包含在下一次提交中的修改。它们位于暂存区,等待被永久记录。查看未暂存的修改要查看您在工作目录中尚未暂存的修改,您只需运行:git diff这个命令会直接比较您工作目录中的文件与暂存区中的文件。如果您自上次提交以来没有暂存任何修改,这个命令实际上会显示您的工作目录与上次提交(HEAD)之间的差异。然而,一旦您使用 git add 暂存了一些修改,git diff 将只会显示在该暂存操作之后引入的差异。考虑以下步骤:您有一个文件 report.md,它已被Git跟踪并提交。您编辑了 report.md,添加了一个新段落。运行 git status 会显示 report.md 已修改但未暂存。运行 git diff 会显示您刚刚在 report.md 中添加的行。diff --git a/report.md b/report.md index e69de29..abcdef0 100644 --- a/report.md +++ b/report.md @@ -0,0 +1,3 @@ +这是第一行。 +这是新添加的段落。 +这是最后一行。 (为清晰起见,输出已简化)您暂存了文件:git add report.md。现在,再次运行 git diff 会显示无输出,因为您的工作目录中 report.md 的版本现在与暂存区中的版本完全一致。查看已暂存的修改那么,您如何查看刚刚暂存的、准备进行下一次提交的修改呢?您需要将暂存区与上次提交(HEAD)进行比较。为此,Git 提供了 --staged 选项(或其旧的别名 --cached):git diff --stagedorgit diff --cached这两个命令执行相同的功能:它们显示暂存区中记录的快照与上次提交(HEAD)所代表的快照之间的差异。这对于在运行 git commit 之前的最终检查大有帮助。让我们继续之前的例子:您刚刚运行了 git add report.md。新段落现在已暂存。运行 git status 会显示 report.md 为“待提交的修改”。现在运行 git diff --staged 将会显示已暂存的 report.md(包含新段落)与上次提交中的版本(不含新段落)之间的差异。输出将与我们在暂存文件之前看到的 git diff 输出相似。diff --git a/report.md b/report.md index e69de29..abcdef0 100644 --- a/report.md +++ b/report.md @@ -0,0 +1,3 @@ +这是第一行。 +这是新添加的段落。 +这是最后一行。 (为清晰起见,输出已简化)现在,想象您再次编辑 report.md,也许是修复了您刚添加的段落中的一个错别字,但您没有随后运行 git add。运行 git diff(不带任何选项)将只显示最新的修改(错别字修正),因为那是您的工作目录与暂存区之间的差异。运行 git diff --staged 将仍然显示段落的原始添加内容,因为那是暂存区中与上次提交相比的当前内容。这种分离使您能够精确地控制和审查将要进入下一次提交的内容。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif", color="#495057"]; WD [label="工作目录"]; SA [label="暂存区\n(索引)"]; HEAD [label="上次提交\n(HEAD)"]; // 工作流程边 WD -> SA [label=" git add", color="#1c7ed6", fontcolor="#1c7ed6"]; SA -> HEAD [label=" git commit", color="#0ca678", fontcolor="#0ca678"]; // 比较表示边 WD -> SA [style=dashed, color="#f03e3e", arrowhead=none, constraint=false, label=" git diff\n (工作目录 vs 暂存区) ", fontcolor="#f03e3e", len=1.5]; SA -> HEAD [style=dashed, color="#ae3ec9", arrowhead=none, constraint=false, label=" git diff --staged\n (暂存区 vs HEAD) ", fontcolor="#ae3ec9", len=1.5]; // 使元素对齐 { rank=same; WD; SA; HEAD } }此图表展示了 git diff 和 git diff --staged 所进行的比较。git diff 比较工作目录与暂存区,显示未暂存的修改。git diff --staged 比较暂存区与上次提交(HEAD),显示已暂存的、准备提交的修改。总结:使用 git diff 查看您尚未暂存的修改。使用 git diff --staged 查看您已暂存且即将提交的修改。掌握 git diff 的这两种用法,让您在提交之前对检查工作有更精细的控制,有助于您维护清晰易懂的项目历史。