git - "Layering"git 存储库

标签 git git-branch repository-design

我每天都使用 git 有一段时间了,这次我遇到了一个问题,我可以这样描述。

我有一个包含整个网站结构的存储库,Web 根目录位于存储库的根目录中。一切都很好,直到它成为单个站点的存储库。然而,同一个存储库现在用于多个站点 - 基本上是同一个站点,使用不同的语言,对模板进行细微调整,不同的图形等。这些东西自然是版本化的。

有一个 master 分支,它保存站点的原始源代码,我希望 master(或其他分支)保存所有站点通用的代码,因为最终会有更改过于特定于站点,无法包含在 repo 协议(protocol)的通用部分中。

接下来,每个使用此源代码的站点都有一个分支。所有这些分支(例如,site1site2site3)都是从 master 分支创建的,并且每个站点都克隆正确的分支。

嗯,这似乎是个好主意,直​​到我开始对所有地方进行更改。

如果我在 site1 分支上进行了更改,并且我需要将该更改复制到 site2 分支,我会从一个分支到另一个分支进行 cherry-pick 提交。 merge 是不可能的,因为 site1 分支上还有其他更改不属于 site2 分支。对于这种情况是否有其他更优雅的解决方案,或者 cherry-pick 正是为了这个目的?

现在,对我来说真正的“问题”是当我更改 master 时,然后我想将所有这些更改复制到所有分支。自然地,考虑到所有分支都是 master 的后代,并且我确实想要在所有 site* 分支中进行这些更改,我切换到每个分支并 merge master。

这为所有分支创建了一个非常难看的历史记录。每一轮 merge 都会使图形变得相当复杂,这使我得出两个结论:

  1. 这种分层分支的方式可以工作,只要我小心翼翼,不做任何愚蠢的事情,并且不试图从所有分支历史图表中获得任何意义。或者..
  2. 必须有一些更好、更合适的方法来做到这一点。

为了说明我的“问题”,我将给出在创建这些分支后得到的图形图像,添加一些特定于分支的提交,挑选其中的一些,添加并 merge 来自主分支的一个提交到所有分支,将一两个提交到特定分支,然后再进行一次主到所有 merge 。

sort of not-so-simple history graph

我不知道,我喜欢简单,也许我不习惯看到像这样难以理解的图表(恐怕随着每次 merge ,它只会变得更加复杂)。

我想我可以一路 cherry-pick ,并拥有整洁的历史图表,但这听起来也不对,因为我可能会连续进行多次提交,然后忘记选择其中一个给所有人其他分支...

那么...您有什么想法、经验和建议不介意分享吗?

更新:我选择了我对已接受答案的评论中描述的解决方案。感谢所有做出贡献的人!

更新 2:尽管它与这个问题没有紧密关系,recently I stumbled upon this model of branching这似乎适用于几乎任何有组织的开发周期,以 GIT 作为底层 DVCS。这真是一本好书。推荐。

最佳答案

备选答案:

您可以将抽象从分支级别移动到存储库级别。使用 master 分支创建一个主仓库。为每个站点克隆此存储库。在 master 分支上进行更改时,将这些更改 pull 入每个站点 repo。这样一来,每个 repo 协议(protocol)只需要一个主分支。


原答案:

当 master 分支被更改后,您可以将其他分支 rebase 到更新后的 master 分支上。让我们假设你有 pl_site 基于 master 上的一些提交并且 master 已经改变:

 o---o---o---o---o  master
         \
          o---o---o---o---o  pl_site

在你rebased pl_site之后,它看起来像:

 o---o---o---o---o  master
                  \
                   o'---o'---o'---o'---o'  pl_site

请注意,对 pl_site 的 rebased 版本的提交是新的。 pl_site 现在包含对 master 所做的更改。

命令:

$ git checkout pl_site
$ git rebase master

关于git - "Layering"git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5977348/

相关文章:

git - 我可以在 Git 中删除分支后恢复它吗?

c++ - 处理多个颠覆项目之间的关系

git - 我的同事是如何设法让 git checkout 移动文件的?

git - TFS Git - pull 请求 'Merge failed'

git - 没有指定分支的 "git push"的默认行为

c# - 找不到 EntityBase 和 IAggregateRoot 引用?

svn - 在tortoisesvn中更改文件树

git - 推送到 github 后重命名提交消息

git - VS Code v1.70 merge 编辑器 UI 已更改。如何恢复?

git - gitpython-检查分支是否未与 repo 对象 merge ?