【问题标题】:Maintaining multiple patches/feature branches for multiple development branches (and tags) in parallel为多个开发分支(和标签)并行维护多个补丁/功能分支
【发布时间】:2012-05-22 15:44:46
【问题描述】:

我们在 git(hub) 中创建了一个项目,并希望在我们的 fork 中维护一些补丁,同时在其发布(标签)和发布分支中重新创建这些补丁。

初始存储库结构

上游结构非常简单:

origin/trunk A---B---D---F---H---...
                  \
origin/0.9         C---E---G---...
                       |
                   (tag 0.9)

问题

上游项目在提交 AD 中增加了依赖项的版本,但这主要是为了方便,我们确信我们可以在一段时间内保持兼容性版本。

我创建了一个功能分支trunk_compat 并使用git revert --no-commit 为提交AD 创建补丁,因为我们需要它们。我已经把这个分支了origin/trunk

mine/trunk_compat              A*---D*
                              / 
origin/trunk A---B---D---F---H-...
                  \
origin/0.9         C---E---G---...
                       |
                   (tag 0.9)

所以现在我很容易关注origin/trunk 并根据我是否发布它来通过变基或合并来维护我的补丁。

我们的目标是为两个分支(trunk0.9)维护这些补丁,并重新创建 0.9 的发布版本(因为它是从 E 标记的) .

我不知道如何正确地做到这一点。

  • 我需要一个 0.9_compat 分支,它的所有提交都高达 G,但还包括我们的补丁 A*D*,以便我们可以将其放入我们的持续集成服务器中,看看它是否有效
  • 我需要一个标签0.9_compat,它的状态为E,并应用了A*D*
    • 为了让它更复杂,提交E 实际上是D0.9 分支的反向移植,所以我们的D* 补丁也应该在这里应用
    • 这不是正确的合并或变基,因为上游项目在 SVN 中,这是我们正在分叉的 git-svn 镜像
  • 将来上游将分支 0.10 等,我们也希望在这些分支上维护我们的补丁

我可以通过大量采摘或手动应用补丁来做到这一点(我认为),但这感觉不对,我认为我没有充分利用 git。

【问题讨论】:

  • 没有什么比在这里采樱桃更好的了。
  • 谢谢。我现在也是这样走的。它看起来相当笨重,但似乎有效。对于已经存在的分支,我挑选了我的补丁,然后重新调整它们的基础,使它们处于正确的顺序。

标签: git fork patch branching-and-merging


【解决方案1】:

有两种方法可以做到这一点,而且你得到了正确的 - 变基(包括樱桃挑选和补丁,最终结果相同)或合并。

  1. 设置所有需要修补的分支并应用修补程序(origin/trunkorigin/0.9_compat)。
  2. 在树枝上应用补丁
  3. 区别仅在于维护策略,这些分支是git pull(合并)与git pull --rebase(变基)。

策略之间的区别在于,对于git pull,git 会尝试将远程更改合并到您的本地分支(导致您有很多 git merge 提交,但您的补丁 sha 将保持不变)和对于 @ 987654326@ git 将首先获取远程更改,然后才尝试在顶部应用您的本地更改(导致每次拉取后您的补丁 sha 都会更改)。我认为 rebase 更合适(如果远程 repo 最初是 git,则此论点更强),因为您将始终留在项目的 HEAD + 您的补丁,而不会出现不必要的合并提交混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2020-05-22
    • 2023-04-09
    相关资源
    最近更新 更多