Git diff 对藏匿处

我如何看到取消隐藏将对当前工作树进行的更改?我想知道在应用之前将进行哪些更改!

答案

查看最新的存储:

git stash show -p

查看任意存储:

git stash show -p stash@{1}

git stash联机帮助页:

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

要查看最新存储:

git stash show -p

要查看任意存储:

git stash show -p stash@{1}

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

您可以使用:

git diff stash@{0} master

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


或者您可以使用:

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

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

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

git diff stash@{0}^!

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

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

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

  • 提交您的脏工作树:

    git add .
    git commit -m "Dirty commit"
  • 与该提交区别存储:

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

    git reset --soft HEAD~1
    git reset .

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

@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

这对我适用于 git 版本 1.8.5.2:

git diff stash HEAD

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

git difftool stash HEAD

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

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

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

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

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

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

git stash show stash@{0}

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

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

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

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

...
[diff]
    tool = meld