Git stash:“不能申请肮脏的工作树,请进行更改”

时间:2009-09-01 05:47:56

标签: git git-stash

我正在尝试应用我之前用git stash pop隐藏的更改并收到消息:

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

有关如何处理的任何建议吗?

11 个答案:

答案 0 :(得分:192)

当我必须将隐藏的更改应用于脏工作副本时,例如从存储中弹出多个变更集,我使用以下内容:

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

基本上它

  1. 创建补丁
  2. 管道应用命令
  3. 如果有任何冲突,则需要通过3-way merge解决
  4. 如果apply(或merge)成功,则会删除刚才应用的存储项...
  5. 我想知道为什么-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向合并解决冲突。

答案 1 :(得分:55)

我是这样做的:

git add -A
git stash apply

然后(optionaly):

git reset

答案 2 :(得分:9)

您可以通过将您想要的存储导出为补丁文件并手动应用来隐藏当前更改,从而实现此目的。

例如,假设您要将存储@ {0}应用于脏树:

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

    git stash show -p stash @ {0}> Stash0.patch

  2. 手动应用更改:

    git apply Stash0.patch

  3. 如果第二步失败,则必须编辑Stash0.patch文件以修复任何错误,然后再次尝试git apply。

答案 3 :(得分:8)

使用git reset清理工作目录,提交更改,或者,如果要隐藏当前更改,请尝试:

$ git stash save "description of current changes"
$ git stash pop stash@{1}

这将隐藏当前更改,然后从存储堆栈中弹出第二个存储。

答案 4 :(得分:6)

Mathias的解决方案绝对是最接近git stash pop --force(真的,来吧Git开发者,我们已经有了这个选项!)

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

  1. git commit -a -m“Fixme”
  2. git stash pop
  3. git commit -a --amend
  4. git reset HEAD~
  5. 换句话说,提交当前更改的提交(我们永远不会推送)。现在你的工作区很干净,弹出你的藏匿处。现在,提交存储更改作为对先前提交的修正。完成后,您现在可以在一次提交中组合两组更改(“Fixme”);只需重置(--soft NOT --hard,这样就不会丢失任何东西)你的结账到“一次提交之前”,现在你有两组完全未提交的修改。

    **编辑* *

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

    1. git commit -a -m“Fixme”
    2. git stash pop
    3. git reset HEAD~
    4. (提交当前更改,弹出隐藏的更改,重置第一次提交以将两组更改组合在一个未提交的状态。)

答案 5 :(得分:4)

如果你像今天一样发现自己处于这种状况,这些答案都不会有效。不管我做了多少git reset --hard,它让我无处可去。我的回答(不是官方的任何方式):

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

答案 6 :(得分:4)

我还发现Mathias Leppich's solution工作得很好所以我为它的全局.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完成时,我会喜欢一定程度的冗长。)

答案 7 :(得分:3)

您可以通过执行git add暂存您所做的任何更改,从而清理树,从而将存储应用于“脏”树。然后你可以git stash pop并应用隐藏的更改,没问题。

答案 8 :(得分:2)

您有已修改但未提交的文件。之一:

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

答案 9 :(得分:0)

我有同样的问题,但是git没有更改文件。原来我有一个躺着的index.lock文件。删除它解决了这个问题。

答案 10 :(得分:0)

我无法让大部分这些工作;由于某种原因,它总是认为我对文件进行了本地更改。我无法应用存储,修补程序将无法应用,checkoutreset --hard会失败。最终工作的是将存储保存为git stash branch tempbranchname的分支,然后进行正常的分支合并:git checkout mastergit merge tempbranchname。 来自http://git-scm.com/book/en/Git-Tools-Stashing

  

如果您想要一种更简单的方法来再次测试隐藏的更改,您可以   运行git stash分支,为你创建一个新的分支,检查出来   当你把你的工作藏起来时你所做的承诺,重新申请你的工作   在那里,如果成功应用,则删除存储