如何将一系列git合并转换为单个rebase而不会发生合并冲突?

时间:2012-11-28 17:39:22

标签: git version-control

所以我有一个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>

这有助于我将合并的悠久历史转变为单一的压扁基础而不处理所有冲突的需求,但我只是想知道是否有更“友好的”方式这样做?

3 个答案:

答案 0 :(得分:3)

在git中这样做的更友好的方法是创建第3个集成分支。当你开发foo时,合并master和foo就可以了。这将显示git如何处理同时更改的代码库。在配置中启用rerere(重用记录的分辨率)非常重要。

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

或者,在准备好时将该集成分支合并到master中。你应该没有冲突。这取决于您是否可以容忍历史记录中的所有测试合并。

这与我关于每个功能分支的帖子有些关联: http://dymitruk.com/blog/2012/02/05/branch-per-feature/

我不建议压缩提交,因为你丢失了文件如何处于它们所处状态的信息.git使用的信息越多越好。

答案 1 :(得分:0)

你试过了吗?

git merge --squash

这样做是需要进行所有更改并将它们放入准备提交的索引中。你仍然会有合并冲突,但是它们将在一个地方,你可以在提交一个大块之前修复它们。

有关更详细的说明和图表,请查看this

答案 2 :(得分:0)

Git的瓷器无法真正处理将所有合并步骤真正压缩成一个章鱼合并提交所需的扭曲。幸运的是,Git暴露了所需的管道,因此您可以使用一个命令执行此操作。请参阅this answer to a question I had about octopus merges