Git:如何正确合并两个功能和完全不同的分支?

时间:2013-01-09 18:28:47

标签: git git-merge git-rebase

想象一下这样一种情况:你有两个同一个项目的分支,第一个分支的一个部分在另一个分支上显着重构。但有一段时间你需要保持两个分支功能,所以你正在修复错误和两个关键功能添加,有时以不对称的方式。在某些时候,你需要将重构分支合并到原始分支上。在这种情况下使用的最佳技术是什么?是否仍然可以保持历史清洁?

但更重要的是,在这种情况下,我最初的策略应该是什么?

2 个答案:

答案 0 :(得分:9)

由于任务只是使用另一个分支而不是master,您可以完全删除master分支或重命名为 - legacy,然后再使用另一个分支并重命名它到master。而已。以下是您可能需要执行的实际命令,以便在本地和GitHub上实现目标:

git branch -m master legacy               # rename local master to legacy
git checkout legacy
git branch -m another_branch master       # another_branch will be our new master

我们现在已经完成了。但是,您不能简单地在GitHub上删除master分支。您需要先将另一个分支作为默认分支。这可以在存储库Settings > Default Branch中完成。完成此操作后,您可以继续:

git push origin :master                   # remove master on GitHub
git push origin master                    # push out our new master branch
git push origin legacy                    # push our legacy branch too

然后返回Settings > Default Branch并将默认分支切换回master。此外,您可以删除在迁移过程中可能已创建的所有额外分支。

或者,如果您要将所有操作保存在历史记录中,请检查正确答案here

答案 1 :(得分:2)

由于你有两个分支,一个是从另一个分支显着重构,你维护两个...我会说Git不会神奇地帮助你。对于git来说,你应用于分支1的补丁/更改需要与分支2类似(但不完全相同)。

由于它被重构,代码可能不相似,除非新代码在两个分支上模块化为相同。

首先你应该做些什么?

  • 将一些单元测试和/或集成测试代码添加到初始分支
  • 在第二个分支上运行相同的集成测试
  • 用于新更改添加测试
  • 然后您可以验证更改是否适用于两个分支

更新: 要管理两个分支的更改,您可能只需要一个进程,例如:   - 主要在分支重构上工作   - 将每个“故事”或工作项合并到分支遗留文件中

如果代码在分支之间的差异太大,我认为第二步是很多工作。如果必须维护两个分支,请尝试将新代码封装在可在两个分支中使用的库中。这将使从一个分支到另一个分支的合并。