Git diff对藏匿处


Answers:


1868

查看最新的存储:

git stash show -p

查看任意存储:

git stash show -p stash@{1}

git stash手册页:

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


72
stash@{0}是默认值;如果您想查看以前的存储,则只需要一个参数。
卡斯卡贝尔2011年

52
对。我只是提供了它,这样很清楚如何查看其他藏匿处{0}
琥珀色

74
这不会显示存储区和当前工作目录之间的差异,但是显示存储区与其原始父目录之间的差异。对?在联机帮助页中:“显示存储在存储中的更改,作为存储状态与其原始父项之间的差异。”
Magne 2013年

14
@Amber-是的,尽管如果您当前的工作树很脏,那很重要,并使它变得更加复杂。我从那个角度出发,找到了我在下面的答案中分享的一个过程。
Magne 2013年

6
代表什么-p
Gerald

308

要查看最新存储:

git stash show -p

要查看任意存储:

git stash show -p stash@{1}

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

您可以使用:

git diff stash@{0} master

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


或者您可以使用:

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

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


10
这不能回答具体问题。如果您是从母版创建存储的(以保存工作以备后用),然后对母版上的其他工作进行一些提交,然后执行do git diff stash@{0} master,则将获得与当前母版的存储差异(包括存储后在母版上完成的工作)而不是隐藏文件将要更改的文件/行,这就是问题所在。
汤姆·德列

52
我很高兴您回答了该问题,即使它不是确切问题的答案。它提供了更多信息,我想知道如何在一个分支与您想要与之比较的任何其他分支之间取得区别是很高兴的。我也喜欢学习--name-only标志:)
丽贝卡·沃特伯里

6
这也允许使用自定义的差异查看器查看差异,例如git difftool --tool=... stash@{0} HEAD
Andre Holzner

9
@TomDeLeu良好的观察和重要的一点。要将存储项与其父项进行比较,这似乎可行:git diff stash@{0}^ stash@{0}
erikprice

1
同样,您可以添加文件名git diff stash@{0} master -- filename以将更改保存到特定文件。
大卫,

104

如果您隐匿的更改所基于的分支同时已更改,则此命令可能有用:

git diff stash@{0}^!

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


太好了,我添加了一个别名~/.gitconfiglaststash = diff stash@{0}^!
sbeam,2014年

5
完美对:git difftool stash^!基于它的最后一个存储区与提交git difftool stash HEAD的差异,基于当前的最后存储区(较早的存储区的stash @ {n})的
差异

17
对于那些像我一样却从未见过的人!之前:提交^!是范围说明符,表示:此提交,但没有其父级。
Jonathan Gawrych

“ git diff stash @ {0} ^!” 归结为“ git diff stash @ {0} ^ stash @ {0}〜1 ^ stash @ {0}〜2 .......”,但是由于git diff只需要2次提交,因此显示了stash之间的差异@ {0}和^ stash @ {0}〜1并在第二次提交开始时的^看起来没有什么不同,git忽略了它。
娜迦·基兰

我更喜欢此版本,以便能够使用我喜欢的差异工具(当然,超越比较!)。这也显示了这个存储区的变化,我认为这是原始问题,而不是上述注释“ git diff stash @ {X} ^ stash @ {X}”中提到的替代方案,它显示的不仅仅是隐藏的差异。
user107172

44

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

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

  • 提交您的脏工作树:

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

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

    git reset --soft HEAD~1
    git reset .
    

现在,您已经将肮脏的工作树与存储区进行了区分,然后又回到了最初的状态。


有没有办法做到这一点,但只看到可以由存储中的内容更改的文件的差异?
lagweezle

2020年,这要简单得多。查看我最新的答案
David Deprost

有趣的是,我不知道git stash show -l 。是否会将最新存储与工作(脏)副本进行比较?您如何使用它而不会得到error: switch l requires a value
玛格妮

是的,确实如此,它与(可能是脏的)工作副本有所不同。您只需输入即可使用它git stash show -l。至于为什么它对您不起作用,我只能猜测您使用的是旧版本的git?我使用的是git v2.20.1,它可以完美无误地工作。
戴维·德普罗斯特

25

@Magne的答案是唯一(最晚)回答最灵活/最有用的问题解释的日期,但是它比必要的要复杂得多。无需提交和重置,只需存储工作副本,进行比较然后取消存储即可。

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

通过暂时使工作文件夹更改成为存储堆栈的顶部(stash @ {0}),将原始顶部向下移动一个(存储@ {1}),可以显示存储堆栈顶部和工作文件夹之间的差异),然后使用“新设置”位置的原始顶部进行比较,这样您就会看到将其应用于当前工作之上会导致的更改。

“但是如果我目前没有任何工作怎么办?” 然后,您处于正常的无聊情况。只需使用@Amber的答案

git stash show

或@czerasz的答案

git diff stash@{0}

或承认无论如何都可以轻松进行存储和取消存储,只需取消存储更改并检查它们即可。如果您暂时不希望将它们扔掉(当前索引/工作文件夹会更改)。完全是

git stash apply
git diff
git reset
git checkout

3
这种简单的方法(隐藏,然后与另一个隐藏进行比较)是安全且易于理解的。对于某些用例,您可能希望也使用git stash save -u
mleonard '18

19

这对我适用于git版本1.8.5.2:

git diff stash HEAD

2
误导!问题是:我如何才能看到取消隐藏将对当前工作树进行的更改?这显示了存储区和HEAD之间的差异可能与将应用的差异非常不同git stash apply
MikeJansen '02

请进一步阅读问题:“在应用它们之前,我想知道将进行哪些更改!”。我对此提供了一个快速的答案。
yerlilbilgin

您还可以看到所有其他答案都是以某种方式将当前磁头(或工作集)与存储区进行比较。为什么只有我的答案有误导性?这不公平。
yerlilbilgin

@yerlilbilgin在下面的答复中查看我的回复。
MikeJansen '16

我们可以省略HEAD,这是默认设置,不是吗?
Al.G.

10

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

git diff stash@{0} -- fileName (with path)

9

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

git difftool stash HEAD

1
误导!问题是:我如何才能看到取消隐藏将对当前工作树进行的更改?这显示了存储区和HEAD之间的差异可能与将应用的差异非常不同git stash apply
MikeJansen '02

1
如果您认为这有误导性,请检查所有其他答案。这不公平!
yerlilbilgin '16

1
您会注意到,我将相同的评论复制到另一个答案中,这同样具有误导性(几乎相同的答案)。我已经独自留下的其他答案已经有类似的评论。如果您了解git stash的工作原理,那么您将认识到,将ash的ash与HEAD区别不是要应用的(OP会问的)。实际的“隐藏”是隐藏提交与之前提交之间的区别。然后将此补丁应用于HEAD。因此,如果您想知道OP的要求,则必须显示存储与它之前的提交之间的区别,正确的答案是这样做的。
MikeJansen '16

1
这比任何其他(不必要)的长答案都更直接地回答了问题,并且准确地执行了OP所要求的,没有删除HEAD。我可以修改@yerlilbilgin的答案以删除HEAD,但我认为使用git的任何人都可以弄清楚该部分,而我加长答案会降低可读性。不要责怪@yerlibilgin。
Sridhar Sarnobat,

4

一种不做任何事情的方法是利用patch可以读取git diff的事实(基本上是统一的diff)。

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

这将逐步向您展示修补程序通常会执行的操作。这样做的另一个好处是,修补程序也不会阻止自身将修补程序写入工作树,如果由于某种原因您只需要git来关闭修改前提交,请继续并删除--dry-运行并按照详细说明进行操作。


2

结合我在这个线程和了解到这个,当我想看看“什么是里面藏”,我第一次运行:

git stash show stash@{0}

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

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

这将立即显示给定存储与其父存储之间的所有差异。

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

...
[diff]
    tool = meld

1

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

git stash show --help会给你你需要的一切;包括隐藏节目信息。

显示[<stash>]

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


1

她藏匿的清单

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如果你在错误的分支应用藏匿......嗯,有时难以收回你的代码。


1

根据要与存储区进行比较的内容(本地工作树/父提交/头提交),实际上有几个命令可用,其中包括old old 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中为所有这些命令设置了别名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.