Git藏匿:“不能适用于一个肮脏的工作树,请阶段您的更改”

我正在尝试应用先前用git stash popgit stash pop隐藏的更改并获取消息:

 Cannot apply to a dirty working tree, please stage your changes 

任何build议如何处理?

当我不得不将隐藏的修改应用于一个脏的工作副本时,例如从隐藏中popup多个修改集,我使用以下命令:

 $ git stash show -p | git apply -3 && git stash drop 

基本上它

  1. 创build一个补丁
  2. pipe道应用命令
  3. 如果有任何冲突,则需要通过三方合并来解决
  4. 如果应用(或合并)成功,则删除刚应用的存储项目…

我想知道为什么没有-f (强制)选项的git stash pop ,应该像上面的一行一样。

在此期间,您可能需要添加这个一行作为一个git别名:

 $ git config --global --replace-all alias.unstash \ '!git stash show -p | git apply -3 && git stash drop' $ git unstash 

感谢@SamHasler指出-3参数,它允许直接通过3路合并来解决冲突。

我这样做:

 git add -A git stash apply 

然后(optionaly):

 git reset 

您可以执行此操作,而不必通过导出所需的存储作为修补程序文件并手动应用它来隐藏当前的更改。

例如,假设你想把一个@ {0}应用到一个脏树:

  1. 将存储@ {0}导出为补丁:

    git隐藏显示-p隐藏@ {0}> Stash0.patch

  2. 手动应用更改:

    git应用Stash0.patch

如果第二步失败,您将不得不编辑Stash0.patch文件来修复任何错误,然后再次尝试使用git apply。

或者用git reset清理你的工作目录,提交更改,或者,如果你想存储当前的更改,请尝试:

 $ git存储保存“当前更改的说明”
 $ git stash pop stash @ {1}

这将储存当前的变化,然后从藏匿栈中popup第二个藏匿处。

Mathias的解决scheme绝对是最接近git stash pop – (真的,来吧,Git开发者,让我们已经得到这个选项!)

但是,如果你只想使用git命令来做同样的事情,你可以:

  1. git commit -a -m“Fixme”
  2. 混帐隐藏stream行
  3. git commit -a –amend
  4. git reset HEAD〜

换句话说,做一个提交(我们永远不会推)你当前的变化。 现在你的工作区是干净的,popup你的藏匿处。 现在,将存储更改作为您之前提交的修正。 做完这些之后,您现在可以在一次提交中合并这两组更改(“Fixme”); 只是重置( – 软,不 – 硬,所以没有任何实际上是丢失)您的结帐“之前提交”,现在你有两套变化,完全没有提交。

**编辑* *

我刚刚意识到这实际上更容易; 你可以完全跳过第3步,所以…

  1. git commit -a -m“Fixme”
  2. 混帐隐藏stream行
  3. git reset HEAD〜

(提交当前的更改,popup隐藏的更改,重置第一次提交,以便在未提交状态下组合这两组更改。)

如果您像今天这样发现自己处于这种状况,那么这些答案实际上都不起作用。 不pipe我做了多less次git reset --hard ,它都让我无处可去。 我的回答(不是官方的):

  1. 找出存储的哈希使用git reflog --all
  2. 将该散列与您感兴趣的分支合并

我也发现Mathias Leppich的解决scheme工作得很好,所以我给它的全局.gitconfig添加了一个别名

 [alias] apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop 

现在我可以打字了

 git apply-stash-to-dirty-working-tree 

这对我很好。

(你的里程可能会在这个长的别名上有所不同,但是当bash完成的时候,我喜欢一些冗长的话)

你可以通过git add一个git addgit add你所做的更改,从而清理树。 然后,你可以git stash pop并应用隐藏的变化,没问题。

您有已被修改但未提交的文件。 或者:

 git reset --hard HEAD (to bring everything back to HEAD) 

或者,如果您想保存更改:

 git checkout -b new_branch git add ... git commit git checkout -b old_branch git stash pop 

我有同样的问题,但git有零改变的文件。 原来我有一个index.lock文件躺在附近。 删除它解决了这个问题。

我无法获得大部分的工作。 由于某种原因,它总是认为我有一个文件的本地更改。 我不能申请一个藏匿,补丁将不适用, checkoutreset --hard失败。 最后工作是保存存储为一个分支与git stash branch tempbranchname ,然后做一个正常的分支合并: git checkout mastergit merge tempbranchname 。 从http://git-scm.com/book/en/Git-Tools-Stashing

如果你想要一个更简单的方法来再次testing隐藏的变化,你可以运行git stash branch,它会为你创build一个新的分支,当你隐藏你的工作时检查你的提交,重新应用你的工作,然后删除如果成功应用则隐藏