【发布时间】:2012-02-25 09:22:41
【问题描述】:
我正在处理一个大型 Rails 项目,我正在与之合作的团队正在使用 Github 来管理该项目。虽然许多更改是在本地进行的,然后直接推送到我们的开发分支,但当我们要进行非常大的更改时,我们会创建一个分支。当需要将该分支合并回开发时,我经常尝试在将功能分支合并到开发之前将开发重新设置回我的功能分支(以防止覆盖其他人的工作)。我发现当我这样做时,我似乎遇到了两次相同的合并冲突。我在变基时遇到了整个冲突列表,然后在合并时再次遇到相同的冲突列表。在将我的功能合并到开发之前,我应该将开发重新设置到我的功能分支中,还是应该将我的功能合并到开发中?
假设我的功能分支称为“new_feature”。我将它与“开发”分支合并的过程如下:
git checkout develop
git pull (this is set up on our rig to always pull rebase)
git checkout new_feature
git rebase develop
(lots of merge conflicts ensue)
git checkout develop
git merge -no-ff new_feature
(same set of merge conflicts again)
就好像时间线从我的 rebase 发生变化导致我的新功能分支一路镜像开发,然后与自身的伪副本发生冲突。
【问题讨论】:
-
为什么是
git merge -no-ff?如果您只是将 new_feature 重新定位到 develop 上,它应该是一个快进。 -
我真的不确定。有一段时间,我们这里有个真正了解 Git 的人,他告诉我,出于某种与清理时间线有关的原因,我应该这样做。我真的不知道是什么原因。
-
我可以看到它可能会使时间线混乱......嗯。 rebase 将
new_feature上的所有提交替换为应用于develop而不是原始分支点的等效更改,这意味着您将获得(副本)旧提交,其父母(在原始分支点和 @987654325 之间) @) 比他们老。 -
我没有将 new_feature 重新定位到开发上,是吗?我以为我正在重新开发新功能。
-
使用
--no-ff背后的原因是即使合并是快进的,它也会对提交进行逻辑分组,从而保持它们在历史上的某个时间点位于分支中的事实。当分支上有许多提交时,它特别有用,并且看到它们都是与添加的上下文相同的功能分支的一部分是有意义的。