如何使用`git diff`比较工作树与贮藏内容

如何使用git diff比较工作树与贮藏内容

技术背景

在使用Git进行版本控制时,有时我们会将当前的修改暂存到贮藏(stash)中,之后可能需要查看工作树与贮藏内容之间的差异。了解如何使用git diff命令来进行这样的比较,可以帮助我们更好地管理代码修改。

实现步骤

查看最近的贮藏内容

可以使用以下命令查看最近的贮藏内容的详细差异:

1
git stash show -p

查看任意贮藏内容

若要查看指定的贮藏内容,可使用以下命令,例如查看第二近的贮藏内容:

1
git stash show -p stash@{1}

比较贮藏与分支

  • 查看贮藏与指定分支的所有差异:
1
git diff stash@{0} master
  • 仅查看贮藏与指定分支中发生更改的文件名:
1
git diff --name-only stash@{0} master

比较贮藏与它所基于的提交

当贮藏所基于的分支在贮藏之后有了更改时,可使用以下命令:

1
git diff stash@{0}^!

比较不同对象与贮藏的差异

比较对象git diff 命令git stash show 命令
本地工作树git diff stash@{0}git stash show -l
父提交git diff stash@{0}^ stash@{0}git stash show -p
HEAD 提交git diff stash@{0} HEAD/

比较脏工作树与贮藏

当工作树处于脏状态(有未提交的修改)时,可按以下步骤操作:

  1. 提交脏工作树的修改:
1
2
git add .
git commit -m "Dirty commit"
  1. 比较贮藏与提交:
1
git diff HEAD stash@{0}
  1. 撤销提交并恢复工作树:
1
2
git reset --soft HEAD~1
git reset .

临时贮藏工作副本进行比较

另一种比较脏工作树与贮藏的方法:

1
2
3
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

反转差异显示

git diff stash显示的差异方向不符合预期,可使用以下命令反转:

1
git diff stash -R

使用比较工具

若有像Beyond Compare这样的差异比较工具,可使用以下命令:

1
git difftool stash HEAD

更直观的比较方法

使用双点语法比较本地工作树与最近的贮藏:

1
git diff <current-branchname>..stash@{0}

查看贮藏列表并比较

查看贮藏列表:

1
git stash list

获取贮藏编号后进行比较:

1
git diff stash@{0}

可视化差异比较

先查看贮藏修改的文件:

1
git stash show stash@{0}

然后使用差异工具进行可视化比较:

1
git difftool --dir-diff stash@{0} stash@{0}^

核心代码

以下是一些常用的核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看最近贮藏内容
git stash show -p
# 查看指定贮藏内容
git stash show -p stash@{1}
# 比较贮藏与分支
git diff stash@{0} master
# 比较贮藏与它所基于的提交
git diff stash@{0}^!
# 比较脏工作树与贮藏
git add .
git commit -m "Dirty commit"
git diff HEAD stash@{0}
git reset --soft HEAD~1
git reset .
# 临时贮藏工作副本进行比较
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
# 反转差异显示
git diff stash -R
# 使用比较工具
git difftool stash HEAD
# 双点语法比较
git diff <current-branchname>..stash@{0}
# 可视化差异比较
git stash show stash@{0}
git difftool --dir-diff stash@{0} stash@{0}^

最佳实践

  • 对于简单的查看贮藏内容,优先使用git stash show -p
  • 当需要比较贮藏与分支时,使用git diff命令。
  • 若工作树处于脏状态,可选择临时贮藏工作副本的方法进行比较,避免不必要的提交。
  • 若需要可视化的差异比较,配置好差异工具并使用git difftool命令。

常见问题

  • git diff stash@{0}可能产生误导性结果:如果贮藏和当前分支的历史记录已经分叉,差异显示可能会让人误以为是在添加贮藏中的新内容并移除当前分支的独特内容。此时可使用git diff <current-branchname>..stash@{0}进行更直观的比较。
  • 差异显示方向不符合预期:使用git diff stash -R反转差异显示。

如何使用`git diff`比较工作树与贮藏内容
https://119291.xyz/posts/how-to-git-diff-the-working-tree-to-the-stash/
作者
ww
发布于
2025年5月26日
许可协议