如何撤消git stash的应用

时间:2018-11-28 14:43:18

标签: git

我尚未在分支机构中提交更改。 我决定申请一些藏匿处。 应用自动合并和冲突的隐藏。 我意识到,隐藏的更改不适合我,并且希望取消隐藏更改,但不想在隐藏之前放弃更改。 尝试做

git stash show -p | git apply -R

但这对我不起作用。我的讯息有误: 错误:补丁失败,...错误:补丁不适用

如何撤消存储申请并不丢失未提交的更改?

1 个答案:

答案 0 :(得分:2)

反向应用存储的问题是由于合并冲突引起的。如果您想深入探讨这一点,我将在最后详细介绍,但更重要的是:该怎么做?

通常git stash apply是相当安全的命令。它要求工作树与索引匹配,并且只希望写入工作树,所以撤消似乎很容易。

但是,当发生冲突时,可能会有些痛苦,因为现在它会更新索引以解决冲突。因此,每个文件现在(至少)有五个可能的状态:

1)本地更改和存储都未对文件进行更改。这里没什么。

2)您对文件应用了本地更改,并且存储没有对文件应用更改。您本地更改的版本已包含在索引中,您可以将其保留下来。

3)您尚未对文件应用本地更改,并且存储确实对其进行了更改。索引包含由隐藏修改的文件。这看起来很像情况2,因此知道区别是第一个挑战(请参阅下文)。一旦确定了处于这种状态的文件,就可以将该文件还原为以前提交的版本(但可能还不想恢复;再次参见下文)

git checkout HEAD -- file/with/only/stashed/changes

4)您已对文件应用了本地更改,并且存储对同一文件应用了冲突的更改。在这种情况下,文件的带有冲突标记的版本在工作树中。您可以通过说来恢复您的版本

git checkout --ours -- file/with/conflicting/changes

5)您已将本地更改应用于文件,并且存储将更改应用于同一文件,但更改没有冲突(即自动合并解析成功合并了更改)。这是最大的问题案例。再次看起来很像情况2和3,要解决此问题,您需要将更改与存储所添加的更改分开。

好,因此情况1和2不采取任何行动,而情况4很容易找到和解决。问题是3和5。有两种方法可以解决此问题:

在您之前尝试做的基础上,您可以从存储库中存储补丁,并删除冲突文件的条目。然后,您将与checkout --ours解决冲突,然后反向应用其余补丁。

您可以使用

逐个文件地处理它
git stash show --name-only

查看存储是否修改了文件,诸如此类

git diff stash -- path/to/file

查看文件是否包含本地修改。对于在两个地方都没有冲突地修改的文件,您仍然必须进行诸如反向修补之类的操作。

为什么补丁不起作用

由于冲突标记,无法将隐藏项作为补丁反向应用。例如,也许您是从一个文件开始的

this
is
content

藏匿处想要将其更改为

here
is
content

但是您已经在本地将其更改为

this
file contains
content

因此stash apply发生冲突。好吧,现在工作副本说

<<<<<<< Updated upstream
this
file contains
=======
here
is
>>>>>>> stashed changes
content

隐藏的反向补丁会将第1行从here更改为this,但在第1行找不到here