在Git版本控制中,提交(commit)操作是最终确定一组变更的关键步骤。然而,在执行 git commit 之前,我们经常需要一个机会来仔细审查哪些更改真正被暂存(staged)了,以防止意外提交不完整或不相关的代码。
git diff –cached(或其别名 git diff –staged)正是解决这个问题的利器。它用于显示暂存区(Staging Area,Index)与上一次提交(HEAD)之间的差异。换句话说,它准确地展示了你的下一个 commit 将包含的内容。
理解 Git Diff 的三种模式
在使用 Git 进行审核时,了解不同 git diff 命令的区别至关重要:
- ****git diff****: 对比工作目录(Working Tree)和暂存区(Staging Area)的差异。
- ****git diff HEAD****: 对比工作目录和上一次提交(HEAD)的差异。
- ****git diff –cached****: 对比暂存区和上一次提交(HEAD)的差异。
对于提交前的最终审核,我们唯一关心的就是第三种模式。
实操演示:使用 git diff –cached 进行审核
我们将通过一个实际场景来演示如何在提交前使用该命令。
步骤 1:初始化仓库并进行首次提交
首先,我们初始化一个仓库并创建两个文件,作为我们的基准状态。
git init
echo "Initial content for feature A" > feature_a.py
echo "Initial content for feature B" > feature_b.py
git add .
git commit -m "Initial project setup"
步骤 2:修改文件并选择性暂存
现在,我们对两个文件都进行了修改,但我们只打算将 feature_a.py 的修改包含在下一次提交中。
# 修改文件 A
echo "Adding implemented logic A" >> feature_a.py
# 修改文件 B
echo "Drafting incomplete logic B" >> feature_b.py
# 此时,我们执行 **git status** 会看到两个文件都被修改
git status
# 暂存我们希望提交的文件 (feature_a.py)
git add feature_a.py
步骤 3:最终审核暂存内容
在执行 git commit 之前,我们必须确保只有 feature_a.py 的修改被暂存,而 feature_b.py 的不完整草稿没有被意外包含。
# 运行审核命令
git diff --cached
输出分析:
如果你运行了上述命令,你会发现输出中只会显示 feature_a.py 中新增的 Adding implemented logic A 这一行内容。这意味着你的下一个 commit 将只包含这个变更。
如果你错误地运行了 git diff (没有 –cached 参数),你看到的将是 feature_b.py 中 “Drafting incomplete logic B” 的修改,因为它显示的是工作目录中尚未暂存的修改。
最佳实践:结合使用
在提交工作流中,建议按照以下顺序进行审核:
- 检查未暂存的改动 (工作目录 vs. 暂存区):
git diff目的:确保所有需要暂存的修改都已 git add,或者确认哪些修改被有意留在工作目录(例如调试代码或临时文件)。
-
检查将要提交的改动 (暂存区 vs. HEAD):
git diff --cached目的:这是决定性的最后一步,确保你即将提交的内容是干净、完整且符合预期的。
通过养成使用 git diff –cached 审查暂存区内容的习惯,您可以极大地降低因提交错误代码而引发返工的风险,保证提交历史的清晰和准确。
汤不热吧