在回答这个问题时,我想到您可能混淆了提交(由其哈希ID标识的对象)和提交消息(您编写并存储在提交中的文本)。请将这些不同的概念分开。
我想将这四个提交消息合并成一个。
(强调是我的)。但是您想对这四个单独的提交做什么?每个提交都保存了一棵树(快照);这四棵树应该怎样处理?
更改已经推送。
那么,对于这四个现有提交的四个提交哈希值,应该怎么处理?现在有其他人在使用它们吗?
...如果我尝试使用下面的命令进行变基,则会忽略所有合并提交消息。
这是设计上的限制:无法复制合并提交,并且git rebase
的意思是“重复执行git cherry-pick
操作,将旧的提交复制到新的改进版本中”。
有一个git rebase --preserve-merges
,它尽可能地复制合并提交。由于实际上不可能,它会重新运行每个合并。如果您在这些合并期间解决了合并冲突,则必须再次解决它们。1
正如evolutionxbox在评论中建议的那样,也许您想要的结果是:
- 现在使用这四个提交的任何人都是up the creek,被遗弃的,无望的;他们真倒霉。
- 我们想要丢弃除最终树之外的所有内容。
- 我们希望最终提交具有四个父提交:
...43d9d
的父提交和三个合并提交的第二个父提交。
如果是这样,您可以通过多种方式实现此目标,但是如果您真的喜欢最终树,则最简单的方法涉及使用管道命令git commit-tree
。
如果第3项是错的——如果你不想要一堆父提交;如果你想要的是通过执行一系列三个 git merge --squash
操作(而不是真正的合并),然后对所有四个提交进行交互式变基所产生的效果,那么有几种方法可以做到这一点,不过最简单的方法在这个阶段依然涉及使用 git commit-tree
。
使用 git commit-tree
,你告诉Git创建一个新的提交对象,其树由哈希ID提供,并在命令行上提供其父级的哈希ID。Git在存储库中创建提交对象,并作为命令输出返回新提交对象的哈希ID。然后,您可以创建或重新设置分支名称以指向新提交对象。我在这里犹豫是否建议特定的一系列命令,因为仍然不清楚您真正想要实现什么目标。