gpt4 book ai didi

git - 如何撤消 git stash apply

转载 作者:行者123 更新时间:2023-12-04 11:29:08 25 4
gpt4 key购买 nike

我还没有在我的分支中提交更改。
我决定应用我的一些 stash 。
Stash 应用了自动 merge 和冲突。
我意识到, stash 的更改不适合我,并且想要取消 stash 更改,但不要在 stash 之前松开我的更改。
试图做

git stash show -p | git apply -R

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

如何撤消存储应用而不丢失我未提交的更改?

最佳答案

反向应用存储的问题是由于 merge 冲突。如果你想深入研究,我会在最后详细介绍,但更重要的是:该怎么做?

一般git stash apply是一个相当安全的命令。它要求工作树与索引匹配,并且只期望写入工作树,因此似乎很容易撤消。

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

1)您的本地更改和存储都没有对文件应用更改。这没东西看。

2) 您对文件应用了本地更改,并且存储未对文件应用更改。您本地更改的版本在索引中,您可以不理会这个文件。

3)您没有对文件应用本地更改,并且存储确实对其应用了更改。索引包含由 stash 修改的文件。这看起来很像案例 2,所以了解差异是第一个挑战(见下文);一旦您识别出处于此状态的文件,您就可以将此文件恢复到先前提交的版本(但可能还不想;再次,见下文)

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

4) 您已对文件应用了本地更改,并且存储对同一文件应用了冲突更改。在这种情况下,文件的冲突标记版本位于工作树中。您可以通过说来恢复您的版本
git checkout --ours -- file/with/conflicting/changes

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

好的,所以案例 1 和案例 2 不采取任何行动,而案例 4 很容易找到并解决。问题是 3 和 5。有两种方法可以解决这个问题:

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

你可以一个文件一个文件地处理它,使用
git stash show --name-only

查看存储是否修改了文件,以及类似的内容
git diff stash -- path/to/file

查看文件是否包含本地修改。您仍然需要对在两个地方都修改过的文件进行反向修补而不会发生冲突。

为什么补丁不起作用

由于冲突标记,存储不能作为补丁反向应用。例如,也许你从一个文件开始
this
is
content

并且 stash 想要将其更改为
here
is
content

但是你在本地把它改成了
this
file contains
content

所以 stash apply发生了冲突。好吧,现在工作副本说
<<<<<<< Updated upstream
this
file contains
=======
here
is
>>>>>>> stashed changes
content

来自 stash 的反向补丁会将第 1 行从 here 更改为至 this ,但没有找到 here在第 1 行

关于git - 如何撤消 git stash apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com