撤销 IntelliJ 智能检出操作

30

IntelliJ有一个理论上非常酷的功能,称为Smart Checkout。当您正在更改分支并且您有在当前分支中修改但尚未提交的文件时,此功能就会启动。

它不会强制您提交、存储或搁置您的更改,而是为您保存它们,切换分支,然后在新分支中运行stash pop

我想有时候这正是您想要的,但我在切换到错误的分支时运行了此操作。

所以,现在我的master分支中充满了属于另一个分支的更改,一些文件报告了合并冲突,我感到非常痛苦。

我的目标是:

  1. 从主分支上干净地移除这些更改。
  2. 将它们移回我正在工作的分支。

有没有办法做到这一点?


2
顺便说一下,失去这些更改非常痛苦...几天的工作。我很想把它们找回来。 - mlissner
2
这种魔法正是我为什么更喜欢使用IDE VCS集成进行只读操作,并始终在命令行上添加、隐藏、提交等。无论如何,你可以使用git工具轻松地恢复存储的更改(这里有许多相关的问题,例如https://dev59.com/NXVD5IYBdhLWcg3wGXlI)。 - ThiefMaster
使用像Atlassian Sourcetree这样的工具将警告您,您的本地更改将被检出覆盖,从而避免此情况!我认为像git这样的命令行工具可能会做同样的事情,但我不能100%确定。 - mvd
请参见:https://dev59.com/J2oy5IYBdhLWcg3wfeIR - Jonathan.Brink
3
我有同样的问题。我期望这个功能会把更改存储起来,然后切换到新的分支。然后当我回到旧的分支时,它会记住之前存储的更改。 - vaughan
4个回答

12

如果在stash pop期间遇到合并冲突,以下至少是部分可行的答案。正如我的问题所提到的,stash被智能检出功能用于隐藏本地更改,然后在检出新分支后将它们应用于该分支。

IntelliJ的做法是在你现在所在的分支上使用stash,然后在你要切换到的分支上使用stash pop

当更改被隐藏时,它们会被放到一个堆栈的隐藏更改中,位于顶部。然后,当stash pop运行时,这些更改会从堆栈中弹出并应用。

至少在大多数情况下,这就是发生的情况。但是,如果有合并冲突,IntelliJ会通知您,并保留存储。您可以通过运行以下命令查看隐藏更改的堆栈:

git stash list

如果您需要的存储仍在列表中,您可以执行以下操作:检出最初的分支,重置它,然后执行stash apply,这类似于stash pop,但不会从列表中删除存储。因此:

git checkout $original-branch
git reset HARD
git stash apply

然后,如果一切顺利,您可以使用以下命令移除存储:

git stash pop

git stash drop

由于这个答案比较粗糙,只覆盖了一种情况,我将其标记为社区共享文档。非常欢迎改进。


11

虽然我来晚了,但我在使用IntelliJ的Smart Checkout时有点担心今天早上的工作丢失了。所以我查看是否有解决方法,然后发现这个问题。

很遗憾,我的git存储列表是空的(可能是因为我尝试合并冲突文件),所以我无法使用其他答案中提供的建议。

我开始在项目根目录的本地历史记录(右键单击编辑器>本地历史记录>显示历史记录)中查找,以尝试获取所有缺少的更改,并注意到一个名为Uncommitted_changes_before_Checkout_at_27_04_2022_12_06__Changes.xml的更改。如您在屏幕截图中所见,此文件位于项目的.idea/shelf文件夹中。

它与一个几乎同名的文件夹“Uncommitted_changes_before_Update_at_27_04_2022_12_06_[Changes]”相关联,两者在Smart Checkout之后不久都不会被删除,因为我有另一对日期为20/04/2022的文件。

该文件夹包含一个shelved.patch文件,其中以屏幕截图中显示的格式汇总了您的所有更改(我向您保证,我今天早上的工作不仅仅是添加console.log)。

IntelliJ的存储功能使用此shelved.patch文件,允许您查看所有这些更改并根据需要重新应用它们。您可以从菜单栏中访问存储区(Git>未提交的更改>显示存储区)

IntelliJ将我所有的本地更改都存储起来,也发生在更新期间出现错误时:合并错误:无法写入./git/index

在存储后,项目已成功更新,我可以取消存储我想要的更改。


1
这个帮了我大忙,谢谢。 - Mustapha-Belkacim

7

由于合并失败导致冲突,因此存储的内容未从堆栈中删除,保留了未提交的更改。在这种情况下,git stash list命令应显示存储。

首先强制检出原始分支。这将忽略合并冲突。

git checkout -f $original-branch

然后重置工作目录以删除尝试合并所做的任何更改。

git reset --hard HEAD

接着,应用暂存的更改。这不会从堆栈中删除暂存。

git stash apply

请确认您已经完成所有必要的更改,然后移除存储区。

git stash drop

我只是想回到我的旧分支,但合并冲突不让我这么做。强制检出是关键。 - Noumenon

1

当我尝试这里的建议都不起作用时,我感到非常失望。git stash list什么也没有显示。

然后我再次查看了PyCharm的“Shelf”选项卡(在提交选项卡下),并在名为“最近删除”的部分下查找。哇,我的文件都在那里。我只需右键单击并执行“取消存档”,这些更改就会显示为准备在提交选项卡上进行的更改。

呼~


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接