5

我提交并推送我的代码 3 次,它们是提交 1、提交 2 和提交 3。

我希望将我的代码回滚到提交 2 并将它们推送到远程存储库。

所以我对 Submit 2 点进行 Revert 操作(参见图像Do Revert),一个 Files Merged with Conflicts 对话框显示(参见图像Files Merged), Merge 的子对话框显示就像 Merge 的图像Child一样。

A:我不明白为什么我做Revert操作时会显示如下代码?似乎系统准备好所有历史提交记录让我合并。

代码

<<<<<<< HEAD
//Submit 3
=======
//Submit 1
>>>>>>> parent of 86821fc... Submit 2

B:而且,无论我选择 Accept Yours、Accept theirs 还是 Merge... 命令,我都无法得到正确的结果(将我的代码回滚到提交 2),为什么?

C: 如果我启动 Merge... 操作,系统会做什么?

提交 1 在此处输入图像描述

提交 2 在此处输入图像描述

提交 3 在此处输入图像描述

还原 在此处输入图像描述

文件合并 在此处输入图像描述

合并之子 在此处输入图像描述

4

2 回答 2

6

1)为什么会这样?

你在这里revert感到困惑reset

重置使当前分支回到提交历史中的前一个点。

还原特定提交会创建一个新提交,其中包含与您选择的提交完全相同的提交。这不会修改旧的提交,也不会让您回到过去的点。

这也是为什么你得到了一个你没想到的合并。


2)如何解决手头的情况?

现在尝试在所有这些混乱之前重置到点,它应该会再次正常。

首先,如果合并仍在进行中,请中止它

git merge --abort

然后检查您log并发现您最初想要“恢复”的提交(我建议在这里更改您对该术语的口语使用,就像您看到它受伤一样)并重置它:

git reset --hard <commitHash>

(由于您(我猜?)尚未推送到遥控器,因此不会有任何伤害。如果您实际上在此过程中推送了任何内容,请发表评论,我将编辑我的答案以解决它。


3) 以后如何避免同样的问题?

查看名为“Do revert”的屏幕截图,是您应该在“Reset current branch to here”而不是“Revert”上方选择的地方。

于 2019-03-02T02:43:16.607 回答
2

意识到这似乎是Android Studio 3.3 中弹出菜单、git 菜单和显示历史记录之间的恢复命令有什么不同?,我不确定我的回答是否有问题。

A:我不明白为什么我做Revert操作时会显示如下代码?似乎系统准备好所有历史提交记录让我合并。

这称为合并冲突。当两个提交要合并但他们发现用不同的想法编辑同一个地方时,就会发生这种情况,这使得 Git 无法决定保留哪一个。然后 Git 保留这两者,格式如下:

<<<<<<< Branch1
Content A
=======
Content B
>>>>>>> Branch2

并让您手动决定保留哪一个。

B:而且,无论我选择 Accept Yours、Accept theirs 还是 Merge... 命令,我都无法得到正确的结果(将我的代码回滚到提交 2),为什么?

然后我发现我的答案是错误的。我稍后会修改它。

当您想将存储库恢复到您提交 2 的时间时,您应该选择提交 2 的子提交,在您的情况下是提交 3,然后使用“他们的”进行合并。

为什么提交 3?那是因为,Revert“产生一个新的提交,它会还原原始提交中所做的更改”,然后当您还原提交 3 时,它将清除您在提交 3 之后所做的(并包括),这正是存储库中所做的看起来像你提交 2 时的样子。

为什么是“他们的”?这里,如果选择Submit 2,那么commit就在Submit 2,“Our changes”就是Submit 3(我们在Submit 2之后做了什么),“Their changes”就是Submit 1(为什么?我们要revert(取消) 我们在提交 2 中所做的,那么存储库就变成了提交 2之前的样子,即提交 1)。

为什么会发生冲突?提交 3 和提交 1 用不同的想法更改了同一行,然后发生冲突。

...等等,在我测试的时候,我想我发现了IntelliJ IDEA一个bugLocal Changes ...和IDEA-20326,使用不同方法修改两次的文件已在更改列表中显示,认为第二次修改已恢复第一次修改。Changelist

C: 如果我启动 Merge... 操作,系统会做什么?

当您单击 时Merge...,您可以看到问题最后一张图片中显示的窗口。此窗口允许您进行交互式合并。窗口两侧有冲突的行号附近有“X”和“>>”或“<<”图标。单击“X”表示您拒绝该侧的那段代码,单击“>>”或“<<”表示您接受该侧的那段代码。之后,您仍然可以编辑中间的“结果”。

于 2019-03-06T05:41:11.840 回答