如何更改Git中的分支点?
How to change the branching point in Git?
假设我的 git 存储库中有以下结构:
C'---D'---E'---F' (dev)
/
A---B---C---D---E---F (master)
我想把C'
拉到master分支,把分支点改成C'
,也就是把上面变成
D'---E'---F' (dev)
/
A---B---C---C'---D---E---F (master)
我认为我应该结合使用 cherry-picking 和 rebase,但我对具体如何操作感到困惑。我应该执行哪个操作顺序?
建议 评论后更清晰的模式(因为原来的同字母提交实际上是不必要的)
G---H---I---J (dev)
/
A---B---C---D---E---F (master)
与相关的预期结果:
H---I---J (dev)
/
A---B---C---G---D---E---F (master)
您需要执行以下操作:
不要考虑这些提交的哈希引用:C
、C'
、D
、E
、F
。那么:
git checkout master
git reset --hard C
git cherry-pick C'
git checkout dev
git rebase -i master
(交互式变基以摆脱 C')
git checkout master
git cherry-pick D
git cherry-pick E
git cherry-pick F
用 --force
推送两个分支以完成。
如果您对 git
不满意,我不推荐这样做,但如果绝对需要这样做,我会这样做。
你总是可以走这条路
D'---E'---F' (dev)
/
A---B---C---D---E---F---C' (master)
然后 cherry-pick C'
然后根据 master
重新设置 dev
分支的基址。那将是最简单的解决方案。
您只需要将 master
变基到 G
:
git checkout master
git rebase <id-of-G>
这将重写在 master
中找到的所有提交,这些提交在 G
中找不到 G
之上。没有必要挑樱桃。您的 dev
分支将保持不变。
对于您的新图表,简短的回答是您将 G
变基为:
git checkout master
git rebase <commit_id_G>
较长的答案是您很难看到这一点,因为您将 master
视为 "main" 分支,并将 dev
视为 "offshoot".但是,当然,这些分支名称只是标签,您可以将它们中的任何一个视为 "main" 分支。
而且,由于 master
是我们实际要更改的分支,我们可以像这样重新绘制图表:
H---I---J (master)
/
A---B---C---D---E---F---G (dev)
与相关的预期结果:
H'--I'--J' (master)
/
A---B---C---D---E---F---G (dev)
希望在这里更容易看到,我们只需要将 master
变基到这个新的 D
而不是 C
.
假设我的 git 存储库中有以下结构:
C'---D'---E'---F' (dev)
/
A---B---C---D---E---F (master)
我想把C'
拉到master分支,把分支点改成C'
,也就是把上面变成
D'---E'---F' (dev)
/
A---B---C---C'---D---E---F (master)
我认为我应该结合使用 cherry-picking 和 rebase,但我对具体如何操作感到困惑。我应该执行哪个操作顺序?
建议 评论后更清晰的模式(因为原来的同字母提交实际上是不必要的)
G---H---I---J (dev)
/
A---B---C---D---E---F (master)
与相关的预期结果:
H---I---J (dev)
/
A---B---C---G---D---E---F (master)
您需要执行以下操作:
不要考虑这些提交的哈希引用:C
、C'
、D
、E
、F
。那么:
git checkout master
git reset --hard C
git cherry-pick C'
git checkout dev
git rebase -i master
(交互式变基以摆脱 C')git checkout master
git cherry-pick D
git cherry-pick E
git cherry-pick F
用 --force
推送两个分支以完成。
如果您对 git
不满意,我不推荐这样做,但如果绝对需要这样做,我会这样做。
你总是可以走这条路
D'---E'---F' (dev)
/
A---B---C---D---E---F---C' (master)
然后 cherry-pick C'
然后根据 master
重新设置 dev
分支的基址。那将是最简单的解决方案。
您只需要将 master
变基到 G
:
git checkout master
git rebase <id-of-G>
这将重写在 master
中找到的所有提交,这些提交在 G
中找不到 G
之上。没有必要挑樱桃。您的 dev
分支将保持不变。
对于您的新图表,简短的回答是您将 G
变基为:
git checkout master
git rebase <commit_id_G>
较长的答案是您很难看到这一点,因为您将 master
视为 "main" 分支,并将 dev
视为 "offshoot".但是,当然,这些分支名称只是标签,您可以将它们中的任何一个视为 "main" 分支。
而且,由于 master
是我们实际要更改的分支,我们可以像这样重新绘制图表:
H---I---J (master)
/
A---B---C---D---E---F---G (dev)
与相关的预期结果:
H'--I'--J' (master)
/
A---B---C---D---E---F---G (dev)
希望在这里更容易看到,我们只需要将 master
变基到这个新的 D
而不是 C
.