我可以删除 git 中的还原吗?

问题描述

我不小心将开发分支合并到主分支,我使用 github 还原了该更改,但更改已经应用于主分支,这并不意味着,并且开发分支似乎在多次提交时倒退。

我想要的是仅删除历史记录中的还原(图中箭头所示)并维护提交(框内),如下图所示。

请注意,评论是从最新到最旧(从上到下)排列的。 盒子里面是不小心取出的东西。

谢谢。

enter image description here

解决方法

  1. 可以尝试在红框的开头(旧侧/底部)重置分支,然后在红框(新侧/顶部)之后挑选剩余的顶部提交。
  2. 或者可以尝试在红色框的开头(旧侧/底部)重置分支,然后使用交互模式重新设置并跳过您不想要的提交并休息
,

记住git并不真正关心分支,它关心提交和它们的父项是很有用的。当我们说“这个分支上的所有提交”时,git 实际上看到的是“那个分支指向的提交,以及它的父级,以及它们的父级,回到历史的开始”。

当您将“branch-5”合并到“main”时,git 会查找“branch-5”历史记录中可访问但未在“main”中访问的所有更改。就 git 而言,这包括您在“开发”中所做的许多其他更改,但尚未在“主要”中。

当您要求恢复时,它恢复了所有这些更改,这正是您想要的 - main 现在应该具有与您出错前相同的 代码

确实遇到的问题是,所有这些提交现在都是“main”历史的一部分。这意味着当您确实想要合并它们时,git 会认为它们已经存在,并跳过它们。要解决此问题,您需要通过以下两种方式之一重写历史记录:

  1. 与其恢复提交,不如将“main”指向意外合并之前,假装它从未发生过。
  2. 重新设置所有意外合并的提交,以便使用新的提交哈希重新创建它们。

在这种情况下,选项 1 可能是可行的方法。它看起来像这样:

git switch main
git reset --hard last-commit-before-you-messed-up-main
git push --force-with-lease origin main

然后确保您没有任何结帐或分支具有“main”版本并意外合并。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...