如何查看取消存储将对当前工作树所做的更改?我想知道在应用它们之前会进行哪些更改!
14 回答
查看最近的存储:
git stash show -p
查看任意存储:
git stash show -p stash@{1}
从git stash
手册页:
默认情况下,该命令显示 diffstat,但它会接受 git diff 已知的任何格式(例如, git stash show -p stash@{1} 以查看补丁形式的第二个最近的存储)。
要查看最近的存储:
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 .
现在你已经用你的 stash 区分了肮脏的工作树,并回到了你最初的位置。
根据您想要将存储与(本地工作树/父提交/头部提交)进行比较的内容,实际上有几个可用的命令,其中好的旧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中亲自为所有这些命令设置了别名。
@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
以防万一,要比较工作树和存储中的文件,请使用以下命令
git diff stash@{0} -- fileName (with path)
这适用于 git 版本 1.8.5.2:
git diff stash HEAD
如果您有差异工具(例如无法比较)
git difftool stash HEAD
我相信git diff <current-branchname>..stash@{0}
这是比较本地工作树和最近存储之间变化的最直观的方法。根据需要替换stash@{0}
为适用的存储编号。
请注意,这git diff stash@{0}
可能会产生误导性结果。如果您的 stash 和当前分支的两个历史记录发生了分歧,则差异看起来就像您在 stash 中添加了所有新内容并删除了当前分支独有的所有内容。
另外,请注意双点..
和三点...
指定不同的提交比较,我指的是这个答案的双点。有关详细信息,请参阅 git 书
在不移动任何东西的情况下做到这一点的一种方法是利用patch
可以读取 git diff 的事实(基本上是统一的差异)
git stash show -p | patch -p1 --verbose --dry-run
这将向您展示补丁通常会执行的操作的逐步预览。这样做的额外好处是,补丁也不会阻止自己将补丁写入工作树,如果由于某种原因你真的需要 git 关闭提交前修改,继续并删除 --dry-运行并按照详细说明进行操作。
她的藏匿清单
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 apply
git stash drop
FWIW 这对于所有其他答案可能有点多余,并且与现场接受的答案非常相似;但也许它会帮助某人。
git stash show --help
会给你你应该需要的一切;包括藏匿表演信息。
显示 [<stash>]
将存储中记录的更改显示为存储状态与其原始父级之间的差异。如果没有给出,则显示最新的。默认情况下,该命令显示 diffstat,但它会接受 git diff 已知的任何格式(例如, git stash show -p stash@{1} 以查看补丁形式的第二个最近的存储)。您可以使用 stash.showStat 和/或 stash.showPatch 配置变量来更改默认行为。