我有一个看起来像这样的主题分支。 (分支主题目前指向' a0a0')
如何将a0-f5转换为单个合并提交?
我已尝试过:git rebase -i f5f5
打算告诉squash
这5次提交,但它只是在f5f5和a0a0之间的主分支上进行了每次提交。所以我将pick
中的第一个和最后一个转变为squash
,但是这变得疯狂并且将每个从master的提交重新定义为一个巨大的提交而不是所有合并,失去了它的事实a'合并'那不是我的预期!
我能做到:
$ git reset 6666
$ git merge Master
但这需要我重新进行任何合并提交。
那么如何将这些不同的合并压缩为单个合并提交,知道它是合并,还保留所有合并冲突的东西?
答案 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 --cached
或git apply --index
,以便在提交之前进行进一步修改。