如何将多个合并压缩为一个合并?

Pod*_*Pod 2 git merge rebase

我有一个看起来像这样的主题分支。(分支主题当前指向'a0a0')

  • a0a0 将分支“Master”合并到主题中
  • b1b1 将分支“Master”合并到主题中
  • c2c2 合并提交“来自主人的东西”到主题中
  • d3d3 将分支“Master”合并到主题中
  • e4e4 将分支“Master”合并到主题中
  • f5f5 将分支“Master”合并到主题中
  • 6666 实际提交
  • [主题分支的大量历史记录]
  • 9999 原始发散点

如何将 a0-f5 变成单个合并提交?

我试过:git rebase -i f5f5打算将它告诉那squash5 个提交,但它只是在 f5f5 和 a0a0 之间的主分支上提供了每个提交。因此,我将除第一个和最后一个之外的所有内容从pick变为squash,但是这太疯狂了,并且将 master 的每个提交重新定位为一个巨大的提交,以代替所有合并,从而失去了它是“合并”的事实。那不是我所期望的!

我可以:

  $ git reset 6666
  $ git merge Master
Run Code Online (Sandbox Code Playgroud)

但这需要我重新做任何合并提交。

那么我如何将这些不同的合并压缩成一个合并提交,知道这是一个合并,并且还保留所有合并冲突的东西?

use*_*342 5

这将做到:

git reset --hard $(git commit-tree -p f5f5 -p Master -m "Merge hurricane" a0a0:)
Run Code Online (Sandbox Code Playgroud)

要了解它是如何工作的,首先要记住合并提交绝对没有什么神奇之处。可能很难创建,但是一旦创建,就很容易准确地重新创建。这是因为 git 不记录变更集,它记录整个树。像git show将提交显示为差异和合并提交作为非常花哨的差异之类的工具,但实际上提交是指向成熟树的指针。压缩一些提交是一个简单的事情,重新创建一个包含相同树的新提交,给它一个不同的父级和提交消息。

管道命令git commit-tree完成最后一部分。给定父提交 ( f5f5)、提交消息和树 ID(很容易用 引用COMMIT:),它会创建一个包含指定树的新提交。如果提交只有一个父级,则它将是常规提交。如果它有多个父级,它将是一个合并提交。创建压缩的合并提交后,剩下的就是将当前分支指向新的提交git reset --hard