Git diff对付藏匿处

时间:2011-10-06 16:49:00

标签: git git-stash

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

14 个答案:

答案 0 :(得分:1586)

查看最新的藏匿处:

git stash show -p

看到任意存储:

git stash show -p stash@{1}

来自git stash联机帮助页:

  

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

答案 1 :(得分:272)

要查看最近的藏匿处:

git stash show -p

要查看任意存储:

git stash show -p stash@{1}

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

您可以使用:

git diff stash@{0} master

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


或者您可以使用:

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

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

答案 2 :(得分:85)

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

git diff stash@{0}^!

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

答案 3 :(得分:37)

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

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

  • 提交脏工作树:

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

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

    git reset --soft HEAD~1
    git reset .
    

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

答案 4 :(得分:21)

@Magne' s answer是唯一一个(非常晚)约会对该问题的最灵活/有用的解释,但它比必要的更复杂。而不是提交和重置,只需存储您的工作副本,比较,然后取消暂停。

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

答案 5 :(得分:18)

这适用于git版本1.8.5.2:

git diff stash HEAD

答案 6 :(得分:9)

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

git difftool stash HEAD

答案 7 :(得分:7)

取决于要与存储区进行比较的内容(本地工作树/父提交/头提交),实际上有几个命令可用,其中包括旧的git diff和更具体的{{1 }}:

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实际上更强大,因为它允许为更集中的差异指定文件名。我已经在zsh git plugin中为所有这些命令设置了别名。

答案 8 :(得分:2)

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

请注意,git diff stash@{0}可能会产生误导性的结果。如果您的存储和当前分支的两个历史记录不同,则差异似乎是您在存储中添加了所有新内容,并删除了当前分支特有的所有内容。

基于git book

的答案

此外,请注意,双点..和三点...指定了不同的提交比较,而我将这个答案称为双点。 See the git book for details

答案 9 :(得分:1)

结合我在这个帖子和this one中学到的东西,当我想看到“藏匿内容是什么”时,我首先运行:

git stash show stash@{0}

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

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

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

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

...
[diff]
    tool = meld

答案 10 :(得分:1)

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

git stash show --help将为您提供所需的一切;包括藏匿显示信息。

  

显示[&lt; stash&gt;]

     
    

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

  

答案 11 :(得分:1)

在不移动任何内容的情况下执行此操作的一种方法是利用patch可以读取git diff的事实(基本上统一差异)

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

这将向您显示通常会执行哪些修补程序的分步预览。这样做的另一个好处是补丁不会阻止自己将补丁写入工作树,如果由于某种原因你真的需要git来关闭提交 - 修改之前,继续并删除--dry-运行并遵循详细的说明。

答案 12 :(得分:1)

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

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

答案 13 :(得分:0)

她的藏匿处清单

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如果在错误的分支中应用了存储,那么有时很难恢复您的存储代码。