考虑以下命令序列:
git replace --graft <sha> <new_parent_sha>
new_commit_sha="$(git show-ref refs/replace/<sha> | awk '{print $1}')"
git update-ref -d refs/replace/<sha>
最终结果是我们有一个具有新父母的提交(new_commit_sha),它与原始提交相同(相同的树,相同的消息,相同的作者和提交者,作者日期,提交日期),只是父母不同。
有没有更直接的方法来实现相同的效果,即复制替换父级的提交,而无需先创建replace
引用然后删除它?
我查看了git-commit-tree
,但没有看到从源提交中获取大多数提交属性的选项。
我也尝试过,git cherry-pick
但尝试应用补丁可能会发生冲突,如果父级不同,则会导致不同的树。我尝试生成具有完全相同的树(和其他属性)的提交。
有一种更简单的方法来获取替换引用的 sha,还有一种更直接的方法来完成整个操作,但它更冗长。
更轻松:
更直接,但你必须说出你想要的确切修改,Git 的提交格式是故意直截了当的纯文本,编辑它来替换父级,然后将结果写为新的提交:
例如,上面有两个父节点,并且不需要在 GNU 系统上使用 replace-ref tango
如果您没有 GNU sed 或 shell,您可以构建编辑指令以适合您自己的工具集;这样做更容易,甚至可能更便宜,而且可能更清楚
git replace
,它让父母重新布线舞蹈变得冷静。ps 在侧面切线上使用更多的 shell 可读性功能,也许这在这里太过深入,但如果您确实有工具,您可以充分利用 shell 的逐行读取功能使其更清晰。(不幸的是,这严重混淆了 SO 的内置语法颜色,甚至是 emacs 的,但不出所料,不是 vim 的。)Markdown 吃掉制表符,但 shell 可以使用它们使内联数据更容易被眼睛看到,这是我在双父合并中进行烟雾测试时真正使用的方法,所有前导空格都是制表符:
甚至