如何撤消部分git存储?

时间:2014-02-28 23:56:53

标签: git git-stash

我有一个脏工作目录,并使用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

1 个答案:

答案 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时,我们会使索引和工作目录匹配(它们都包含未被存储的更改)。同样,当我们创建提交时,它们匹配。 (它们都没有变化)