Git rebase忽略合并提交

5
我想将这四个提交信息合并为一个。更改已经推送。
...95c2f Merge branch 'bugfix/final' of ssh://10.0.0.30:7999/mp/web into bugfix/final
...39e3c Merge branch 'version/I2-0' of ssh://10.0.0.30:7999/mp/web into bugfix/final
...cf444 Merge branch 'version/I2-0' of ssh://10.0.0.30:7999/mp/web into bugfix/final
...43d9d C0-235, CO-236, CO-215, CO-340, CO-367, CO-368 mobile order depth etc,etc...

但是,如果我尝试使用下面的命令进行变基,它会忽略所有合并提交消息。

git rebase -i HEAD~4

我该如何做到这一点,为什么会忽略合并提交。

你可以回退到第一次合并之前,然后使用章鱼合并吗? - evolutionxbox
4个回答

10
截至Git(2.25.0发布于2020年1月13日,可能还包括之前版本),标志“--preserve-merges”已被弃用。
Git CLI现在建议您使用:--rebase-merges-r作为简称。
使用交互式rebase的示例用法:
git rebase -i --rebase-merges HEAD~4

查看文档以获取更多信息:

--rebase-merges[=(rebase-cousins|no-rebase-cousins)]

默认情况下,变基将仅从待办事项列表中删除合并提交,并将经过变基的提交放入单个线性分支中。使用 --rebase-merges 选项,变基将尝试保留要变基的提交中的分支结构,通过重新创建合并提交来实现。在这些合并提交中解决的任何合并冲突或手动修改都必须手动解决/重新应用。

默认情况下,或指定了 no-rebase-cousins 选项时,没有直接祖先的提交将保留其原始分支点,即被 git-log[1] 的 --ancestry-path 选项排除的提交将默认保留其原始祖先。如果打开了 rebase-cousins 模式,则这些提交将被变基到最接近的共同祖先(如果指定)或到它们的衍生物上。

--rebase-merges 模式类似于已弃用的 --preserve-merges,但适用于交互式变基,其中可以随意重新排序、插入和删除提交。

目前只能使用递归合并策略来重新创建合并提交;不同的合并策略只能通过显式的 exec git merge -s [...] 命令使用。

来源: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---rebase-mergesrebase-cousinsno-rebase-cousins


10

你尝试过变基并保留合并吗?假设您想在变基后保留合并提交。

请尝试以下操作:

git rebase -i -p HEAD~4

0

在回答这个问题时,我想到您可能混淆了提交(由其哈希ID标识的对象)和提交消息(您编写并存储在提交中的文本)。请将这些不同的概念分开。

我想将这四个提交消息合并成一个。

(强调是我的)。但是您想对这四个单独的提交做什么?每个提交都保存了一棵树(快照);这四棵树应该怎样处理?

更改已经推送。

那么,对于这四个现有提交的四个提交哈希值,应该怎么处理?现在有其他人在使用它们吗?

...如果我尝试使用下面的命令进行变基,则会忽略所有合并提交消息。

这是设计上的限制:无法复制合并提交,并且git rebase的意思是“重复执行git cherry-pick操作,将旧的提交复制到新的改进版本中”。

有一个git rebase --preserve-merges,它尽可能地复制合并提交。由于实际上不可能,它会重新运行每个合并。如果您在这些合并期间解决了合并冲突,则必须再次解决它们。1

正如evolutionxbox在评论中建议的那样,也许您想要的结果是:

  1. 现在使用这四个提交的任何人都是up the creek,被遗弃的,无望的;他们真倒霉。
  2. 我们想要丢弃除最终树之外的所有内容。
  3. 我们希望最终提交具有四个父提交: ...43d9d的父提交和三个合并提交的第二个父提交。

如果是这样,您可以通过多种方式实现此目标,但是如果您真的喜欢最终树,则最简单的方法涉及使用管道命令git commit-tree

如果第3项是错的——如果你不想要一堆父提交;如果你想要的是通过执行一系列三个 git merge --squash 操作(而不是真正的合并),然后对所有四个提交进行交互式变基所产生的效果,那么有几种方法可以做到这一点,不过最简单的方法在这个阶段依然涉及使用 git commit-tree

使用 git commit-tree,你告诉Git创建一个新的提交对象,其树由哈希ID提供,并在命令行上提供其父级的哈希ID。Git在存储库中创建提交对象,并作为命令输出返回新提交对象的哈希ID。然后,您可以创建或重新设置分支名称以指向新提交对象。我在这里犹豫是否建议特定的一系列命令,因为仍然不清楚您真正想要实现什么目标。


-2

合并提交确实不会显示,但它们是存在的。必须有一个更干净的解决方案,但我记得曾经通过变基来解决这个问题(例如,您可以尝试推送一个空提交并对其进行变基),即使未显示合并的提交,也将包含在变基中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接