git可以用stash做一个工作副本的差异

Lau*_*ter 47 git git-diff git-stash working-copy

如何将我当前的工作副本与存储区分开来?

我的用例:我的工作副本已包含我的更改的子集stash@{0},但我不想应用所有更改stash@{0}.我想做一个差异来帮助确定stash@{0}我的工作副本中仍然缺少哪些可取的变化.

And*_*ndy 36

如果这是你最近的藏匿,git diff stash@{0}那就行了.如果没有,您可以使用git stash list获取要与之比较的存储的索引.

  • 这只是针对最新的提交,而不是工作(脏)副本,对吧? (8认同)
  • 当它显然没有做出要求的时候,为什么这会被投票.Downvoted. (3认同)
  • 它应该与您的工作目录不同。如果您想与已签出的内容进行比较,则需要 `git diff HEAD stash@{0}` (2认同)
  • 这确实与最新的提交不同. (2认同)

nik*_*svp 15

我认为OP希望得到答案,看看除了工作副本中存在的文件之外,存储包含的区别.

以下命令显示存储包含的内容.

git stash show -p stash@{0}
Run Code Online (Sandbox Code Playgroud)

  • 这不能回答问题。 (4认同)

Mag*_*gne 11

如果您的工作树是脏的,您可以通过首先提交脏工作树,然后将其与存储进行比较,将其与存储进行比较.之后,您可能希望撤消工作树的提交(以保持历史记录清洁).

现在你已经用你的藏匿处肮脏的工作树,并回到你最初的位置.

  • 这应该得到更多的支持。对于初学者来说,它实际上执行了问题所要求的操作(大多数答案与上次提交相比,而不是工作树)。此外,它是完整的,因为即使它使用工作树的“临时提交”来实现目标,它也向您展示了如何恢复该提交并返回到您的工作树。 (3认同)

Max*_*ace 9

如果没有提交或存储工作副本,则无法执行此操作.存储可能风险较低:

git add -A                    # Stage all changes in your working copy.
git stash save --keep-index   # Stash your working copy and leave it intact
git diff stash@{0} stash@{1}
Run Code Online (Sandbox Code Playgroud)

为了摆脱你刚刚为了差异而使用的存储,使用git stash popgit stash drop stash@{0}.

如果您想使用提交,请参阅@Magne的回答.

  • +1 如果您在进行重大更改时使用存储作为“检查点”的形式,并且在完全形成之前不想提交,那么这也很方便。进行更改然后隐藏它们,再进行一些更改然后再次隐藏。然后使用“git difftool -d stash@{3} stash@{0}”之类的命令来查看两个感兴趣的存储之间所做的所有更改的目录差异。 (2认同)

MOH*_*HRE 6

您可以使用git stash show -l. 它显示了您想要的内容,无需额外的存储或提交。

  • 我记得以前用过这个。因为我总是最终忘记,所以我经常得到这个答案。在我的较新版本的 git 中,它会抛出错误“错误:switch l 需要一个值” (2认同)