如何更改Git中的分支点?
假设我的git回购中有以下结构:如何更改Git中的分支点?,git,git-rebase,git-cherry-pick,Git,Git Rebase,Git Cherry Pick,假设我的git回购中有以下结构: C'---D'---E'---F' (dev) / A---B---C---D---E---F (master) 我想将C'拉入主分支,并将分支点更改为C',也就是说,我想将上述内容转换为 D'---E'---F' (dev) / A---B---C---C'---D---E---F (master) 我认为我应该结合使用樱桃采摘和重定基
C'---D'---E'---F' (dev)
/
A---B---C---D---E---F (master)
我想将
C'
拉入主分支,并将分支点更改为C'
,也就是说,我想将上述内容转换为
D'---E'---F' (dev)
/
A---B---C---C'---D---E---F (master)
我认为我应该结合使用樱桃采摘和重定基调,但我不知道如何准确地做到这一点。我应该执行哪些操作序列
建议在注释之后,以获得更清晰的模式(因为原来的相同字母提交实际上是不必要的) 与相关的预期结果:
H---I---J (dev)
/
A---B---C---G---D---E---F (master)
H'--I'--J' (master)
/
A---B---C---D---E---F---G (dev)
您需要执行以下操作: 不要考虑这些提交的散列引用:
C
,C'
,D
,E
,F
。然后:
git签出主机
git重置——硬C
git cherry pick C'
git签出开发人员
git-rebase-i master
(交互式rebase以摆脱C')git签出主机
git cherry pick D
git cherry pick E
git cherry pick F
--强制
完成两个分支
如果您对git
不满意,我不建议您这样做,但如果绝对需要这样做,我会这样做
你可以走这条路
D'---E'---F' (dev)
/
A---B---C---D---E---F---C' (master)
然后根据
master
重新设置dev
分支的基础。这将是最简单的解决办法 您只需将master
重设为G
:
git checkout master
git rebase <id-of-G>
git签出主机
吉特重基
这将重写
G
上G
中未找到的master
中的所有提交。没有必要采摘樱桃。您的dev
分支将保持不变。对于您的新图表,简短的回答是,您可以使用以下内容重新设置G
的基础:
git checkout master
git rebase <commit_id_G>
与相关的预期结果:
H---I---J (dev)
/
A---B---C---G---D---E---F (master)
H'--I'--J' (master)
/
A---B---C---D---E---F---G (dev)
希望在这里更容易看到,我们只需要重新设置
master
的基础,而不是C
,D
这个新的D相同的字母提交之间的关系是什么?(即C
和C'
)这些是相同版本的重定基版本还是还原版本?还是别的什么?(此外,您的预期结果是不可能的,因为无论发生什么情况,D
都将始终为其父级提供C
)@romavaileriC
是C'
的父级(也是D
的父级)。您关于D
的观点总是需要将C
作为其父项才有意义。因此,也许我需要在图中用一些D'
替换D
,这与D
相同,只是它有C'
作为其父级?您没有回答我的问题。当然C
是C'
的父级,您的模式已经告诉我们了。我将重新措辞:如果您的所有提交都只是提交,为什么不用不同的字母命名它们。我们经常使用A'
来表示A
的重基版本或A
@romavaileri的反转。对不起,我误解了你的问题。D
和D'
、E
和E'
等之间没有任何关系(只有C
是C'
的父项。)我的提交标签令人困惑,我不知道关于重新设置基础提交的约定。无意冒犯,这只是为了帮助你避免对应答者做出错误的假设。如果您愿意,我建议重命名您的模式。这应该是git-rebase-hash-of-d
(而不是G的hash),否则这是正确的(并且经过了投票)。请注意,原始的H-I-J
链仍保留在存储库中(通过ORIG_HEAD
临时查找,默认情况下通过主文件的reflog至少保留30天)。我喜欢用名称H'-I'-J'
来绘制新的提交,以表示尽管我们使用它们就像它们是原始的H-I-J
链一样,但它们实际上是具有新的、不同的哈希ID的新提交。@torek我在第二个OP图中指的是G。这有点让人困惑。我会按照你的建议用素数重做我的第二张图表。谢谢!看来我对rebase的理解是完全错误的。有人能介绍一个关于git的好教程吗?(我主要是在一个分支上使用git进行版本控制,有点像svn的替代品,但我知道你可以用git做更多的事情,你会感兴趣去学习它们。)这是一种复杂的方法,它会毫无理由地在dev
上重写历史。@CalumHalpin来自原始帖子,他想改写这两个分支的历史。他想从<代码> DEV/<代码>中取出一些东西,把它放在<代码> Muth[4]的代码中间,然后将代码“>代码> DEV/<代码>从提交到主< <代码>中提交。他的图表显示了<>代码> DEV的完全相同的历史。它在不同的点分支出master
,但这是因为master
已更改。“我想将C'
拉入master
分支,并将分支点更改为C'
”。他的原始图表清楚地表明了这一点。不知道为什么每个人都忽略了原来的问题。正如我所说,我个人不会这么做,但我相信他一定有这样做的理由,“分支点”正是这两个分支历史的分歧点。将master
单独重定到C'
/G
上会更改它,因为现在master也包含该提交。无论哪种方式,dev
的历史记录都将是A->B->C->G->H->I->J
,无需重新设置/重写这些提交的基础。这就是为什么我们“忽略”原始问题的这一部分。