【问题标题】:Undo merge/reset change status撤消合并/重置更改状态
【发布时间】:2014-02-06 12:20:32
【问题描述】:

我在使用 Gerrit 时犯了一个致命错误,想知道是否有人可以为此提供解决方案/想法:

目前的情况是我有一个分支feature-foo,我们的团队正在将更改推送到该分支以供审核。 其中一些更改已经提交/合并,并且仍有大量更改可供审核。 现在,昨天我决定将补丁集推送到特定更改,其中包含大约 15 个先前更改(尚未合并)。

我不小心超过了代码审查(是的,我确实拥有这些权限,是的,我很愚蠢,为了我自己的安全没有停用它们 - 经验教训)。 这导致这 15 个更改/提交被直接推送到分支而不是代码审查。 所以现在所有这些更改都在 Gerrit 中标记为MERGED。我的直接想法是使用我知道最初是feature-foo 的提示的提交来执行push -f

这会正确地将分支重置到它应该在的位置。但是 - 这 15 处更改仍然在 Gerrit 中标记为 MERGED。 我想要的是:我需要将这些更改恢复为“正在审核”状态,因为它们实际上仍在进行中。

任何想法,任何人?我无法想象以前没有人发生过这种情况......

问候,

--曲

编辑 1:澄清一下 - 错误推送的提交导致快进 - 而不是合并。尽管如此,对于 Gerrit 来说,这些更改/提交仍然是“合并的”,就好像有人在 Gerrit-Web 界面中按下了“提交更改”。 所以 - 这个问题实际上是关于 Gerrit,而不是 Git 本身

关键词:意外推送、意外合并

【问题讨论】:

  • @sehe 好吧 - 不。问题是:我如何告诉 Gerrit 这些更改/提交实际上是没有合并的。我已经恢复了不正确的推送。所以分支已经被重置。我只需要让 Gerrit 知道这件事……
  • 哦。很抱歉错过了那里的线索。有一个 +1
  • 您是否尝试在重置远程分支后将更改推送到远程审核分支?
  • @HiB 我没有。实际上,我很确定 Gerrit 不会允许我将另一个补丁集推送到已经处于 MERGED 状态的变更上。

标签: git gerrit


【解决方案1】:

我知道的唯一方法是使用新的Change-Id 再次推送它。这会导致打开一个新的更改。

【讨论】:

  • 我正在考虑这个,但放弃了这个想法,因为我会丢失整个审查历史记录(每次提交约 10 个补丁集):(
  • 查看我的答案以了解我是如何解决的,无论如何 +1 对你来说也是一个可能的解决方案。
【解决方案2】:

好吧,事实证明这是成功的:

  1. 将分支重置到它应该在的位置(强制推送过去的代码审查)
  2. 关闭 Gerrit,访问底层 H2 数据库并将所有受影响的 Change-ID 的状态重置为“Review in Progress”(标准 SQL,在 WHERE 子句中使用项目名称、分支名称和 Change-ID)。

【讨论】:

  • 关于如何实际执行此操作的任何提示?这在 IIUC 大部分从 SQL DB 过渡的 Gerrit 3 中是否仍然相关?
【解决方案3】:

Gerrit 3+ 更新(使用 NoteDB):

当提交更改(或者甚至只是推送它,显然)时,Gerrit 会为更改创建一个新的补丁集,该补丁集带有“合并”属性。这需要撤消。

对于变更集 12345,您需要查看 refs/changes/45/12345/meta 的 git 历史记录。该“分支”包含对变更集的讨论。

通过将该分支重置为提交之前的最后一次提交(提交应该有类似“创建补丁集 2”的消息,带有属性“状态:合并” - 取它的父级),你删除了所有关于更改的知识曾经被合并过。

可能也必须刷新缓存 - 我只是在 SSH 接口上执行了“gerrit flush-caches --all”以确保。

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多