Git,将开发从一个分支转移到另一个分支
Posted
技术标签:
【中文标题】Git,将开发从一个分支转移到另一个分支【英文标题】:Git, moving development from one branch to another 【发布时间】:2022-01-11 03:27:39 【问题描述】:我有一个 Git 存储库,其中包含一个带有两个分支的 Java 库:main 和 jdk8。
jdk8 分支是主要的开发分支,所有更改都合并到 main 中,而 main 分支是模块化的并且基于 jdk11 ,包含 module-info.java 文件和 Gradle 构建文件中的更改、不同的构建插件和依赖项的模块化版本(如果可用)。两个分支的源代码本身几乎相同。
我想做的是停止在 jdk8 分支上进行开发并开始使用 main 作为主要开发分支,将更改合并到 jdk8 分支,从那里开始。
一些谷歌搜索让我找到了这些:
How to make empty merge commit (ignoring changes)?
Git - Ignore files during merge
于是我想出了这个策略:
git checkout jdk8
git merge -s ours main
我已经对此进行了测试,它看起来像预期的那样工作,也就是说,允许我开始在 main 上进行开发并将更改合并到 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,将开发从一个分支转移到另一个分支的主要内容,如果未能解决你的问题,请参考以下文章