如何进行复杂的章鱼合并?

How can I make a complex octopus merge?

我只是根据大师的提示提出了 8 个不同的建议,我想提交一个将所有这些建议合并在一起的提交。我通过一个接一个地手动解决合并冲突(然后使用 git merge --squash 将它们压缩在一起)来完成合并,但是现在,当我尝试使用 git merge -s ours branch1 branch2 branch3 etc 进行章鱼合并提交时,它回复 Merge with strategy ours failed. 如果我提交压缩的合并和 然后 多父提交,提交有效,但我有一个提交做某事,然后是一个空提交,并且我不想要那个。如何将 merge content 提交与 merge parent 提交合并?

听起来您有一棵包含正确内容的树,现在您想创建一个包含该内容和正确父项的提交。我不完全确定您将如何使用 git 瓷器来进行您想要的提交,但是由于您可以使用管道,如果您愿意,可以直接使用它。

如果您已正确合并所有文件并在索引中,您可以使用 git write-tree:

找出树的散列
$ git write-tree
4d5fcadc293a348e88f777dc0920f11e7d71441c

然后您可以使用正确的父项创建提交:

$ git commit-tree 4d5fcadc293a348e88f777dc0920f11e7d71441c -p branch1 -p branch2 ... -m "Dummy Message"
85e2a8f2f71816d17887caaf39e46225e47165a9

并更新您的分支以指向该新提交

$ git reset --hard 85e2a8f2f71816d17887caaf39e46225e47165a9

我通常使用虚拟消息创建提交,然后返回并使用 git commit --amend 稍后填写它。

如果您不希望直接使用管道(谁会责怪您呢?)那么您也许可以解决问题。

这里的诀窍是你有一个提交,其中包含你的实际更改,一个单父项,另一个没有更改但有多个父项。如果您将更改压缩在一起,那么第一个提交的父项将保留。

目前,您的提交顺序错误,无法进行压缩:第二个提交及其父项将会丢失。但是因为那个提交没有变化,所以应该可以重新排序它们,这样 squash 就可以工作了。

如果您正在使用 master,并且 origin/master 指向您开始之前的最后一次提交,那么执行 git rebase -i origin/master 这应该会在编辑器中为您提供两次提交:

pick 12345 All changes here
pick 67890 Octopus merge

将第二行向上移动,然后压缩更改:

pick 67890 Octopus merge
squash 12345 All changes here

保存并退出,希望一切顺利:)。