Git diff对付藏匿处

Mag*_*ero 1265 git git-stash

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

Amb*_*ber 1729

查看最新的藏匿处:

git stash show -p
Run Code Online (Sandbox Code Playgroud)

看到任意藏匿:

git stash show -p stash@{1}
Run Code Online (Sandbox Code Playgroud)

git stash联机帮助页:

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

  • `stash @ {0}`是默认值; 如果你想看看以前的藏匿处,你只需要一个参数. (71认同)
  • 这不会显示存储与当前工作目录之间的差异,而是显示存储与其原始父级之间的差异.对?从联机帮助页:"将存储中记录的更改显示为存储状态与其原始父项之间的差异." (68认同)
  • 对.我只是提供它,以便清楚如何查看除"{0}"之外的其他藏匿处. (51认同)
  • @Amber - 是的,虽然如果你当前的工作树很脏,这很重要,并且使它更复杂一点.我从那个角度来看它,并在下面的答案中找到了我分享的程序. (13认同)
  • powershell注:`git stash show -p"stash @ {0}"` (10认同)
  • `-p`代表什么? (3认同)
  • @Gerald"补丁"即显示差异,而不仅仅是提交细节. (3认同)
  • `git stash show -p 1` 用于显示 `stash@{1}` 和 `current` 之间的差异。所以像这样更简洁。 (3认同)
  • 我希望他们将其称为“git stash diff”。 (3认同)
  • @TankorSmash 那是简短的形式。 (2认同)
  • 注意:如果使用fish shell,则需要使用\来转义{},如git stash show -p stash @\{0 \} (2认同)
  • @TankorSmash:对我有用的较短形式: git stash show -p 1 (将显示第二个存储以及差异) (2认同)
  • 更正确的答案是“git diff HEAD stash@{0}”,尽管将存储应用到当前工作树可能会失败,因此不可能显示更改,而只能显示差异。 (2认同)

cze*_*asz 294

要查看最近的藏匿信息:

git stash show -p
Run Code Online (Sandbox Code Playgroud)

要查看任意存储:

git stash show -p stash@{1}
Run Code Online (Sandbox Code Playgroud)

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

您可以使用:

git diff stash@{0} master
Run Code Online (Sandbox Code Playgroud)

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


或者您可以使用:

git diff --name-only stash@{0} master
Run Code Online (Sandbox Code Playgroud)

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

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

t.h*_*ntz 97

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

git diff stash@{0}^!
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些像我一样从未见过^的人!之前:[提交^!是一个范围说明符,表示:此提交,但不包括其父项.](http://stackoverflow.com/q/25651269/1248889) (15认同)
  • 完美的一对:`git difftool stash ^!`用于最后一次存储的差异对提交它是基于,`git difftool stash HEAD`用于针对当前提交的最后一个存储的差异(stash @ {n}用于早期的存储) (4认同)
  • 你在什么壳里?我的要求我引用它:`git diff 'stash@{0}^!'` (2认同)

Mag*_*gne 41

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

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

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


Sen*_*ith 24

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

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
Run Code Online (Sandbox Code Playgroud)

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

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

git stash show
Run Code Online (Sandbox Code Playgroud)

或@ czerasz的回答

git diff stash@{0}
Run Code Online (Sandbox Code Playgroud)

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

git stash apply
git diff
git reset
git checkout
Run Code Online (Sandbox Code Playgroud)

  • 这种简单的方法(藏匿,然后与另一个存储进行比较)安全且易于理解.对于某些用例,您可能还希望使用`git stash save -u`存储未跟踪的文件 (3认同)

Dav*_*ost 23

根据您想要将 stash 与(本地工作树/父提交/头部提交)进行比较的内容,实际上有几个命令可用,其中的 good oldgit 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       ?   /               ?
????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

虽然git stash show乍一看对用户更友好,但git diff实际上更强大,因为它允许为更集中的差异指定文件名。我个人在我的zsh git plugin 中为所有这些命令设置了别名。

  • 这是唯一正确的答案(至少从 git 2.17.1 开始)这是唯一具有“git stash show -l”以及更多信息的答案。非常感谢您发布它 - 我们如何将其推到顶部?在最上面的评论上发表评论吗? (3认同)
  • 运行“git stash show -l”时出现“错误:开关“l”需要一个值” (2认同)
  • 在较新版本的 git 中,“-l”不再是有效选项。 (2认同)
  • 根据您的 shell(例如 PowerShell),您可能需要将带大括号的参数放在引号内(例如 `git diff "stash@{0}"`) (2认同)

Pra*_*B R 20

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

git diff stash@{0} -- fileName (with path)
Run Code Online (Sandbox Code Playgroud)


Rim*_*ian 19

这对git版本1.8.5.2适用于我:

git diff stash HEAD
Run Code Online (Sandbox Code Playgroud)

  • 误导!问题是:我如何才能看到取消隐藏将对当前工作树进行的更改?这显示了stash和HEAD之间的差异可能与git stash apply的差异非常不同。 (2认同)

cii*_*yan 10

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

\n

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

\n

根据git书回答

\n

另外,请注意,双点..和三点...指定不同的提交比较,我指的是这个答案的双点。详情请参阅git书籍

\n


yer*_*gin 9

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

git difftool stash HEAD
Run Code Online (Sandbox Code Playgroud)


xen*_*orb 6

在不移动任何东西的情况下做到这一点的一种方法是利用patch可以读取 git diff 的事实(基本上是统一的差异)

git stash show -p | patch -p1 --verbose --dry-run
Run Code Online (Sandbox Code Playgroud)

这将向您展示补丁通常会执行的操作的逐步预览。这样做的额外好处是,补丁也不会阻止自己将补丁写入工作树,如果由于某种原因你真的需要 git 停止修改前的提交,请继续并删除 --dry-运行并按照详细说明进行操作。


Raú*_*tín 5

她的藏品清单

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Run Code Online (Sandbox Code Playgroud)

因此,获取隐藏号码并执行以下操作:

你可以做:

 git stash show -p stash@{1}
Run Code Online (Sandbox Code Playgroud)

但是如果您想要一个差异(这与显示存储不同,这就是我写这个答案的原因。Diff考虑分支中的当前代码并show仅显示您将应用的内容

您可以使用:

git diff stash@{0}
Run Code Online (Sandbox Code Playgroud)

或者

git diff stash@{0} <branch name>
Run Code Online (Sandbox Code Playgroud)

另一件有趣的事情是:

git stash apply
git stash apply stash@{10}
Run Code Online (Sandbox Code Playgroud)

这会应用存储,而不将其从列表中删除,您可以git checkout .删除这些更改,或者如果您愿意git stash drop stash@{10}从列表中删除存储。

从这里开始,我从不建议使用和git stash pop的组合。如果您在错误的分支中应用存储,那么有时很难恢复您的代码。git stash applygit stash drop