将主开始提交到Git中的另一个分支

我正在尝试迁移到GitFlow工作stream程,我想重写存储库的历史logging,以使其全部符合新的存储库。

目前看起来像这样:

Master: A - B - C - D - E - F - - - - - - - - - L \ / Release: \ J - K \ / \ Development: G - H - IM 

我希望看起来像这样:

 Master: A - - - - - - - - - - - - - - - - - - - L \ / Release: \ J - K \ / \ Development: B - C - D - E - F - G - H - IM 

我已经尝试在这里search答案,我find了答案 ,但它似乎只工作,如果你正在创build新的分支,而不是使用已经存在的分支。

提前谢谢了。

在Git中,正如学者在他的评论中指出的那样,分支只是指向特定提交的指针或引用。 使用分支名称标记代码行,如同在图表左侧所做的那样,可能会造成混淆。

例如,在过去,承诺GHI只是development部门的祖先的一部分,这也许是事实。 但是,在您目前的回购状态下,它们属于三个分支( masterdevelopmentrelease )的祖先。

认为这三个提交( GHI )在某种程度上与development分支更相关,而不是masterrelease不再有意义,因为你的回购并不记得分支引用指向哪里到过去(尽pipe这些信息本地存储在称为reflog的东西中)。 你的Git仓库只知道分支引用指向的地方。

因此,当您绘制graphics来描述您的回购所处的状态时,如果分支指向一个提交,那么使用相应的分支名称标记提交本身就更有意义了。 我在下面的所有图表上都这么做了。

原始状态

 A - B - C - D - E - F - - - - - - - - - L [master] \ / G - H - I - J - K [release] \ M [development] 

期望的状态

 A - - - - - - - - - - - - - - - - - - - L' [master] \ / B - C - D - E - F - G - H - I - J - K [release] \ M [development] 

要结束这个状态,你应该采取以下三个步骤。

程序

1 – 检查你的master分支

 git checkout master 

之后, HEAD指向master

 A - B - C - D - E - F - - - - - - - - - L [HEAD -> master] \ / G - H - I - J - K [release] \ M [development] 

2 – 做一个硬重置master提交A

 git reset --hard <commit_ID_of_A> 

由于回购中的任何参考都不能再使用L ,所以从历史图表中“消失”了,

 A [HEAD -> master] \ B - C - D - E - F - G - H - I - J - K [release] \ M [development] 

3 – 做一个真正的release合并到master

在这个阶段,如果你只是跑步

 git merge release 

因为master的尖端是release尖端的祖先,所以会发生快速的合并,

 A - B - C - D - E - F - G - H - I - J - K [HEAD -> master,release] \ M [development] 

这不是你想要的。 因此,执行真正的合并需要--no-ff选项,在这里:

 git merge --no-ff release 

在这最后一个命令之后,您的回购应该处于期望的状态:

 A - - - - - - - - - - - - - - - - - - - L' [HEAD -> master] \ / B - C - D - E - F - G - H - I - J - K [release] \ M [development] 

请注意,我昵称新的提交L'而不是L因为这两个提交有不同的父项: L的父母是FK ,而新提交的父母L'AK

这应该做你想要的,(虽然我不知道你的发布分支)

 git checkout master git reset --hard commit_A # the commit id for A git merge --no-ff release