Git 吉特藏匿处:“;无法应用于脏的工作树,请进行更改“;

Git 吉特藏匿处:“;无法应用于脏的工作树,请进行更改“;,git,git-stash,Git,Git Stash,我正在尝试应用我先前用git stash pop隐藏的更改,并获得以下消息: Cannot apply to a dirty working tree, please stage your changes 关于如何处理这个问题,有什么建议吗?可以使用git reset清理工作目录,提交更改,或者,如果要隐藏当前更改,请尝试: $ git stash save "description of current changes" $ git stash pop stash@{1} $git stas

我正在尝试应用我先前用
git stash pop
隐藏的更改,并获得以下消息:

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

关于如何处理这个问题,有什么建议吗?

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

$ git stash save "description of current changes" $ git stash pop stash@{1} $git stash save“当前更改的说明” $git stash pop stash@{1}
这将隐藏当前更改,然后从隐藏堆栈中弹出第二个隐藏。

您有已修改但未提交的文件。要么:

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

通过将所需的隐藏导出为修补程序文件并手动应用它,您无需隐藏当前更改即可完成此操作

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

  • 将stash@{0}导出为修补程序:

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

  • 手动应用更改:

    git apply Stash0.patch


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

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

    $ git stash show -p | git apply -3 && git stash drop
    
    基本上是这样

  • 创建一个补丁
  • 将其应用到“应用”命令的管道
  • 如果存在任何冲突,则需要通过三方合并解决
  • 如果应用(或合并)成功,它将删除刚刚应用的隐藏项
  • 我想知道为什么没有
    -f
    (force)选项用于
    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
    参数,该参数允许通过三方合并直接解决冲突。

    如果您发现自己像我今天这样处于这种情况,这些答案实际上都不起作用。不管我做了多少次git重置--hard,我都一事无成。我的回答(无论如何都不是官方的):

  • 使用git reflog--all
  • 将该散列与您感兴趣的分支合并
  • 我还发现它工作得很好,所以我在我的global.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没有任何更改的文件。结果发现我有一个index.lock文件。删除它解决了问题。

    您可以通过执行
    git add
    来对“脏”树应用隐藏,从而对树进行清理。然后你可以
    git-stash-pop
    并应用隐藏的更改,没问题。

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

    但是,如果只想使用git命令执行相同的操作,可以:

  • git commit-a-m“Fixme”
  • 吉特隐藏流行音乐
  • git提交-a--amend
  • git复位头~
  • 换句话说,对您当前的更改进行提交(我们永远不会推动)。现在你的工作区已经干净了,打开你的储藏室。现在,将隐藏更改提交为对以前提交的修改。完成后,您现在将两组更改组合在一个提交(“Fixme”)中;只需将您的签出重置为“提交之前的一次”,现在您有两组更改,完全未提交

    **编辑**

    我刚刚意识到这其实更容易;你可以完全跳过第三步,所以

  • git commit-a-m“Fixme”
  • 吉特隐藏流行音乐
  • git复位头~
  • (提交当前更改,弹出隐藏的更改,重置第一次提交,以使两组更改以未提交状态合并。)

    我这样做:

    git add -A
    git stash apply
    
    然后(可选):


    我无法让这些大部分工作;出于某种原因,它总是认为我对文件进行了本地更改。我无法应用隐藏,修补程序不会应用,
    签出
    重置--硬
    失败。最后有效的方法是使用
    git stash branch tempbranchname
    将存储保存为一个分支,然后执行正常的分支合并:
    git checkout master
    git merge tempbranchname
    。 发件人:

    如果您想要一种更简单的方法来再次测试隐藏的更改,您可以 运行git stash branch,它会为您创建一个新的分支 当你隐藏你的作品时,你所做的承诺,重新应用你的作品 如果成功应用,则删除隐藏


    这对于我对一个目录进行重构(删除它,并创建一个带有其名称的符号链接)的情况来说是切实可行的。Git无法判断我的工作副本更改是什么。这非常有效。虽然我很确定我的工作树是干净的,但我无法应用隐藏。是的,我必须删除关于二进制文件的行。非常感谢。我对Git在我的本地回购协议中的奇怪行为感到失望,这与您描述的问题相同。
    Git stash show-p | Git apply
    不同于
    Git stash apply
    ?如果您有脏的工作副本,
    Git stash apply
    将不会应用隐藏的更改。因此,您可以将
    git stash show-p | git apply
    视为某种强制隐藏应用。不起作用,但有帮助:git重置磁头,然后取消存储更改。其中一个文件出现“错误:修补程序失败…修补程序不应用”。我希望它给出一个合并冲突。这个解决方案对我不起作用,它失败了,错误是:每个修改的文件的索引不匹配。不过,成功了。但这家伙想申请两个藏匿处@Elazar,你在读这个问题。OP
    git reset