【问题标题】:How to maintain long running git branches如何维护长时间运行的 git 分支
【发布时间】:2011-10-13 09:50:20
【问题描述】:

理想情况下,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 作为选项。我还可以做些什么?

【问题讨论】:

  • “理想情况下,Git 分支应该持续很短的时间”?这对我来说是个新闻。谁说的?
  • 我同意,分支没有硬性规定。
  • 谢谢大家。只是想看看其他人如何维护这个“烂摊子”

标签: git


【解决方案1】:

时不时地合并到稳定的分支实际上是您可以做的最简单和最好的事情,以使您的功能分支保持最新。我不建议使用 rebase,因为可能有更多的人同时在使用该功能,并且每次强制推送时他们都必须重新设置本地分支。即使只有一个人在功能分支上工作,合并也更好,因为它清楚地显示了您从稳定分支引入修复的历史点。

是的,一旦您将功能分支合并回稳定版,您的历史记录可能看起来有点混乱。但是,只要您避免 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

【讨论】:

  • 在将 master 合并到功能分支时,我有一些奇怪的经历。有时 master 中的更改不会进入功能分支(有人有点搞砸了合并步骤),然后当功能分支最终合并回 master 时,这些 master 更改消失了,甚至更多,它们消失的地方没有不会出现在 git 的历史上。出于这个原因,我们总是将功能分支合并到 master,然后再次将其推送到功能分支并继续工作(不接触远程 master)。有点stackoverflow.com/questions/17527276/…
【解决方案2】:

如果团队足够小,并且由经验丰富的 git 用户组成,则可以重新设置基准。

例如,您可以同意功能分支每晚都会在 stable 上重新建立基础。或者,您可以在将功能分支变基为稳定时发送电子邮件。

一切都应该没问题,但是 如果您忘记与重新定位的功能分支同步,假设您在旧功能分支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 的提交。

【讨论】:

  • 当我对一个长期存在的分支进行 rebase 时,我倾向于使用新名称创建一个基于它的新分支,以避免合作者不得不处理重写的历史。 (例如git checkout tiresome-feature2; git checkout -b tiresome-feature3; git rebase master。)然后你只需要告诉合作者你现在正在开发这个新分支,如果他们愿意,他们可以重新建立它。
  • @MarkLongair:这确实避免了他们不得不处理强制推送,但他们确实必须记住切换到新分支,有时将他们的本地更改带到它。这导致相同数量的工作,因此您最终没有获得太多收益。
  • @mislav:根据我的经验,这要容易得多,但我想这在很大程度上取决于相关人员:)
【解决方案3】:

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

下一个最好的方法是定期将 master 合并到您长期存在的功能分支中。这是相当安全的,但也可以合并很多您不感兴趣的更改,并使事情复杂化。

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

【讨论】:

  • 我了解到您(或您的队友!)不应该将您的稳定分支(主)合并到您的功能分支,因为一些稳定的更改可能会被意外丢弃!始终从您的功能合并到本地的主分支。然后你可以将你的本地 master 作为远程功能分支。
猜你喜欢
  • 2012-04-05
  • 2011-01-11
  • 1970-01-01
  • 2012-07-29
  • 2020-05-19
  • 2019-04-20
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多