如何反向申请藏匿?

我有一个小补丁保存在我的git存储。 我已经将它应用到我的工作副本使用git stash apply 。 现在,我想通过反向应用修补程序来退出这些更改(有点像git revert会对存储进行git revert )。

有谁知道如何做到这一点?

澄清:我的工作副本还有其他更改。 我的具体情况很难描述,但是您可以想象一些debugging或实验代码。 现在它在我的工作副本中与其他一些变化混合在一起,我希望看到有没有变化的影响。

它看起来不像stash支持这个,但一个git stash apply --reverse将是一个不错的function。

根据git-stash联机帮助页 ,“一个stash被表示为一个commit它的树logging了工作目录的状态,它的第一个父节点是在创buildstash时在HEAD处的提交”和git stash show -p给了我们“这个变化logging在隐藏状态和原始父母之间的差异。

要保持其他更改不变,请使用git stash show -p | patch --reverse git stash show -p | patch --reverse如下所示:

 $ git init Initialized empty Git repository in /tmp/repo/.git/ $ echo Hello, world >messages $ git add messages $ git commit -am 'Initial commit' [master (root-commit)]: created 1ff2478: "Initial commit" 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 messages $ echo Hello again >>messages $ git stash $ git status # On branch master nothing to commit (working directory clean) $ git stash apply # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: messages # no changes added to commit (use "git add" and/or "git commit -a") $ echo Howdy all >>messages $ git diff diff --git a/messages b/messages index a5c1966..eade523 100644 --- a/messages +++ b/messages @@ -1 +1,3 @@ Hello, world +Hello again +Howdy all $ git stash show -p | patch --reverse patching file messages Hunk #1 succeeded at 1 with fuzz 1. $ git diff diff --git a/messages b/messages index a5c1966..364fc91 100644 --- a/messages +++ b/messages @@ -1 +1,2 @@ Hello, world +Howdy all 

编辑:

一个轻量级的改进就是使用git apply来代替补丁:

 git stash show -p | git apply --reverse 

或者,你也可以使用git apply -R作为git apply --reverse的简写。

我最近发现这个真的很方便

git stash [save]你的工作目录状态和你的索引状态,并把它们保存起来,把索引和工作区域设置为HEAD版本。

git stash apply会带回这些更改,所以git reset --hard会再次删除它们。

git stash pop带回这些变化,并删除顶部藏起来的变化,所以在这种情况下, git stash [save]将返回到先前(pre-pop)状态。

从git手册页直接剪切n贴很明显的措辞,甚至包括一个别名;

取消应用存储在某些使用情况下,您可能想要应用存储的更改,请执行一些操作,然后取消应用最初来自存储的更改。 Git不提供这样一个隐藏的不适用命令,但是可以通过简单地检索与隐藏相关联的补丁并相反地应用它来实现该效果:

 $ git stash show -p stash@{0} | git apply -R 

再一次,如果你不指定一个存储,Git假定最近的存储:

 $ git stash show -p | git apply -R 

您可能想要创build一个别名,并有效地添加一个隐藏不适用的命令到您的Git。 例如:

 $ git config --global alias.stash-unapply '!git stash show -p | git apply -R' $ git stash apply $ #... work work work $ git stash-unapply 
 git checkout -f 

将删除任何非提交更改。

这是很长时间以上,但如果我正确的插入问题,我已经find了一个简单的解决scheme,请注意,这是我自己的术语解释:

git stash [save]将保存当前的更改并将当前分支设置为“clean state”

git stash list给出类似于: stash@{0}: On develop: saved testing-stuff

git apply stash@{0}将设置当前分支,如前所示 stash [save]

git checkout . 将当前分支设置为stash [save] stash [save]

保存在存储器中的代码不会丢失,可以通过git apply stash@{0}再次find。

Anywhay,这为我工作!

除了@Greg培根的答案,以防二进制文件被添加到索引,并成为藏匿使用的一部分

 git stash show -p | git apply --reverse 

可能导致

 error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line error: <YOUR_NEW_FILE>: patch does not apply 

增加 – --binary解决了这个问题,但不幸的是还没有弄清楚为什么呢。

  git stash show -p --binary | git apply --reverse