题 Git diff对付藏匿处


如何才能看到取消对当前工作树的更改?我想知道在应用它们之前会做出哪些改变!


981
2017-10-06 16:48


起源


可能重复 是否可以在git中预览存储应用程序? - quazgar
相关文章 这里。 - RBT


答案:


查看最新的藏匿处:

git stash show -p

看到任意藏匿:

git stash show -p stash@{1}

来自 git stash 手册页:

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


1354
2017-10-06 16:50



stash@{0} 是默认值;如果你想看看以前的藏匿处,你只需要一个参数。 - Cascabel
对。我只提供它,以便明白如何看待其他的藏匿处 {0}。 - Amber
这不会显示存储和当前工作目录之间的差异,而是显示存储与其原始父级之间的区别。对?从联机帮助页:“将存储中记录的更改显示为存储状态与其原始父项之间的差异。” - Magne
@Amber - 是的,虽然如果你当前的工作树很脏,那很重要,并且会让它变得更复杂一些。我从那个角度来看它,并在下面的答案中找到了我分享的程序。 - Magne
@Gerald“补丁”即显示差异,而不仅仅是提交细节。 - Amber


要查看最近的藏匿信息:

git stash show -p

要查看任意存储:

git stash show -p stash@{1}

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

您可以使用:

git diff stash@{0} master

查看与分支主数据相比的所有更改。


或者您可以使用:

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

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


240
2017-07-26 14:33



这不回答具体问题。如果你从master创建了stash(为了以后保存工作),那么在master上做一些其他工作的提交,然后做 git diff stash@{0} master,你得到了你当前主人的存储区别(包括在藏匿之后在主人身上完成的工作),而不是存储将改变的文件/行,这就是问题所在。 - Tom De Leu
我很高兴你回答这个问题,即使它不是一个确切问题的答案。它提供了更多的信息,我认为很高兴知道如何在分支和任何其他分支之间进行差异,以便与之进行比较。我也喜欢学习--name-only标志:) - Rebekah Waterbury
这也允许使用自定义差异查看器查看差异,例如 git difftool --tool=... stash@{0} HEAD - Andre Holzner
@TomDeLeu很好的观察和重点。要将存储项与其父项进行比较,这似乎有效: git diff stash@{0}^ stash@{0} - erikprice
同样,您可以添加文件名 git diff stash@{0} master -- filename 获取特定文件的更改。 - David


如果您的存储更改所基于的分支在此期间已更改,则此命令可能有用:

git diff stash@{0}^!

这将stash与它所基于的提交进行比较。


77
2018-03-27 13:23



太好了,我添加了一个别名 ~/.gitconfig : laststash = diff stash@{0}^! - sbeam
完美搭配: git difftool stash^! 对于最后一次存储的差异,它是基于提交的, git difftool stash HEAD for last stash对当前提交的差异(stash @ {n}用于早期的stashes) - ChrisV
对于那些像我一样从未见过^的人!之前: 提交^!是一个范围说明符,表示:此提交,但不包含其父项。 - Jonathan Gawrych
“git diff stash @ {0} ^!”归结为“git diff stash @ {0} ^ stash @ {0} ~1 ^ stash @ {0} ~2 .......”但由于git diff只需要2次提交,它显示了藏匿之间的差异@ {0}和^ stash @ {0} ~1并且看起来^在第二次提交开始时没有任何不同,git忽略它。 - Naga Kiran
我更喜欢这个版本能够使用我喜欢的差异工具(Beyond Compare当然!)。这也显示了这个藏匿点的变化,我认为这是原始问题,而不是上面评论中提到的另一种选择“git diff stash @ {X} ^ stash @ {X}”,它显示的不仅仅是隐藏的差异。 - user107172


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

您还可以使用以下方法来比较两个stashes(在这种情况下,您只需首先弹出其中一个stashes)。

  • 提交你的脏工作树:

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

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

    git reset --soft HEAD~1
    git reset .
    

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


30
2018-01-21 13:33



有没有办法做到这一点,但只看到文件的差异将被存储中的内容改变? - lagweezle
@lagweezle你总是可以差别把藏品藏起来.. - Magne


这对git版本1.8.5.2适用于我:

git diff stash HEAD

17
2018-01-22 23:36



误导!问题是:如何才能看到取消对当前工作树的更改?这显示了存储和HEAD之间的差异,这可能与将要应用的差异非常不同 git stash apply。 - MikeJansen
请仔细阅读这个问题“我想知道在应用它们之前会做出哪些改变!”。我正在快速回答这个问题。 - yerlilbilgin
此外,您可以看到所有其他答案都是以某种方式将当前头部(或工作集)与存储区分开来。为什么只有我的答案误导?这不公平。 - yerlilbilgin
@yerlilbilgin请在下面的回答中查看我的回复。 - MikeJansen
我们可以省略HEAD,默认情况下,不是吗? - Al.G.


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

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

通过暂时使您的工作文件夹更改为存储堆栈的顶部(存储@ {0}),将原始顶部向下移动一个(存储@ {1}),显示存储堆栈顶部和工作文件夹之间的差异然后使用“新设置”位置中的原始顶部进行比较,以便您可以看到在当前工作之上应用它所带来的更改。

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

git stash show

或@ czerasz的回答

git diff stash@{0}

或承认无论如何都要快速轻松地存储和取消存储,只需解开更改并检查它们。如果您不希望它们暂时抛出它们(当前索引/工作文件夹更改)。完全是这样的

git stash apply
git diff
git reset
git checkout

13
2018-06-28 16:13





如果你有差异工具(比如无比)

git difftool stash HEAD

9
2017-09-09 08:08



误导!问题是:如何才能看到取消对当前工作树的更改?这显示了存储和HEAD之间的差异,这可能与将要应用的差异非常不同 git stash apply。 - MikeJansen
如果您认为这具有误导性,请检查所有其他答案。这不公平! - yerlilbilgin
你会注意到我将同样的评论复制到另一个答案中,这同样具有误导性(几乎相同的答案)。其他答案已经有类似的评论我独自留下。如果你理解git stash是如何工作的,那么你就会意识到,对HEAD进行区分并不是应用的东西(这就是OP所要求的)。实际的“存储”是存储提交与之前的差异。然后将该补丁应用于HEAD。因此,如果您想知道OP询问的内容,您必须在它之前显示存储和提交之间的差异,这是正确的答案。 - MikeJansen
这比任何其他(不必要的)长答案更直接地回答了这个问题,而且正是OP所要求的,而不是去除 HEAD。我可以修改@ yerlilbilgin的删除HEAD的答案,但我认为任何使用git的人都可以解决这个问题而且我延长答案将会降低其可读性。不要责怪@yerlibilgin。 - Sridhar-Sarnobat


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

git stash show --help会给你所需要的一切;包括藏匿显示信息。

显示[<stash>]

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


2
2017-08-18 16:40





结合我在这个线程中学到的东西 这个,当我想看“藏在里面的东西”时,我先跑:

git stash show stash@{0}

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

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

这将显示针对其父级的给定存储的所有差异。

您可以配置差异工具 ~/.gitconfig,例如同 合并

...
[diff]
    tool = meld

0
2017-10-20 12:24