【问题标题】:Force a commit to have additional parents upon commit在提交时强制提交有额外的父母
【发布时间】:2019-07-10 18:48:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果git replace --graft 后跟一个裸过滤器分支不起作用,则说明有问题。您的另一个问题没有显示任何错误,filter-branch 只是注意到您将它指向了许多您不需要的参考。

标签: git merge commit


【解决方案1】:

通过在较低级别查看此内容(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))

【讨论】:

    【解决方案2】:
    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 -
    

    但是对于这种微不足道的事情,只需在本地执行并清除 filter-branch 的 ref 备份就更容易了

    git filter-branch -f --setup exit
    

    也许值得注意的是,所有这一切都归结为执行OP's answer 中的操作并从签出提交中获取提交消息。

    【讨论】:

    • 我想我应该更清楚地说明git replace --graft 实际上不是一个选项。之所以提出整个问题,是因为您的解决方案不起作用。如果你有办法让它工作,请回答我的另一个问题。但是,我确实提出 git filter-branch 没有按我预期的那样做。而且,这不是大手术。这只是一个奇怪的提交。
    • 您一直说它不起作用,但是(a)您的示例并未显示它不起作用,它们显示 filter-branch 注意到您不需要过滤所有这些参考,并且( b) 不,替换提交 id 没有改变,filter-branch 做了一个新的,有充分的理由。
    • 感谢您对我之前的问题 (stackoverflow.com/questions/54519270/…) 的关注。请继续关注这个主题,它明确排除了你的答案。
    • 您确实记得您来这里是为了请了解 Git 的人来帮助您,对吧?因为你不知道?
    • 我只是要求您保持话题。如果你有办法让我以前尝试过这项工作,我会很高兴听到它。只是不在这里。此外,我之前的尝试是一种变通方法。 “提交-->替换-->水泥”似乎比一开始就做出我想要的提交更圆润,这就是这个问题所要求的。请不要将其视为个人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多