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

Posted

技术标签:

【中文标题】为啥我在 Android Studio 3.3.1 的 Github 中使用 Revert 时无法回滚到某个点?【英文标题】:Why can't I rollback to a point when I use Revert in Github in Android Studio 3.3.1?为什么我在 Android Studio 3.3.1 的 Github 中使用 Revert 时无法回滚到某个点? 【发布时间】:2019-07-24 01:56:43 【问题描述】:

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

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

所以我在提交 2 点上执行 Revert 操作(参见图像 Do Revert),显示文件合并与冲突对话框(参见图像 Files Merged) , Merge 的子对话框像图片Child of Merge一样显示。

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

代码

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

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

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

提交 1

提交 2

提交 3

还原

文件合并

合并之子

【问题讨论】:

***.com/q/38163380/5466997 的副本? 【参考方案1】:

1) 为什么会这样?

您在这里混淆了revertreset

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

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

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


2) 如何解决当前的情况?

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

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

git merge --abort

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

git reset --hard <commitHash>

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


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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

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

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

为什么要提交 3?那是因为,Revert“Produce a new commit, which revert the changes made in the original commit”,那么当你恢复提交 3 时,它会清除你在提交 3 之后(并包含)所做的事情,这只是提交 2 时存储库的样子。

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

为什么会发生冲突? Submit 3和Submit 1换了同一行,idea不同,就会发生冲突。

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

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

当您单击Merge... 时,您可以看到问题最后一张图片中显示的窗口。此窗口允许您进行交互式合并。窗口两侧有冲突的行号附近有“X”和“>>”或“>”或“

【讨论】:

谢谢!你的意思是我应该在提交 3 点启动 rever 命令以返回提交 2 点? @HelloCW 在我的测试中,是的,并且在发生合并冲突时选择“接受他们的”。但是我不知道其中的一些内部情况,仍然需要更深入的答案。 谢谢! “为了返回提交2点,我必须在提交3点启动rever命令”,这是Android Studio的一个错误吗? @HelloCW 我认为不,那里可能有一些文字游戏,如果我们将“revert”识别为“取消提交”,例如“revert S2”表示“取消构建 S2 的所有操作”,那么“revert S2”将使 S2 “没有发生”,或者我们说“销毁”构建 S2 的代码,这意味着存储库将看起来像 S2 的先前提交,即 S1。出于同样的原因,我们可能会理解为什么返回 S2 应该在 S3 上恢复。 另一个想法是,如果我们“恢复”最后一次(最新)提交,那么存储库将看起来像第二次最后一次提交,而不是最后一次提交(否则“恢复最后一次提交”将无做)。

以上是关于为啥我在 Android Studio 3.3.1 的 Github 中使用 Revert 时无法回滚到某个点?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在设计查看器中的字体在 Android Studio 中是模糊的?

有时我在 Android Studio 中遇到谷歌地图问题,但并非总是如此。为啥?如何删除谷歌地图上方的白条?

为啥 Android Studio 模拟器在横向视图中旋转时是颠倒的?

为啥在 Visual Studio 2019 (XAMARIN) 中找不到 Android 库

为啥 Android Studio 将我所有的引用从 R 更改为 android.R?

为啥 Android Studio 将我所有的引用从 R 更改为 android.R?