Git 有两个版本作为分支

标签 git synchronization software-product-lines

我有一个包含两个不同版本的项目。每个版本都在另一个分支上,它们永远不会 merge 在一起。大多数代码是相同的,但每个分支都有其独特的部分。现在我需要将几乎所有提交都提交到两个分支中。

目前我为此使用 cherry-pick :我切换到另一个分支并挑选我需要的所有提交。

我不喜欢我这样做的方式。挑选每一个提交都需要一些时间,你可能会错过一个。

如何在不丢失独特更改的情况下保持两个基本相等的分支同步?

我已经阅读了几篇关于类似主题的文章,但似乎没有一篇适用于我的情况:

我也读过这个nice git branch guide但我在这里也看不到合适的解决方案。 hotfix 分支最接近,我想创建一个,但我认为 merge 会覆盖一些东西。

最佳答案

一种常见的做法是,根据最适合开发所寻求的特定主题/功能/错误修复的分支,为您的增量更改创建一个主题分支。然后主题分支被 merge 到你的两个分支中并被丢弃。 merge 不会覆盖您的历史记录,相反,它会全部保留在那里。

                    /-- * -- * -- * -- A
*-- old history -- * 
                    \-- * -- * -- * -- * -- B

如您所述,假设 AB 将来永远不会 merge 。当您需要添加功能时,您可以选择 A 或 B,以更适合特定情况的方式进行开发:

                                   /-- * -- * -- * -- C
                    /-- * -- * -- * -- A
*-- old history -- * 
                    \-- * -- * -- * -- * -- B

然后将 C merge 到 A 和 B 中并丢弃它:

                                   /-- * -- * -- * -- C --\
                    /-- * -- * -- * ----------------------*[merge] -- A
*-- old history -- * 
                    \-- * -- * -- * -- ..               --*[merge] -- B

(我错过了向 Henri Matisse 学习 ASCII 艺术类(class)的机会。)

这里有一些非常简单的东西:

$ git checkout A
$ git branch C
$ git checkout C
$ develop.sh 24h commit commit commit
$ git checkout A
$ git merge C
$ git checkout B
$ git merge C
$ git branch --delete C

现在运行你应该能够看到更好的 ASCII 艺术: $ git log --oneline --graph 您会看到 merge 并没有破坏您的任何历史记录。当然你不需要 --graph ,它也可以通过普通的 git log 看到。

关于Git 有两个版本作为分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640444/

相关文章:

git - .gitignore 中的语义 UI

c++ - 如何在main之前预加载数据

java - 同步多个线程写入java中的同一个文件

c# - Visual Studio 和 .NET 中的条件文件编译

git - 如何在一条规则中 gitignore 具有缩小版本的特定文件?

git - 使用 Gitolite 自动部署 PHP 脚本

git - 推送到Github后本地文件消失

javascript - StratifiedJS:如何从 .js 文件调用模块

java - 如何同时管理多个版本的类?

为两种不同设备开发代码的 git 最佳实践