为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Git
皈依舞 2019-09-24 16:11:55
关于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布局信息(和注释),也没有任何有关信息/移植的弃用注释。这更接近于支持我的想法,但是我欢迎您进行任何确认或澄清。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

如果您需要使用重写父提交git replace,这就是方法。


正如菲利普·奥克利(Philip Oakley)所述,git replace只是将一个提交替换为另一个提交。要将父级嫁接到现有提交上,您需要先使用正确的父级创建一个伪提交。


假设您有两个要移植的git分支:


(a)-(b)-(c) (d)-(e)-(f)

现在我们希望(d)是(c)的父代。因此,我们用正确的父项(让我们将其称为c1)创建替换(c),然后git replace用(c1)替换(c)。在这些步骤中,每个字母均表示代表该提交的SHA1哈希。


要创建新的提交:


git checkout d

git rm -rf * # remove all files from working direcotry

git checkout c -- . # commit everything from c over top of it

GIT_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)

答对了!


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 754 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信