我在SO和其他文档上研究了这个。我尝试过变基,合并,采摘和分离头。
经过6个小时的尝试,现在是时候问这个问题了!
以下是我的开始:
A-B-C-D-E-F-G master
以下是我想将其更改为:
A-B F-G master
\ /
C-D-E dev
我最接近的是:
A-B C-D-E-F-G-H Main
\ /
C-D-E dev
\
F-G master
我必须添加另一个分支名称和一个虚拟提交,以使分支完全正常工作。
但这比没有改变更糟糕。
请帮忙!
更新后更新
感谢您的回复。
是的,我的“我想要的”不是很清楚。希望这澄清了它:
A-B - F-G master
\ /
C-D-E dev
换句话说,F中的“master”是B加上分支“dev”合并到其中的结果。
仍然没有工作
感谢@frasertweedale尝试回答。
我已仔细按照您的指示操作,这是我最终的结果:
A-B - "merge branch 'dev'"-G master
\ /
C-D-E dev
\
F-G-"merge branch 'dev'"-F-G
我很高兴这很难:现在我花了7个小时就感觉不好!
最终结果 正如@frasertweedale所说,这正是我想要的,除了悬空提交。
所以,我只需要摆脱悬挂。
为清楚起见,我在下面重新绘制:
A-B - "merge branch 'dev'"-G2 master
\ /
C-D-E dev
\
F1-G1-"merge branch 'dev'"-F2-G2
此命令执行清理:
git rebase -p --onto F1^ F1
结果:
A-B - "merge branch 'dev'"-G2 master
\ /
C-D-E dev
“merge branch'dev'”包含原始F提交,当然可以通过这种方式重新评论。
答案 0 :(得分:0)
假设您将A
,B
等扩展到相应的提交哈希值,而master
位于G
,则第一步是分支dev
} E
:
git branch dev E
然后将master
重置为B
。
git reset --hard B
接下来,将dev
合并到master
,明确要求合并提交(否则它会执行快进,因为dev
没有偏离{ {1}}):
master
git merge --no-ff dev
现在包含最多master
的提交。现在,您可以 cherry-pick 原始E
和F
提交。
G
现在你有一些非常接近你想要的东西;唯一的区别是添加了合并提交git cherry-pick F
git cherry-pick G
:
(B+E)
如果您现在想要在合并提交A-B - (B+E)-F-G master
\ /
C-D-E dev
中包含F
的内容,则可以执行交互式rebase 并将两个提交压缩在一起。 <{1}}(别名(B+E)
)选项至关重要。
--preserve-merges
这将调用内容类似于以下内容的编辑器(提交哈希和摘要会有所不同):
-p
使用git rebase --interactive --preserve-merges B
指令替换pick d4057bd c
pick 9419ef8 d
pick ad9e208 e
pick 120a90a Merge branch 'dev'
pick 61552ad f
pick c947153 g
提交行开头的pick
指令(在上面的示例中为F
),然后保存并退出。系统将提示您从合并提交和squash
的提交消息中形成新的提交消息,然后将完成rebase操作而无需进一步的交互。在rebase之后,您将完全您要求的存储库历史记录(在您更新的问题中)。
缩写SCRIPT
以下脚本创建一个具有线性历史记录的新存储库,然后使用(大部分)与上面相同的步骤自动编辑历史记录。避免使用交互式rebase,因此不需要用户干预。
squash 61552ad f