撤消 Git Stash Pop 冲突

您可以使用本文中的解决方案撤消 git stash pop with merge conflicts。 我们向您展示了如何中止错误的 stash pop 操作并返回到干净状态。

但我们也演示了一种解决冲突和撤消 git stash pop 新的好合并的方法。


Git Stash Pop 合并冲突——问题所在

在快节奏的开发人员的工作流程中,隐藏当前状态并在新想法出现时跳转到其他功能是很常见的。

当我们完成新功能的工作时,我们使用 git stash pop 命令应用隐藏的更改。 但有时,这种来回的工作流程会导致合并冲突。

在这种情况下,您可能想做以下两件事之一。

  1. 中止错误的合并并返回到以前的干净状态。
  2. 您可能希望在本地编辑文件/目录或从远程存储库中拉取以解决合并冲突。 然后您可以将正确的更改与新的提交合并。

让我们看看这两种解决方案。


Undo Git Stash Pop With Conflicts – 中止不良合并以返回干净状态

如果要删除错误的 stash pop 操作中的更改,您应该使用以下任何命令。 这些方法将中止所有导致合并冲突的更改并返回到以前的健康状态。

git reset --merge

首先,让我们看一下设置。 我们有一个包含一些文件的主分支,如下所示:

master branch initial setup

然后我们从中 fork 一个 new_branch 本地分支。 我们修改了这个分支中的一些文件并提交了这些更改。

new branch initial setup

我们现在对 file1.txt 和 file2.txt 进行一些更改。 然后我们存储这些更改。

$ git stash -u -m "Modify file1 and file2 in new_branch"

git stash 在这里有几个选项。 -u 标志让我们隐藏未跟踪的更改。

-m 标志具有相同的含义 – 它允许我们向我们的存储添加语义消息。

stash in new branch

现在,我们在 master 分支中对相同的 file1.txt 和 file2.txt 进行一些更改。 这些文件在我们的 master 和 new_branch 中有不同的版本。

modify files master after fork

如果我们要在master分支中应用stash,file1和file2这些不同的版本就会产生冲突。

git stash pop conflicts

如果我们现在检查我们的存储库,由于错误的合并尝试,我们会在其中发现奇怪的文件。

git stash pop conflicts weird behavior

我们可以使用带有一些选项的 reset 命令来撤销失败的 stash pop。

$ git reset --merge

git reset 最近学会了 –merge 选项。 –merge 选项类似于默认的 –mixed 选项,但它仅适用于受合并操作影响的文件。

在我们的例子中,我们看到这个命令的结果是 git undo bad stash pop 。

git reset merge

git checkout -f

我们可以通过传递 -f 标志使用 git checkout 命令看到与上面相同的结果。

$ git checkout -f

没有任何参数,git checkout 命令采用默认的 HEAD 参数。 我们的最后一次提交很好,没有糟糕的 stash pop 合并冲突,所以这个命令擦干净了石板。

-f 标志用于 –force 选项。 它通过忽略未合并的提交和未跟踪的文件来帮助确保健康的存储库状态。

git checkout force option

以上两种方法如果只是想擦干净的话,最好是undo git stash pop 有冲突。

但是如果你想用新鲜的好合并来解决提交,你需要使用下面的方法。


通过解决不良冲突撤消 Git Stash Pop

您需要在所有分支中同步地很好地编辑文件和目录以解决冲突。

您可以使用一些命令在本地执行此操作,也可以从远程存储库中将其拉入。 我们将研究这两种解决方案。

解决 Git Undo Failed Stash Pop 的冲突 – 对于本地分支

我们有与上面相同的设置。 但是这一次,我们将解决 main 和 new_branch 之间的冲突并重新应用我们的存储以获得所需的结果。

我们首先删除导致 stash pop 冲突的文件更改。 我们在 fork 之后对 master 中的 file1 和 file2 所做的更改导致了问题。

我们将 master 重置为提交之前的提交,并对我们的 file1 和 file2 进行了错误的更改。

git reset <good_commit_hash>

git reset bad commit

git checkout HEAD .

我们还使用 checkout 命令回滚我们的工作区域。 请注意尾随点 . ,它会选择所有文件以确保所有冲突都得到解决。

您还可以使用:

$ git reset HEAD file1.txt file2.txt

因为在我们的例子中,我们知道两个相关文件是 file1.txt 和 file2.txt

在这种形式下,git checkout 命令将工作区设置为与 HEAD 对齐,这是最后一次没有冲突的良好提交。

git checkout head

我们现在看到提交已经从我们的 master 分支中消失了。

错误的提交消失了本地设置

我们现在成功应用了隐藏的更改。

$ git stash pop

git good stash pop

successful resolve apply stash

Git Undo Bad Stash Pop – 通过从远程存储库中拉取来解决冲突

如果您的工作流程设置为远程存储库处于最不健康状态,您可以通过从远程拉入来解决不良存储冲突。

让我们首先为这个解决方案设置一个具体的用例。

healthy remote

local master behind remote

我们看到我们的本地遥控器落后于我们的远程主机 1 次提交。 假设我们现在创建一个新的本地分支来跟踪远程主机并存储一些更改。

$ git fetch --all

$ git switch -c new_branch_tracking_remote_master origin/master

local branch tracking remote master

我们在此分支上存储了一些更改。

git stash -m "Change file5.txt in local branch"

stash local tracking remote master

现在我们意识到我们希望在一个新的本地分支上进行这些更改。 我们从本地 master 分叉出一个新的本地分支。

git checkout master

git branch local_branch_2

new fork from local master

我们看到这个分支落后了 1 个提交,并且它没有 file5.txt 文件。 如果我们现在弹出我们的存储,它会导致糟糕的合并冲突。

bad git pop remote workflow

为了解决冲突,在这种情况下,我们将远程主机拉入本地主机。 我们首先需要获取远程存储库。

$ git fetch --all

然后我们将本地主控与远程主控合并。

$ git merge origin/master

pull local master from remote

我们现在看到我们的本地主机通过拉取最新的更改与远程主机同步。 您还可以看到其中包含关键的 file5.txt。

updated local master

我们现在将在更新的本地主服务器上重新设置您的本地分支,本地分支 2。

首先,检查当地分支机构。

$ git checkout local_branch_2

现在,在本地master分支上变基。

$ git rebase master

这使我们的 local_branch_2 健康并准备好接收隐藏的更改。

rebase local on master

我们现在应用我们隐藏的更改。

$ git stash pop

这次我们看到隐藏的更改已成功应用。

git stash pop success remote setup

我们已经解决了冲突并成功合并了隐藏的更改。

success git stash pop remote setup