1622

如何查看取消存储将对当前工作树所做的更改?我想知道在应用它们之前会进行哪些更改!

4

14 回答 14

2253

查看最近的存储:

git stash show -p

查看任意存储:

git stash show -p stash@{1}

git stash手册页:

默认情况下,该命令显示 diffstat,但它会接受 git diff 已知的任何格式(例如, git stash show -p stash@{1} 以查看补丁形式的第二个最近的存储)。

于 2011-10-06T16:50:29.447 回答
376

要查看最近的存储:

git stash show -p

要查看任意存储:

git stash show -p stash@{1}

另外,我使用 git diff 将存储与任何分支进行比较。

您可以使用:

git diff stash@{0} master

查看与分支主服务器相比的所有更改。


或者您可以使用:

git diff --name-only stash@{0} master

为了轻松找到仅更改的文件名。

于 2012-07-26T14:33:48.663 回答
123

如果您的隐藏更改所基于的分支同时发生了更改,则此命令可能很有用:

git diff stash@{0}^!

这会将存储与其所基于的提交进行比较。

于 2013-03-27T13:23:38.190 回答
51

如果您的工作树是脏的,您可以通过首先提交脏工作树,然后将其与存储进行比较,将其与存储进行比较。之后,您可以使用脏工作树撤消提交(因为您可能不希望在提交日志中包含该脏提交)。

您还可以使用以下方法将两个存储区相互比较(在这种情况下,您只需首先弹出其中一个存储区)。

  • 提交你肮脏的工作树:

    git add .
    git commit -m "Dirty commit"
    
  • 使用该提交来区分存储:

    git diff HEAD stash@{0}
    
  • 然后,之后,您可以恢复提交,并将其放回工作目录:

    git reset --soft HEAD~1
    git reset .
    

现在你已经用你的 stash 区分了肮脏的工作树,并回到了你最初的位置。

于 2013-01-21T13:33:59.523 回答
42

根据您想要将存储与(本地工作树/父提交/头部提交)进行比较的内容,实际上有几个可用的命令,其中好的旧git diff的和更具体的git stash show

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

虽然git stash show乍一看看起来对用户更友好,git diff但实际上更强大,因为它允许为更集中的差异指定文件名。我已经在我的zsh git plugin中亲自为所有这些命令设置了别名。

于 2020-05-31T15:35:34.093 回答
34

@Magne 的答案是唯一一个(非常晚)回答问题最灵活/有用的解释的日期,但它比必要的复杂一点。而不是提交和重置,只需存储您的工作副本,比较,然后取消存储。

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

通过临时使您的工作文件夹更改成为存储堆栈的顶部 (stash@{0}),将原始的顶部向下移动一个 (stash@{1} ) 然后在“新设置”位置使用原始顶部进行比较,以便您看到将其应用到当前工作之上所产生的变化。

“但如果我现在没有任何工作怎么办?” 然后你就处于正常无聊的情况下。只需使用@Amber 的答案

git stash show

或@czerasz 的回答

git diff stash@{0}

或者承认无论如何存储和取消存储都是快速和容易的,只需取消存储更改并检查它们。如果您现在不想要它们,请将它们(当前索引/工作文件夹更改)扔掉。完全就是这样

git stash apply
git diff
git reset
git checkout
于 2016-06-28T16:13:44.080 回答
22

以防万一,要比较工作树和存储中的文件,请使用以下命令

git diff stash@{0} -- fileName (with path)
于 2019-02-14T05:00:15.213 回答
20

这适用于 git 版本 1.8.5.2:

git diff stash HEAD
于 2014-01-22T23:36:15.763 回答
10

如果您有差异工具(例如无法比较)

git difftool stash HEAD
于 2015-09-09T08:08:27.370 回答
6

我相信git diff <current-branchname>..stash@{0}这是比较本地工作树和最近存储之间变化的最直观的方法。根据需要替换stash@{0}为适用的存储编号。

请注意,这git diff stash@{0}可能会产生误导性结果。如果您的 stash 和当前分支的两个历史记录发生了分歧,则差异看起来就像您在 stash 中添加了所有新内容并删除了当前分支独有的所有内容。

根据git book回答

另外,请注意双点..和三点...指定不同的提交比较,我指的是这个答案的双点。有关详细信息,请参阅 git 书

于 2020-07-02T23:42:08.923 回答
5

在不移动任何东西的情况下做到这一点的一种方法是利用patch可以读取 git diff 的事实(基本上是统一的差异)

git stash show -p | patch -p1 --verbose --dry-run

这将向您展示补丁通常会执行的操作的逐步预览。这样做的额外好处是,补丁也不会阻止自己将补丁写入工作树,如果由于某种原因你真的需要 git 关闭提交前修改,继续并删除 --dry-运行并按照详细说明进行操作。

于 2018-02-07T23:44:20.843 回答
3

结合我在这个线程和这个线程中学到的知识当我想查看“存储中的内容”时,我首先运行:

git stash show stash@{0}

这将显示修改了哪些文件。然后,为了在 difftool 中获得漂亮的视觉差异,我这样做:

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

这将一次显示给定存储与其父级的所有差异。

您可以在 中配置差异工具~/.gitconfig,例如使用Meld

...
[diff]
    tool = meld
于 2015-10-20T12:24:56.063 回答
3

她的藏匿清单

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

所以获取存储号码并执行以下操作:

你可以做:

 git stash show -p stash@{1}

但是如果你想要一个差异(这与显示存储不同,这就是我写这个答案的原因。Diff考虑你分支中的当前代码,show只显示你将应用的内容)

您可以使用:

git diff stash@{0}

或者

git diff stash@{0} <branch name>

另一个有趣的事情是:

git stash apply
git stash apply stash@{10}

这将应用存储而不将其从列表中删除,您可以git checkout .删除这些更改,或者如果您git stash drop stash@{10}愿意从列表中删除存储。

从这里开始,我从不建议使用和使用和git stash pop的组合如果您在错误的分支中应用存储...有时很难恢复您的代码。git stash applygit stash drop

于 2018-09-07T21:31:22.023 回答
1

FWIW 这对于所有其他答案可能有点多余,并且与现场接受的答案非常相似;但也许它会帮助某人。

git stash show --help会给你你应该需要的一切;包括藏匿表演信息。

显示 [<stash>]

将存储中记录的更改显示为存储状态与其原始父级之间的差异。如果没有给出,则显示最新的。默认情况下,该命令显示 diffstat,但它会接受 git diff 已知的任何格式(例如, git stash show -p stash@{1} 以查看补丁形式的第二个最近的存储)。您可以使用 stash.showStat 和/或 stash.showPatch 配置变量来更改默认行为。

于 2016-08-18T16:40:27.097 回答