2

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

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

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

我已经尝试过:git rebase -i f5f5目的是将它告诉这squash5 个提交,但它只是在 f5f5 和 a0a0 之间的主分支上给出了每个提交。所以我把除了第一个和最后一个之外的所有东西都pick变成了squash,但这变得疯狂了,并且将 master 的每一个提交重新定位为一个巨大的提交,而不是所有的合并,失去了它是一个“合并”的事实。这不是我所期望的!

我可以:

  $ git reset 6666
  $ git merge Master

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

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

4

3 回答 3

5

这将做到:

git reset --hard $(git commit-tree -p f5f5 -p Master -m "Merge hurricane" a0a0:)

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

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

于 2012-10-23T19:03:46.183 回答
1

试试这个:

git checkout 6666 -b master_squashed
git merge --squash master
git commit -m 'My new feature'
git checkout master
git merge master_squashed
于 2012-10-23T13:14:44.177 回答
1

迟到的答案:

git diff 6666 f5f5 > patch-f5f5.patch
git checkout 6666
git apply patch-f5f5.patch

根据您的喜好,您也可以使用git apply --cachedor git apply --indexwhich 允许您在提交之前进行进一步修改。

于 2015-10-22T08:31:07.307 回答