为什么我在 Android Studio 3.3.1 中使用 Revert in Github 时无法回滚到某个点?

Why can't I rollback to a point when I use Revert in Github in Android Studio 3.3.1?

我提交并推送了我的代码三次,分别是提交 1、提交 2 和提交 3。

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

所以我在点Submit 2上做了Revert操作(见图Do Revert),一个Files Merged with Conflicts对话框显示(见图 Files Merged), child Merge 对话框的显示方式与 Merge.

的图像Child 一样

答:我不明白为什么我做Revert操作时会出现下面的代码?好像系统准备好了所有的历史提交记录让我合并。

代码

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

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

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

提交 1

提交 2

提交 3

执行还原

文件合并

Child 合并

1) 为什么会这样?

你在这里混淆了 revert and reset

重置 将当前分支获取到提交历史记录中的前一个点。

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

这也是您得到意外合并的原因。


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

现在尝试重置到所有这些混乱之前的点,它应该又好了。

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

git merge --abort

然后检查你的 log 并找出你最初想要 "revert to" 的提交(我建议你在这里改变你对这个词的口语用法,就像你看到它伤害一样)和 重置它:

git reset --hard <commitHash>

(因为你(我猜?)还没有推送到远程,所以不会有任何伤害。如果你实际上 在这个过程中推送了任何东西,评论,我会编辑我的答案来解决它。)


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

看看你名为 "Do revert" 的屏幕截图,这个 是你应该选择 "Reset current branch to here" 上方而不是 "Revert" 的地方。

意识到这似乎是 What are different about Revert command among of popup menu, git menu and Show History in Android Studio 3.3? 旁边的一个问题,我不确定我的回答是否有问题。

A: I can't understand why the following code is displayed when I do Revert operation? It seem that the system ready all history commit records to let me merge.

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

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

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

B: And more, I can't get the correct result (rollback my code to the point Submit 2) no matter I choice Accept Yours, Accept Theirs or Merge... command, why?

然后我发现我的答案有误。稍后再修改。

如果您想将存储库恢复到提交 2 时的时间,您应该 select 提交 2 的子提交,在您的情况下是提交 3,然后使用 "Theirs"合并。

为什么提交 3?那是因为,Revert "Produce a new commit, which reverts the changes made in the original commit",然后当你恢复 Submit 3 时,它会清除你在(并包括)Submit 3 之后所做的事情,这正是你提交时存储库的样子2.

为什么"Theirs"?这里,如果你selectSubmit 2,那么commit是在Submit 2,"Our changes"是Submit 3(我们在Submit 2之后做了什么),"Their changes"是Submit 1(为什么?我们想恢复(取消)我们在提交 2 中所做的事情,然后存储库将变成它看起来的样子 提交 2 之前,即提交 1)。

为什么会发生冲突? Submit 3和Submit 1改了同一行思路不同,就发生冲突了

...等一下,在我测试的时候,我想我在 IntelliJ IDEA 中发现了 Local ChangesChangelist 的错误...是的,这个已经被报告过很多次了,使用不同的再现方法,例如 IDEA-124412, IDEA-67036 and IDEA-20326,更改列表中显示使用不同方法修改两次的文件认为第二次修改恢复了第一次修改。

C: What will the system do if I launch Merge... operation?

当您点击Merge...时,您可以看到您问题最后一张图片中显示的window。 window 允许您进行交互式合并。 "X"和window两边有冲突的行号附近显示“>>”或“<<”图标。点击"X"代表你拒绝那一边的那段代码,点击“>>”或“<<”代表你接受那一边的那段代码。之后还是可以编辑中间的"Result".