5

我们有一个为每个客户定制的基础系统。基础存在于自己的存储库中,每个客户端都存在于自己的存储库中(最初是从基础克隆的)。

目标是能够根据需要向基础添加错误修复/功能,可以将其传播给客户端。

到目前为止,工作流程如下:

  • 为基本修复/功能制作提交/主题分支:(基于基础,主)git commit -m "Fix admin typo"
  • 将这些更改合并到客户端: (on client, master) git merge base/master。显然,这包括修复基础和客户端自定义之间的任何冲突。
  • 将合并推送到客户端的原点:(在客户端,主控)git push origin master
  • 我们的约定是使用 rebase 进行拉取(以保持历史可读性)。因此,在客户端项目上工作的不同开发人员将(在客户端,主控)git pull --rebase origin master

正是在这一点上,我们遇到了 pull/rebase 的重大问题。在从基础合并到客户端后,开发人员会在 pull/rebase 中遇到冲突。而且它不仅仅是一些冲突,还有很多(对于许多被重放的提交?),并且通常是特定开发人员甚至从未接触过的代码。我认为这是不合理和不可持续的。

这里最好的解决方案是什么?

我唯一的想法是在拉取和处理草率和难以阅读的日志时停止使用 rebase,但我宁愿不必这样做。这些客户项目可以持续多年,我希望将来能够从基础系统合并中获得一些意义。

4

1 回答 1

3

让我在你的回购中直截了当地说:

  1. 主项目是分开的,叫做base
  2. 每个客户端项目都是从中克隆的base,仅拉取更新
  3. 开发人员从公共client_foo回购工作,和push/pull到/从那个

工作流程失败,因为一个开发人员正在将client_foo分支重新定位到来自baserepo 的新提交并推回client_foo. 这最终会破坏所有其他开发client_foo人员在尝试进行下一次拉动时使用的。所以你不能这样做,并期望 git 自动处理它。

如果每个客户端存储库只有一个开发人员,那么也许这会起作用。我认为情况并非如此。

选项:

  1. 继续做你正在做的事情,但是当开发人员将重新建立的client_foo分支(带有新的base提交)推送回公共仓库时client_foo,其他所有人都必须执行reset --hardon origin/master. 如果他们将所有未推送的更改保留在私有主题分支中,那么他们必须将rebase这些更改返回到新的client_foo/master.

  2. 让您的开发merge人员从 更改baseclient_foo. 这会给你一个client_foo你说你试图避免的合并提交,但它会给你最准确的历史。当您的开发人员执行“pull --rebase”时,您不应再获得现在的一长串冲突。

  3. 让您的开发cherrypick人员从更改baseclient_foo. 这使您的历史保持线性,但 git 将不再跟踪cherrypick'd 提交来自base. 你必须想出另一种方法来跟踪它。

我会说坚持使用#2,因为这是 git 应该工作的方式。但是,其他人可能会想到更好的非显而易见的解决方案。

于 2010-08-20T22:14:28.417 回答