【问题标题】:Erasing a merge commit by hard resetting back to a commit that was gained in the merge?通过硬重置回在合并中获得的提交来擦除合并提交?
【发布时间】:2019-11-22 13:15:20
【问题描述】:

我在合并之前的历史看起来像 A -> B -> C

我正在合并的分支看起来像A -> B -> C -> D -> E,即分支与我的历史相同,但有两个新提交

我只是想要这两个提交,所以我将该分支合并到我的。合并后,我的分支看起来像A -> B -> C -> D -> E -> F,其中 F 是合并提交。

我不想在我的历史记录中合并提交 F,所以我硬重置回提交 E...

等等,什么?

我通过硬重置回在合并提交中获得的提交删除了合并提交...?那可能吗?我认为合并提交本身就是应用您从合并中获得的任何新提交的东西,所以如果您撤消合并提交(就像我所做的那样),那么您将失去合并提交所做的一切,即您将失去所有通过合并获得的提交。

这不是合并提交的工作方式吗?

【问题讨论】:

  • 为什么你会丢失所有的提交?如果没有合并提交,它们仍然存在。
  • 考虑使用带有图形选项的 git log,你会发现历史不是线性的。
  • 您没有获得 E 提交作为合并的一部分。该提交已经存在。你所做的基本上是一种复杂的方式来重现 git merge BRANCH --ff 会做的事情。
  • @LasseVågsætherKarlsen 嗯,问题是这些是不同叉子上的两个分支(当我合并时,我必须选择“跨叉子合并”)。到那时你的答案还是一样吗?
  • 分叉只是克隆。 “跨叉合并”只是意味着“根据需要将提交从克隆 A 复制到克隆 B,然后合并”。因此,这与它们都在单个存储库中完全相同,因为将提交从克隆 A 复制到克隆 B 使克隆足够相似,因此所有操作现在都发生在克隆 B 中,就好像它都发生在克隆 B 中一样沿着。也就是说,无论它在哪个 repository 中,都会保留 commit 的标识。

标签: git github merge commit


【解决方案1】:

如果你的 repo 有merge.ff 设置false,或者如果你以其他方式在合并中指定--no-ff,Git 将记录合并,即使在此处并非绝对必要时也是如此。

你必须要

A---B---C-------F    master
         \     /
          D---E

F 内容与E 内容相同。有时你想要这个,例如在生产历史中,将实际投入生产的内容记录为这样的一系列合并通常很方便,任何了解惯例的人都可以看到 D 从未投入生产,它是系列的一部分。

因此,当您将 git reset --hard 更改为 E 时,您删除了合并的记录,而根本没有更改内容,而生成的历史正是快进合并所得到的。

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2020-10-04
    • 2014-03-24
    • 2021-04-14
    • 2011-09-05
    • 2011-09-04
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多