将主开始提交到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中,正如学者在他的评论中指出的那样,分支只是指向特定提交的指针或引用。 使用分支名称标记代码行,如同在图表左侧所做的那样,可能会造成混淆。
例如,在过去,承诺G
, H
和I
只是development
部门的祖先的一部分,这也许是事实。 但是,在您目前的回购状态下,它们属于三个分支( master
, development
和release
)的祖先。
认为这三个提交( G
, H
和I
)在某种程度上与development
分支更相关,而不是master
或release
不再有意义,因为你的回购并不记得分支引用指向哪里到过去(尽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
的父母是F
和K
,而新提交的父母L'
是A
和K
这应该做你想要的,(虽然我不知道你的发布分支)
git checkout master git reset --hard commit_A # the commit id for A git merge --no-ff release