我试图使用git stash pop
应用之前存储的更改,但是出现以下消息:
Cannot apply to a dirty working tree, please stage your changes
你对如何处理这个问题有什么建议吗?
当我需要将暂存的更改应用到脏工作副本中,例如从暂存中弹出多个变更集时,我会使用以下命令:
$ git stash show -p | git apply -3 && git stash drop
基本上它
我想知道为什么 git stash pop
没有-f
(force)选项,它应该与上面的一行代码完全相同。
同时,您可能希望将此一行代码作为 git 别名添加:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
感谢@SamHasler指出的-3
参数,它可以通过三方合并直接解决冲突。我是这样做的:
git add -A
git stash apply
然后(可选):
git reset
git add -u
命令,它类似于-A
但不会添加未跟踪的文件。 - Brad Cupit您可以通过将所需的存储内容导出为补丁文件并手动应用,而无需隐藏当前更改来完成此操作。
例如,假设您想将 stash@{0}
应用于脏树:
Export stash@{0}
as a patch:
git stash show -p stash@{0} > Stash0.patch
Manually apply the changes:
git apply Stash0.patch
如果第二步失败,您将需要编辑Stash0.patch
文件来修复任何错误,然后再次尝试git apply
。
$ git stash save "当前更改的描述" $ git stash pop stash@{1}这将会把当前更改暂存,并且从暂存栈中弹出第二个暂存。
git stash pop --force 的(而且真的,来吧Git开发人员,让我们得到这个选项!)
然而,如果您想仅使用Git命令执行相同的操作,可以执行以下操作:
git commit -a -m“ Fixme”
git stash pop
git reset HEAD〜
换句话说,制作一个提交(我们永远不会推动它)来保存当前更改。现在,通过弹出存储区来清除您的工作区。现在,将存储区更改作为先前提交的修正提交。完成此操作后,您现在拥有两组更改组合在单个提交(“ Fixme”)中。只需重置您的检出以使其指向“ Fixme”提交之前的提交即可。
编辑
我刚意识到实际上更简单了,您可以完全跳过第三步,因此...
git commit -a -m“ Fixme”
git stash pop
git reset HEAD〜
(提交当前更改,弹出存储的更改,重置第一个提交以获得未提交状态下的两组更改的组合。)
如果你像我今天一样发现自己处于这种情况,那么这些答案都不起作用。无论我执行了多少次 git reset --hard
,都没有任何效果。我的解决方案(并非官方解决方案)如下:
git reflog --all
我还发现Mathias Leppich的解决方案非常有效,所以我在我的全局.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 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
我试图运行这些命令时,大部分都无法正常工作;由于某种原因,它总是认为我对文件进行了本地更改。我无法应用藏匿,补丁无法应用,checkout
和 reset --hard
也失败了。最终有效的方法是将藏匿保存为一个分支,使用git stash branch tempbranchname
,然后执行普通的分支合并:git checkout master
和 git merge tempbranchname
。
来自http://git-scm.com/book/en/Git-Tools-Stashing:
如果您想要一种更简单的方式来再次测试藏匿的更改,可以运行 git stash branch,它会为您创建一个新分支,检查您藏匿工作时的提交记录,将您的工作重新应用到该提交记录,如果成功应用,则删除藏匿。
git stash apply
将不会应用存储的更改。因此,您可以将git stash show -p | git apply
视为某种强制暂存应用。 - muhqu