如何维护长期运行的Git分支

24

Git分支理想情况下应该只持续短时间,大约1-2天。然后它会被合并到某个主干分支中。

但在某些情况下,我们需要维护分支来处理非常大的特性。当有2或3个人分别在代码的独立区域工作时,这些非常大的特性变得难以维护。

在修复稳定分支的错误的同时,我们需要保持这2-3个大分支与稳定分支同步。因此我们经常需要这样做。

(in feature-branch1) $ git merge stable
(in feature-branch2) $ git merge stable
(in feature-branch3) $ git merge stable

如何正确地在git中维护这些长期运行的分支?通过上述操作,Git记录看起来有点混乱。这些功能分支大多被推送到远程仓库,这意味着我们无法使用rebase作为选项。还能做什么?


3
“Git分支理想情况下应该持续很短的时间”?这对我来说是新闻。谁说的? - Mat
2
我同意,分支没有硬性规定。 - mislav
1
谢谢大家。只是想看看其他人如何维护这个“混乱”。 - Anand
3个回答

17
每隔一段时间将稳定分支合并到功能分支中,实际上是保持功能分支最新的最简单和最好的方法。我不推荐使用变基,因为可能会有更多人同时在功能分支上工作,每次强制推送时他们都需要重置本地分支。即使只有一个人在功能分支上工作,合并也比较好,因为它清楚地显示了从稳定分支引入修复的历史点。
是的,当你将功能分支合并回稳定分支时,你的历史记录看起来可能会有些凌乱。但只要避免每天通过Git拉取的微小合并混乱(使用 git pull --rebase 代替),你就能欣赏到真正有意义的合并。
如果你真的想避免将新功能从稳定分支合并到功能分支中,但只想要错误修复,你可以将错误修复挑选到功能分支中。然而,这可能需要很多工作,因为它要求你始终掌握稳定分支中正在发生的所有事情。使用git cherry来帮助你:
# commits from "stable" that are not present in
# the current branch will be prefixed with "+"
git cherry HEAD stable

当我将主分支合并到功能分支时,我遇到了一些奇怪的经历。有时候主分支的更改不会进入功能分支(某人在合并步骤中搞砸了),然后当功能分支最终合并回主分支时,那些主分支的更改就消失了,更糟糕的是,它们消失的地方在git的历史记录中也没有显示出来。因此,我们总是将功能分支合并到主分支,然后再将其推送到功能分支并继续工作(而不触及远程主分支)。类似于https://dev59.com/mGMm5IYBdhLWcg3wi_i0 - Rivera

2

如果团队规模足够小,并且由经验丰富的git用户组成,那么重新定位是可行的。

您可以做的事情是,例如:同意每晚将功能分支重新定位到稳定版。或者在将功能分支重新定位到稳定版时发送电子邮件。

一切都应该没问题,但是如果您忘记与重新定位的功能分支同步,比如说您在旧的功能分支oldFB之上提交了C,而这个分支已经被重新定位到oldFB'中:

S1 - oldFB - C <-- feature-branch
    \
     S2 - oldFB' - D <-- origin/feature-branch

你可以通过运行以下命令来将你的提交 C 进行变基:

git checkout feature-branch
git rebase --onto origin/feature-branch oldFB C

请注意,您需要在上面的图表中手动查找名为oldFB的提交。

2
当我在对一个长期存在的分支进行变基时,我倾向于创建一个新的基于它的分支,并赋予一个新的名称,以避免协作者必须处理重写的历史记录。(例如:git checkout tiresome-feature2; git checkout -b tiresome-feature3; git rebase master)。然后你只需要告诉协作者你现在正在这个新分支上工作,如果他们想要的话,他们可以在其上进行变基。 - Mark Longair
1
@MarkLongair:这确实避免了他们处理强制推送的麻烦,但他们必须记得切换到新分支,并有时将本地更改带到新分支中。这会导致同样数量的工作量,所以最终你没有获得太多好处。 - mislav
1
@mislav:根据我的经验,这要容易得多,但我猜这很大程度上取决于参与的人 :) - Mark Longair

0

最好的选择是仅将所需的小错误修复/功能分支合并到您的长期特性分支中。这样,您只会得到您需要的内容。请注意,如果您让这些分支存在足够长的时间,它们最终可能会与主分支相当不同步。偶尔,您可能需要从长期特性分支创建一个临时分支,并将主分支合并到其中,以进行健全性检查-查看是否存在冲突,查看主分支中的更改是否破坏了该特性等。

其次,最好定期将主分支合并到您的长期特性分支中。这是相当安全的,但也可能合并您不感兴趣的许多更改,并使事情变得复杂。

不建议定期在主分支上进行变基。这使得每个人都难以保持同步,也使得在您的特性分支上维护复杂历史(合并)更加困难,并使冲突解决更加痛苦。


我了解到你(或你的队友!)永远不应该将稳定分支(master)_合并到_特性分支中,因为某些稳定更改可能会被意外丢弃!始终从你的特性分支合并到本地的主分支。然后,您可以将本地主干作为远程特性分支拉取。 - Rivera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接