Py学习  »  Git

git stash:“不能应用于脏的工作树,请准备更改。”

guitsaru • 6 年前 • 1659 次点击  

我正在尝试应用我之前存放的更改 git stash pop 得到信息:

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

有什么关于如何处理的建议吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30766
 
1659 次点击  
文章 [ 11 ]  |  最新文章 6 年前
rwilson04
Reply   •   1 楼
rwilson04    12 年前

我无法让这些文件中的大部分工作;因为某些原因,它总是认为我对一个文件进行了本地更改。我不能申请藏匿,贴片不能申请, checkout reset --hard 失败了。最后起作用的是把藏匿处作为一个分支 git stash branch tempbranchname ,然后执行普通分支合并: git checkout master git merge tempbranchname . 从 http://git-scm.com/book/en/Git-Tools-Stashing :

如果您想要更简单的方法再次测试隐藏的更改,您可以 运行git stash分支,它为您创建一个新的分支,签出 当你把你的工作藏起来,重新申请你的工作时,你所做的承诺 在那里,如果成功的话,就把藏匿的东西扔掉。

boxed
Reply   •   2 楼
boxed    13 年前

我也有同样的问题,但是Git没有修改过的文件。原来我有一个index.lock文件。删除它解决了问题。

brool
Reply   •   3 楼
brool    16 年前

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

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
Chris Vandevelde
Reply   •   4 楼
Chris Vandevelde    13 年前

您可以通过执行 git add 准备你所做的任何更改,从而清理树。然后你可以 git stash pop 应用隐藏的更改,没问题。

mat
Reply   •   5 楼
mat    8 年前

我也发现了 Mathias Leppich's solution 为了工作顺利,我在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时使用冗长的语句。)

Dan Rosenstark
Reply   •   6 楼
Dan Rosenstark    14 年前

如果你像我今天一样发现自己处于这种情况,这些答案都不起作用。不管有多少 git reset --hard 是我干的,什么都没有。我的回答(不是官方的)是:

  1. 找出藏匿点的散列用法 git reflog --all
  2. 把这个哈希和你感兴趣的分支合并起来
machineghost
Reply   •   7 楼
machineghost    13 年前

Mathias的解决方案绝对是最接近Git Stash pop的——force(实际上,C'mon Git devs,让我们已经得到这个选项!)

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

  1. Git提交-a-m“Fixme”
  2. 流行音乐流行歌曲
  3. git commit-a--修正
  4. GIT复位头~

换句话说,对您当前的更改进行提交(我们永远不会推送)。既然你的工作空间是干净的,打开你的藏身处。现在,提交stash更改,作为对以前提交的修改。这样做之后,您现在在一个提交(“fixme”)中合并了两组更改;只需重置(软而不硬,所以实际上没有丢失任何内容)您的签出到“在提交之前一个”,现在您就拥有了两组完全未提交的更改。

**编辑* *

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

  1. Git提交-a-m“Fixme”
  2. 流行音乐流行歌曲
  3. GIT复位头~

(提交当前更改,弹出隐藏的更改,重置第一次提交以使两组更改以未提交状态组合在一起。)

rnicholson
Reply   •   8 楼
rnicholson    16 年前

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

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

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

Ishan
Reply   •   9 楼
Ishan    15 年前

您可以这样做,而无需将当前更改存储,方法是将所需的存储导出为补丁文件,然后手动应用它。

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

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

    git stash show-p stash@0_gt;stash0.patch

  2. 手动应用更改:

    git应用stash0.patch

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

Sergii Mostovyi
Reply   •   10 楼
Sergii Mostovyi    13 年前

我是这样做的:

git add -A
git stash apply

然后(可选):

git reset
muhqu
Reply   •   11 楼
muhqu    11 年前

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

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

基本上

  1. 创建修补程序
  2. 将其传输到apply命令
  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 允许通过三向合并直接解决冲突的参数。