Git,将开发从一个分支转移到另一个分支

Posted

技术标签:

【中文标题】Git,将开发从一个分支转移到另一个分支【英文标题】:Git, moving development from one branch to another 【发布时间】:2022-01-11 03:27:39 【问题描述】:

我有一个 Git 存储库,其中包含一个带有两个分支的 Java 库:ma​​injdk8

jdk8 分支是主要的开发分支,所有更改都合并到 ma​​in 中,而 ma​​in 分支是模块化的并且基于 jdk11 ,包含 module-info.java 文件和 Gradle 构建文件中的更改、不同的构建插件和依赖项的模块化版本(如果可用)。两个分支的源代码本身几乎相同。

我想做的是停止在 jdk8 分支上进行开发并开始使用 ma​​in 作为主要开发分支,将更改合并到 jdk8 分支,从那里开始。

一些谷歌搜索让我找到了这些:

How to make empty merge commit (ignoring changes)?

Git - Ignore files during merge

于是我想出了这个策略:

git checkout jdk8

git merge -s ours main

我已经对此进行了测试,它看起来像预期的那样工作,也就是说,允许我开始在 ma​​in 上进行开发并将更改合并到 jdk8 分支中,不包括合并期间不属于那里的任何修改文件(例如,也许我可以使用 git 属性自动排除 module-info.java 文件)。

从表面上看,这似乎很容易处理,但由于我对 Git 的理解还很初级,我想知道这是否会在未来引起一些问题,是否有更好的(甚至“正确”?)这样做的方法?

【问题讨论】:

【参考方案1】:

这似乎是一个危险的流程。即使您成功进行了空合并,这将允许您将 main 中的未来更改合并回 jdk8,只要您有任何新的 jdk>8 更改,您就会遇到冲突,您必须手动解决。例如,您的 module-info.java 或 gradle 脚本中的任何更改都会让您头疼……我建议您有 2 个选项:

(选项 1)您可以只将通用功能添加到 jdk8 分支,然后轻松将它们合并到 main 和 jdk>8 devs 直接到 main

(选项 2)您可以使用 main 中的功能分支进行开发,然后合并回主分支,然后将它们挑选到 jdk8。

(选项 3)如果您想保留功能分支的历史记录:您可以(一旦分支合并到 main)使用 rebase --onto 仅将有趣的提交段获取到 jdk8 中

现在 jdk8 分支看起来更像是一个维护分支,我认为(选项 2)是首选

【讨论】:

谢谢YosefY,但我认为这里有一些误解。我不想继续在我的旧 jdk8 分支上开发,而是在 main 上继续开发。我希望能够将我将来在 main 中的更改合并到 jdk8 中,也就是说,反转我在 jdk8 上进行开发并合并到 main 中的旧工作流程。我正在寻找的是在我开始在 main 上开发之前“协调”两个分支的步骤,如果这有意义的话。 你需要在 Git 中查看分支,而不是作为一组提交,而只是作为指向 git 提交图中特定提交的指针。就您而言,据我了解,jdk8 是您的稳定分支,而主要分支是正在进行的开发人员。这就是我认为您首先应该反转分支名称并将 jdk8 分支称为“主”并合并第二个分支的原因。 git 提交图会更正确。一旦更改完成并且主要的协调更改。最佳实践应该是使用短期开发分支(每个开发一个)并将它们合并到主分支。 "branch -m" 只是重命名分支以使 jdk8 作为您的开发人员的基础(通过将其重命名为 main 并将当前的“主”分支名称更改为您想要的任何名称,并且将它合并到新调用的“main”(那是你的旧 jdk8 分支)。现在更清楚了吗? 这是要理解的要点 You need to see branches in Git not as a set of commit but only as a pointer to a specific commit in the git commit graph >你的 repo 不会被损坏,在任何情况下你都可以取回旧内容并将特定有问题的文件(如果您喜欢)更改回旧版本(在合并我们的之前)并再次从 jdk8 合并,手动解决冲突并使用此文件从新状态开始。顺便说一句,我编辑了我的答案:)

以上是关于Git,将开发从一个分支转移到另一个分支的主要内容,如果未能解决你的问题,请参考以下文章

Git:在分支中创建子模块

git将当前分支上修改的东西转移到新建分支

git --- cherry-pick用法

合并(用压扁)另一个分支的所有变化,作为一个单一的提交。

Git 在将两个分支合并到主(主)分支之前将一个开发人员分支合并到另一个开发人员分支

如何使用 Git / IntelliJ 将整个文件从一个分支移动/复制到另一个分支? [复制]