允许在git rebase中合并不相关的历史记录

vos*_*d01 17 git git-rebase

当您想要重新分支保持合并提交的分支时,您将传递该--preserve-merges标志.当你在git中合并不相关的历史时,你需要传递--allow-unrelated-histories旗帜.

如果您git rebase --preserve-merges在现有合并来自不相关的历史记录时正在执行,则会失败:

致命的:拒绝合并不相关的历史

如果您尝试git rebase --preserve-merges --allow-unrelated-histories失败,则:

错误:未知选项'allow-unrelated-histories'

有没有其他方法告诉rebase允许合并?


编辑:这是一个最小的复制:https://github.com/vossad01/rebase-unrelated-merge-reproduction

要重现结帐,请master执行:

git rebase --preserve-merges --onto origin/a-prime HEAD~2
Run Code Online (Sandbox Code Playgroud)

vos*_*d01 9

如果git rebase合并失败,它不会中止rebase,因此您有机会进行手动干预.

如果您愿意手动解决此问题,可以按如下方式完成合并:

git merge --allow-unrelated ORIGINAL_BRANCH_THAT_WAS_MERGED --no-commit
git commit -C ORIGINAL_MERGE_COMMIT
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

理想情况下,Git可以在没有人工干预的情况下处理此问题.

  • 有趣的是,这不适用于通过 `git-subtree add` 创建的合并。为了让它工作,git 需要记住使用了哪种合并策略,以及冲突解决是如何发生的。听起来很可怕。 (2认同)

jth*_*ill 6

强制方法是强制一个共同的根 - 因为你试图改变根,没有内容历史,做一个nonce空提交并告诉git你正在合并的历史的父:

git rev-list --all --max-parents=0 \
| awk '{print $0,empty}' empty=`:|git mktree|xargs git commit-tree` \
> .git/info/grafts
git rebase here
rm .git/info/grafts
Run Code Online (Sandbox Code Playgroud)

  • 这让我大吃一惊,它奏效了!在简化语言中,它使用 [grafts](https://git.wiki.kernel.org/index.php/GraftPoint) 人为地使所有分支与空的父/根提交相关。当 Git 认为一切都是相关的时,你进行了 rebase。然后你移除移植物以恢复原状。 (2认同)