首页 > 解决方案 > 在提交时强制提交有额外的父母

问题描述

这与我的另一个问题有关:Can't make a replacement ref "permanent"。需要明确的是,无论出于何种原因,git replace --graft结合git filter-branch不起作用。

我需要合并三个分支,但章鱼合并失败(文件太不相似)所以我全部手动完成(git show branch:file > file然后启动meld)。但是,历史很重要,所以我需要记录那branch是父母。由于尽管按照 man 文件和 Stackexchange ( filter-branch) 上的其他地方告诉我的操作,我仍无法使替换 refs 成为永久性的,因此我寻求替代方法。

从我现有的问题中可以看出,我的第一个想法是使用替换,但这并没有按预期工作(它们没有被“固定”)。同样git graft似乎被建议不要。此外,如链接问题中所述,章鱼合并失败。浏览git commit --help(手册页)一无所获。

请注意,我并不是要向旧提交添加额外的父母。我在尚未推送的分支的尖端,并且没有提交将这个作为父级。

标签: gitmergecommit

解决方案


通过在较低级别查看此内容(DO 提交究竟是如何发生的),我发现了一个可爱的网页:https ://jwiegley.github.io/git-from-the-bottom-up/1-Repository/4-how -trees-are-made.html

所以答案是手工完成。

git add file
git write-tree
echo "commit message" | git commit-tree -p branch_A -p branch_B -p branch_C $hash-from-previous-step
git update-ref refs/heads/branch_A $hash-from-previous-step #note I'm on branch_A

瞧!然后我可以编写一个简单的 shell 命令,将提交消息和其他两个分支(HEAD用作第一个父级)作为输入。

为了它,我把它写成一个衬里。

git add file && git update-ref refs/heads/branch_A $(echo "commit message" | git commit-tree -p branch_A -p branch_B -p branch_C $(git write-tree))

推荐阅读