我所在的分支有一个未发布的合并提交,后面跟着许多与之无关的本地提交。我想将该提交相对于其中一些提交移动:
不幸的是,当我这样做时:
git rebase -i <sha-of-merge-commit>^
字符串
交互式的rebase不是只得到一行代码,比如pick <sha-of-merge-commit>
,我可以重新定位,而是扩展了合并中的所有提交,几乎有30个。在rebase TODO buffer中有一行pick
,所有提交都在rebase TODO buffer中,而<sha-of-merge-commit>
没有出现在TODO中。
我们如何让git rebase -i
将合并提交视为普通提交,而不引入第二个父提交?
2条答案
按热度按时间e4eetjau1#
看起来这就是rebase的
--preserve-merges
所做的实际上,Git 2.22,Q2 2019,实际上是deprecates
--preserve-merge
,Git 2.25,Q1 2020,stops advertising it in the "git rebase --help
" output。我在this answer中展示了最近的
--rebase-merges
选项(Git 2.18,Q2 2018)。字符串
正如评论中提到的by j6t:
这仍然列出了来自分支分支的所有提交。
但是如果它们在
todo
列表中保持不变,历史将不会线性化。的确,当你进行一个交互式的变基,并打算对合并提交重新排序时,Git需要知道原来合并的提交,这样它才能在新的历史中准确地重新创建合并。如果你不改变待办事项列表中的这些行,Git将按照原来的方式执行合并,而不会线性化历史。
如果你要删除或编辑对应于侧分支提交的行,你将有效地重写该分支的历史,这可能导致线性化的历史-这意味着合并将不再显示为合并,而是显示为一系列单独的提交。
为了确保合并提交被保留为合并,并且合并后的分支的历史没有被线性化,你应该保留分支提交的行,因为它们在rebase to-do列表中。这样,当rebase被执行时,Git将重新创建合并,并保持原始历史的完整性,包括分支分支的提交。
0sgqnhkj2#
看起来这就是
rebase
的--preserve-merges
所做的。