免责声明: 我自己只在玩具库中使用过一次“移植点”。但这是一个您可能没有听说过的晦涩功能,但它_可能_对您的情况有帮助。
您可以使用“移植点”来伪造祖先信息。参见,例如,.git/info/grafts 是做什么用的? https://stackoverflow.com/questions/161928/what-are-git-info-grafts-for或立即继续有关移植点的 git wiki 条目 http://git.or.cz/gitwiki/GraftPoint.
本质上,您将创建一个文件.git/info/grafts
这会欺骗 git 认为提交M1是 commit 的祖先M2:
$ cat .git/info/grafts
<your M2 commit hash> <your M1 commit hash>
随后,它看起来像M2是一个刚刚合并的空提交I2 and M1变成一棵普通的树。
主要缺点:嫁接点未犯;因此,它不会被检出,而是需要手动添加到存储库的每个本地工作副本中。
Update: use git replace --graft https://git-scm.com/docs/git-replace反而。
如上所述,移植点已被取代。跑步
git replace --graft <your M2 commit hash> <your M1 commit hash>
创建移植物。这存储在.git/refs/replace/
。尽管 git 默认情况下不会获取或推送这些引用,但可以使用以下方法在存储库之间同步它们:
git push origin 'refs/replace/*'
git fetch origin 'refs/replace/*:refs/replace/*'
(StackOverflow:如何在 git 中推送“引用/替换”而不推送任何其他引用? https://stackoverflow.com/a/20072413/1172714)