Git 在提交窗口上重新设置基础

Git 在提交窗口上重新设置基础,git,Git,我有一个分支的历史非常混乱 它有一个提交1-X,然后是一个长度为M的合并提交 我想重新设置合并提交的基础,这样我就不必重播合并冲突产生的所有合并冲突 有办法吗 还是我应该放弃,把所有的好东西都摘到另一个树枝上 你有吗 A -- B -- C -- D -- M -- E -- F -- G <--(master) / ... X -- X -- X 在本例中,master~4起作用,但通常需要一个解析为commit D的表达式。这将启动一个文

我有一个分支的历史非常混乱

它有一个提交1-X,然后是一个长度为M的合并提交

我想重新设置合并提交的基础,这样我就不必重播合并冲突产生的所有合并冲突

有办法吗

还是我应该放弃,把所有的好东西都摘到另一个树枝上

你有吗

A -- B -- C -- D -- M -- E -- F -- G <--(master)
                   /
    ... X -- X -- X
在本例中,master~4起作用,但通常需要一个解析为commit D的表达式。这将启动一个文本编辑器,并向您显示一个todo列表,如

pick 12345678 one of the X commits
pick 23456789 another X commit
pick 01234567 yet another X commit
pick 34567890 commit E
pick 45678901 commit F
pick 54321098 commit G
注意,M已经被省略了,因为默认情况下,rebase想要消除合并。在X xommits的行中,将第一个单词从pick更改为drop,或者删除该行。然后退出编辑器

如果任何提交E、F或G影响到任何X所涉及的同一大块代码,则必须像解决合并冲突一样解决它。但一旦事情解决了,你应该

A -- B -- C -- D -- E' -- F' -- G' <--(master)
这将选择可以从主机访问但不能从主机的第三个祖先M访问的提交进行重写-这些是E、F和G-并将D作为新的父级应用它们,跨过M


我应该注意到,这些方法和您可能拼凑在一起的任何其他方法实际上并没有删除X或M提交,并且重写的提交是完全新的提交,恰好与旧的提交相关,因此,例如,e'是e的重播,但它仍然是一个新的和不同的提交。完成此操作后,默认情况下,一段时间后,您仍然可以使用reflog返回到旧的历史记录。

您为什么担心混乱的历史记录?这会给你带来麻烦吗?我只是想提高我的git fu
A -- B -- C -- D -- E' -- F' -- G' <--(master)
git rebase --onto master~4 master~3 master