我有一个脏工作目录,并使用git stash save -p
有选择地隐藏了一些更改。我的目的是将以前的大型提交分成两个较小的提交。现在的问题是我不小心藏了错误的thunk,所以我想再做一次。我按照this question的建议尝试了git stash pop
,但是这样做会给我这个错误:
error: Your local changes to the following files would be overwritten by merge:
my_file.js
Please, commit your changes or stash them before you can merge.
Aborting
答案 0 :(得分:2)
对我来说,以下就足够了:
% git add myfile.js
% git stash pop
% git reset myfile.js
或者,提交myfile.js,然后弹出存储,解决任何冲突。要摆脱虚拟提交,git reset --soft HEAD^
。类似的东西:
% git add myfile.js
% git commit
% git stash pop
# resolve conflicts if needed
% git reset --soft HEAD^
--soft
表示不要触及工作树或索引; HEAD^
表示在最后一个之前提交。
手册实际上提到了这种行为,但直到现在我才注意到它:
pop [--index] [-q|--quiet] [<stash>]
从隐藏列表中删除单个隐藏状态,并将其应用于当前工作树状态之上,即执行
git stash save
的反向操作。 工作目录必须与索引匹配。
(强调我的)当我们执行git add
时,我们会使索引和工作目录匹配(它们都包含未被存储的更改)。同样,当我们创建提交时,它们匹配。 (它们都没有变化)