这与我的另一个问题:Can't make a replacement ref "permanent"有关。需要说明的是,无论出于何种原因,git replace --graft
与git filter-branch
组合都无效。
我需要合并三个分支,但是章鱼合并失败(文件太不同了),所以我手动完成所有操作(git show branch:file > file
,然后启动meld
)。但是,历史很重要,因此我需要证明branch
是父母。尽管我已经按照手册文件和Stackexchange(filter-branch
上其他地方的说明进行了操作,但是由于我无法使替换参照物,所以我寻求替代方法。
从我现有的问题中可以看出,我的第一个想法是使用替换,但这不能按需工作(它们没有被“胶结”)。同样,建议不要使用git graft
。另外,如链接的问题所述,章鱼合并失败。翻阅git commit --help
(手册页)没有发现任何问题。
请注意,我并不是要向旧提交中添加其他父母。我处于尚未推送的分支的顶端,并且没有任何提交将此作为父项。
答案 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中的操作并从已检出的提交中获取提交消息。