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

时间:2012-10-23 11:32:53

标签: git merge rebase

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

  • a0a0合并分支' Master'进入主题
  • b1b1 Merge Branch' Master'进入主题
  • c2c2合并提交'来自master'进入主题
  • d3d3 Merge Branch' Master'进入主题
  • e4e4 Merge Branch' Master'进入主题
  • f5f5 Merge Branch' Master'进入主题
  • 6666实际提交
  • [关于主题分支的大量历史]
  • 9999原始分歧点

如何将a0-f5转换为单个合并提交?

我已尝试过:git rebase -i f5f5打算告诉squash这5次提交,但它只是在f5f5和a0a0之间的主分支上进行了每次提交。所以我将pick中的第一个和最后一个转变为squash,但是这变得疯狂并且将每个从master的提交重新定义为一个巨大的提交而不是所有合并,失去了它的事实a'合并'那不是我的预期!

我能做到:

  $ git reset 6666
  $ git merge Master

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

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

3 个答案:

答案 0 :(得分:4)

这样做:

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将当前分支指向新的提交。

答案 1 :(得分:1)

试试这个:

git checkout 6666 -b master_squashed
git merge --squash master
git commit -m 'My new feature'
git checkout master
git merge master_squashed

答案 2 :(得分:1)

迟到的回答:

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

根据您的喜好,您也可以使用git apply --cachedgit apply --index,以便在提交之前进行进一步修改。