如何将一长串git合并转换为一个没有合并冲突的重基?

如何将一长串git合并转换为一个没有合并冲突的重基?,git,version-control,Git,Version Control,我有一个master分支,我们称之为foo,我已经使用了一段时间,在大约50次提交之后,我得到了一个相当复杂的合并历史,因为foo有自己的一些分支。这里的历史对我来说并不重要,所以我决定通过重定每个分支的基址并将所有的提交压缩为一个来清理问题,这样我就只有一个提交代表了master和该分支之间的差异 起初我以为我可以做到: git checkout foo git rebase master 但这不适合我。该分支有50多个提交,每个提交都涉及许多文件,每个提交都有一系列冲突 相反,我最终做的是

我有一个master分支,我们称之为foo,我已经使用了一段时间,在大约50次提交之后,我得到了一个相当复杂的合并历史,因为foo有自己的一些分支。这里的历史对我来说并不重要,所以我决定通过重定每个分支的基址并将所有的提交压缩为一个来清理问题,这样我就只有一个提交代表了master和该分支之间的差异

起初我以为我可以做到:

git checkout foo
git rebase master
但这不适合我。该分支有50多个提交,每个提交都涉及许多文件,每个提交都有一系列冲突

相反,我最终做的是:

git checkout foo
<copy all files to another folder>
git checkout master
git branch -D foo
git checkout -b foo
<overwrite all files with the copy I made earlier, and create a new commit>
git签出foo
切换到主分支
吉特分行-德福
git签出-b foo

这满足了我的需求,将长期的合并历史转化为一个单一的压缩再基础,而不必处理沿途的所有冲突,但我只是想知道是否有一种更“git友好”的方式来实现这一点?

在git中实现这一点的更友好的方式是创建第三个集成分支。在开发foo时,将master和foo合并在一起。这将向git展示如何处理同时发生变化的代码基。在配置中启用rerere(重用记录的分辨率)非常重要

现在,当您最终准备将foo合并到master中时,git将知道如何解决冲突,因为您一直在告诉它如何解决冲突

或者,准备好后,只需将该集成分支合并到master中。你不应该有冲突。这取决于您是否能够容忍历史中的所有这些测试合并

这与我在Branch per Feature上的帖子有些关联:

我不建议挤压提交,因为您会丢失有关文件如何处于其所处状态的信息。git需要处理的信息越多越好。

您是否尝试过:

git merge --squash
这样做的目的是获取所有更改并将它们放入准备提交的索引中。您仍然会有合并冲突,但它们将在一个地方,您可以在提交一大块声明之前修复它们


要获得更详细的解释和图表,请查看

Git的瓷器无法真正处理将所有合并步骤压缩为一个八达通合并提交所需的扭曲。幸运的是,Git公开了所需的管道,因此您只需一个命令就可以做到这一点。参见。

正如@AdamDymitruk所写,git Reerre做了记号。如果您需要一个方便的描述如何启用和使用它,您可能需要查看。这对我帮助很大。很有趣,我不知道Reere的事。我也不知道这件事——太棒了!