So if你还没有做出改变master你不介意重写历史master,有一种方法可以做到这一点——但是当你重新设定基础时,你正在重写历史,所以首先确保你知道自己在做什么 https://mirrors.edge.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history.
如果您确定这是您想要的历史方向,您应该首先查看master分支并交互地重新调整它的基础(git rebase -i
)到提交,其中feature被削减(在你的情况下,[M2]
).
在变基之前,您的历史记录应该如下所示(根据您原来的问题):
[F1]-[F2]-[F3] -- Feature Branch
/ \
[M1]-[M2]-[F1]-[M3]-[M4] -- Master Branch
启动交互式变基后,您应该看到以下操作:
pick hash_f1 [F1]
pick hash_m3 [M3]
pick hash_m4 [M4]
你会想要drop第一次提交,合并的内容feature在提交之前[F2]
and [F3]
, 以便master可以重播更改without [F1]
在里面。请注意,您不会丢失[F1]
提交,因为它仍然会在feature的历史。
变基应该给你这段历史:
[F1]-[F2]-[F3] -- Feature Branch
/
[M1]-[M2]-[M3]-[M4] -- Master Branch
master拥有所有M
提交,并且feature拥有所有F
提交,仍从[M2]
。从那里可以通过简单的合并得到feature回到master:
git merge --no-ff feature
瞧——你已经得到了你想要的:
[F1]-[F2]-[F3] -- Feature Branch
/ \
[M1]-[M2]-[M3]-[M4]-[F*] -- Master Branch
再次强调,要非常小心这是您想要做的事情,因为重写历史可能很危险。也就是说,在本地做这件事绝对是值得的。
此外,这个过程可以扩展到任何参考,而不仅仅是功能和主分支,因此在其他情况下这可能更有意义。在我看来,像这样的稳定分支master通常应该不能重写其历史记录,但每个 Git 环境和工作流程都不同,所以实际上没有不能重写的规则。