强迫一次承诺在提交时有更多的父母

时间:2019-02-17 01:51:42

标签: git merge commit

这与我的另一个问题:Can't make a replacement ref "permanent"有关。需要说明的是,无论出于何种原因,git replace --graftgit filter-branch组合都无效。

我需要合并三个分支,但是章鱼合并失败(文件太不同了),所以我手动完成所有操作(git show branch:file > file,然后启动meld)。但是,历史很重要,因此我需要证明branch是父母。尽管我已经按照手册文件和Stackexchange(filter-branch上其他地方的说明进行了操作,但是由于我无法使替换参照物,所以我寻求替代方法。

从我现有的问题中可以看出,我的第一个想法是使用替换,但这不能按需工作(它们没有被“胶结”)。同样,建议不要使用git graft。另外,如链接的问题所述,章鱼合并失败。翻阅git commit --help(手册页)没有发现任何问题。

请注意,我并不是要向旧提交中添加其他父母。我处于尚未推送的分支的顶端,并且没有任何提交将此作为父项。

2 个答案:

答案 0 :(得分:1)

通过在较低的层次上看(提交确实发生的方式),我遇到了一个可爱的网页: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

Voila!然后,我可以编写一个简单的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))

答案 1 :(得分:-1)

git replace --graft @ branch_A branch_B branch_C
git filter-branch

我从头开始做任何大手术,然后推回想要的结果,这样,如果出现任何问题,恢复就和走开一样容易:

git clone -sb somebranch . `mktemp -d`; cd $_
major surgery here
git push origin whatever
cd -

但是对于这个琐碎的事情,只要使用

,就更容易在本地完成并清除过滤器分支的引用备份。
git filter-branch -f --setup exit

也许值得一提的是,所有这些归结为做OP's answer中的操作并从已检出的提交中获取提交消息。