git嫁接和替换有何不同?(现在不赞成使用嫁接吗?)

关于git graftsvs的问答很少replace。搜索[git] + grafts + replace仅找到两个与5.关联的东西。git- info-grafts-for和git-what-is-a-graftcommit或a-graft-id。git.wiki.kernel.org上还有一条注释:GraftPoint


现在,嫁接物是否已被replace和完全取代filter-branch,或者某些特殊情况(和向后兼容性)是否仍需要它们?


通常,它们之间有何不同(例如,在回购协议之间传输的是哪些),并且它们在总体上如何相同?我已经看到,Linus在关于提交代数的讨论中似乎似乎并不关心嫁接,(最大父母返回任何根品种)“嫁接已经不可靠了”。


编辑:找到更多信息。

搜索www.kernel.org/pub/software/scm/git/docs graft仅找到3个结果:


GIT-滤波器分支(1),

v1.5.4.7 / GIT-滤波器分支(1),

v1.5.0.7 / GIT-svn的(1)。

更广泛的搜索发现RelNotes / 1.6.5.txt包含:


refs / replace / hierarchy被设计为可替代“ grafts”机制,并具有可以跨存储库传输的附加优点。

不幸的是,gitrepository-layout(5)尚未更新到refs / replace / repository布局信息(和注释),也没有任何有关信息/移植的弃用注释。


这更接近于支持我的想法,但是我欢迎您进行任何确认或澄清。


皈依舞
浏览 755回答 3
3回答

MYYA

如果您需要使用重写父提交git replace,这就是方法。正如菲利普·奥克利(Philip Oakley)所述,git replace只是将一个提交替换为另一个提交。要将父级嫁接到现有提交上,您需要先使用正确的父级创建一个伪提交。假设您有两个要移植的git分支:(a)-(b)-(c) (d)-(e)-(f)现在我们希望(d)是(c)的父代。因此,我们用正确的父项(让我们将其称为c1)创建替换(c),然后git replace用(c1)替换(c)。在这些步骤中,每个字母均表示代表该提交的SHA1哈希。要创建新的提交:git checkout dgit rm -rf * # remove all files from working direcotrygit checkout c -- . # commit everything from c over top of itGIT_AUTHOR_DATE="..." GIT_COMMITTER_DATE="..." git commit -m "..." # create replacement commit with date author现在,您有了具有正确的父项(d)的提交(c1)。因此,我们要做的就是用(c1)替换现有的(c):git replace c c1现在您的历史记录如下:(a)-(b)-(c1)-(d)-(e)-(f)答对了!
打开App,查看更多内容
随时随地看视频慕课网APP