我尚未在分支机构中提交更改。 我决定申请一些藏匿处。 应用自动合并和冲突的隐藏。 我意识到,隐藏的更改不适合我,并且希望取消隐藏更改,但不想在隐藏之前放弃更改。 尝试做
git stash show -p | git apply -R
但这对我不起作用。我的讯息有误: 错误:补丁失败,...错误:补丁不适用
如何撤消存储申请并不丢失未提交的更改?
答案 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