【发布时间】:2011-12-02 10:14:21
【问题描述】:
如何查看取消存储对当前工作树所做的更改?我想知道在应用之前会进行哪些更改!
【问题讨论】:
如何查看取消存储对当前工作树所做的更改?我想知道在应用之前会进行哪些更改!
【问题讨论】:
查看最近的存储:
git stash show -p
查看任意存储:
git stash show -p stash@{1}
来自git stash 联机帮助页:
默认情况下,该命令会显示 diffstat,但它会接受任何 git diff 已知的格式(例如, git stash show -p stash@{1} 以查看 补丁形式的第二个最近的存储)。
【讨论】:
stash@{0} 是默认值;如果你想查看以前的存储,你只需要一个参数。
{0} 之外的其他存储。
-p 代表什么?
要查看最近的存储:
git stash show -p
查看任意存储:
git stash show -p stash@{1}
另外,我使用 git diff 将存储与任何分支进行比较。
你可以使用:
git diff stash@{0} master
查看与分支 master 相比的所有更改。
或者您可以使用:
git diff --name-only stash@{0} master
为了方便查找仅更改的文件名。
【讨论】:
git diff stash@{0} master,您将获得与当前 master 的 stash 的差异(包括在 master 上完成的工作在进行存储之后),而不是存储会更改的文件/行,这就是问题所在。
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename 以获取对特定文件的更改。
如果您的隐藏更改所基于的分支同时发生了更改,则此命令可能有用:
git diff stash@{0}^!
这会将存储与其基于的提交进行比较。
【讨论】:
~/.gitconfig添加了一个别名:laststash = diff stash@{0}^!
git difftool stash^! 用于最后一次存储与它所基于的提交的差异,git difftool stash HEAD 用于最后一次存储与当前提交的差异(stash@{n} 用于早期存储)
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 stash show -l 。它是否将最新的存储与工作(脏)副本区分开来?没有error: switch l requires a value怎么用?
git stash show -l 即可使用它。至于为什么它对你不起作用,我只能猜测你可能使用的是旧版本的 git?我在 git v2.20.1 上,它完美无瑕地工作。
根据您想要将存储与(本地工作树/父提交/头部提交)进行比较的内容,实际上有几个可用的命令,其中古老的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 的answer 是唯一一个(非常晚)回答问题的最灵活/有用的解释的日期,但它比必要的复杂一点。无需提交和重置,只需存储您的工作副本,比较,然后取消存储。
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 stash save -u 存储未跟踪的文件
以防万一,要比较工作树和存储中的文件,请使用以下命令
git diff stash@{0} -- fileName (with path)
【讨论】:
这适用于 git 版本 1.8.5.2:
git diff stash HEAD
【讨论】:
git stash apply 应用的差异很大。
如果你有差异工具(比如无法比较)
git difftool stash HEAD
【讨论】:
git stash apply 应用的差异很大。
HEAD。我可以修改@yerlilbilgin 的答案以删除 HEAD,但我认为任何使用 git 的人都可以弄清楚这部分,而我延长答案会降低它的可读性。不怪@yerlibilgin。
我相信git diff <current-branchname>..stash@{0} 是比较本地工作树和最近存储之间变化的最直观的方法。根据需要将stash@{0} 替换为适用的存储编号。
请注意git diff stash@{0} 可能会产生误导性结果。如果您的 stash 和当前分支的两个历史记录发生了分歧,则差异看起来就像您在 stash 中添加了所有新内容并删除了当前分支独有的所有内容。
根据git book回答
另外,请注意双点 .. 和三点 ... 指定不同的提交比较,我指的是这个答案的双点。 See the git book for details
【讨论】:
在不移动任何东西的情况下做到这一点的一种方法是利用patch 可以读取 git diff(基本上是统一的 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 将为您提供所需的一切;包括藏匿表演信息。
显示 [
] 将存储中记录的更改显示为存储状态与其原始父级之间的差异。如果没有给出,则显示最新的。默认情况下,该命令显示 diffstat,但它会接受 git diff 已知的任何格式(例如, git stash show -p stash@{1} 以查看补丁形式的第二个最近的存储)。您可以使用 stash.showStat 和/或 stash.showPatch 配置变量来更改默认行为。
【讨论】: