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

ave*_*net 132 git git-stash

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

Cannot apply to a dirty working tree, please stage your changes
Run Code Online (Sandbox Code Playgroud)

关于如何处理的任何建议?

muh*_*hqu 195

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

$ git stash show -p | git apply -3 && git stash drop
Run Code Online (Sandbox Code Playgroud)

基本上它

  1. 创建一个补丁
  2. 管道到apply命令
  3. 如果有任何冲突,则需要通过3向合并解决
  4. 如果apply(或merge)成功,则删除刚才应用的存储项...

我想知道为什么没有-f(强制)选项git stash pop应该完全像上面的单线程一样.

在此期间,您可能希望将此单行添加为git别名:

$ git config --global --replace-all alias.unstash \
   '!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Run Code Online (Sandbox Code Playgroud)

感谢@SamHasler指出-3允许通过3向合并直接解决冲突的参数.

  • +1效果很好.正是我正在寻找的那种行为(一些pop - force of forces).我也很奇怪为什么不作为一种选择. (7认同)
  • 其中一个文件出现"错误:补丁失败...补丁不适用".我希望它发生合并冲突. (4认同)
  • 此解决方案对我不起作用,它因“错误:<文件> 与每个修改过的文件的索引不匹配”而失败。但是,[另一个解决方案](/sf/answers/813921741/) 奏效了。 (2认同)

Ser*_*vyi 57

我是这样做的:

git add -A
git stash apply
Run Code Online (Sandbox Code Playgroud)

然后(optionaly):

git reset
Run Code Online (Sandbox Code Playgroud)

  • 我使用了 `git add -u`,它类似于 `-A`,只是它不添加未跟踪的文件。 (4认同)
  • +1!这比涉及生成补丁或修改提交的其他解决方案更简单,并且它可以使您的本地更改与应用的隐藏更改安全隔离,直到您确定更改已正确合并为止. (2认同)

Ish*_*han 9

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

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

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

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

  2. 手动应用更改:

    git应用Stash0.patch

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


Wil*_*ell 8

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

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

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

  • 但是这家伙想要应用两个藏匿处! (5认同)

mac*_*ost 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~

换句话说,进行当前更改的提交(我们永远不会推送).现在你的工作区很干净,弹出你的藏匿处.现在,提交存储更改作为对先前提交的修正.完成后,您现在可以在一次提交中组合两组更改("Fixme"); 只是重置(--soft NOT --hard所以没有任何实际丢失)你的结账到"一次提交之前",现在你有两组更改,完全没有提交.

**编辑**

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

  1. git commit -a -m"Fixme"
  2. git stash pop
  3. git reset HEAD~

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