Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Git中管理多个开发分支?_Git_Branch - Fatal编程技术网

如何在Git中管理多个开发分支?

如何在Git中管理多个开发分支?,git,branch,Git,Branch,我有一个系统的5个分支——让我们称它们为master、London、Birmingham、Manchester和demo。它们仅在一个配置文件中有所不同,并且每个配置文件都有自己的图形文件集 当我进行一些开发时,我从master创建了一个临时分支,在该特性之后调用,并处理它。当准备好合并时,我会使用签出主机和git合并功能来合并我的工作。这似乎很管用 现在我需要将我的更改放到其他分支中,而不丢失它们之间已经存在的差异。我该怎么做?对于伯明翰获得伦敦的图形,以及配置文件中的冲突,我一直有很多问题

我有一个系统的5个分支——让我们称它们为master、London、Birmingham、Manchester和demo。它们仅在一个配置文件中有所不同,并且每个配置文件都有自己的图形文件集

当我进行一些开发时,我从master创建了一个临时分支,在该特性之后调用,并处理它。当准备好合并时,我会使用签出主机和git合并功能来合并我的工作。这似乎很管用

现在我需要将我的更改放到其他分支中,而不丢失它们之间已经存在的差异。我该怎么做?对于伯明翰获得伦敦的图形,以及配置文件中的冲突,我一直有很多问题

当分支最终正确时,我将其推到仓库,并将每个分支拉到Linux盒中进行最终测试,从那里开始,发布到生产中的版本将使用rsync(设置为忽略.git存储库本身)。这个阶段也很好


我是目前唯一的开发人员,但在邀请帮助之前,我需要让流程变得坚实:)

git-rebase
是您的朋友

像往常一样在主分支中进行更改。完成后,结帐到其他一家分行(比如伯明翰)并开始跑步
git-rebase-master
。git将在当前提交和伯明翰所基于的提交之间引入您在master上所做的更改。互联网上有很好的命令文档。这是我找到的两个


还有很多其他的。你会发现很多人都在谈论重定基期的危险。注意这些问题,但我怀疑在你的情况下,好处远远大于风险;知道危险是成功的一半。

有两种技巧可以帮助你:

  • :如果您有5个“主要项目”,每个项目包括:
    • 通用代码(一个功能接着一个功能得到增强)
    • 特殊代码(指定图形文件或配置值,每个站点一套)
因此,当您开发一个新功能时,您需要做的就是确保其他站点从中受益,以确保它们各自的repo引用最新的通用代码repo作为子模块。只需
git子模块更新
即可完成

另外,对于模板配置文件,您存储的只是配置值,而不是实际的配置文件本身(它们是生成的)。
这允许您在每个站点上进行一些微调,而不必“忽略”本地修改

总之:不要试图在一个repo中管理所有方面(公共代码、配置文件、特殊文件等)(包括所有涉及的合并和重基),而是尝试模块化应用程序。

另一种技术:

一旦您的新功能位于
master
中,请将master合并回所有其他相关分支

原始状态:

o---o-master
    \
     o-London
主控中的新提交:

o---o---o-master
    \
     o-London
使用git checkout London将新功能合并到伦敦分行;git合并主机:

o---o---o-master
    \   \
     o---o-London
但是请注意,这可能会很麻烦,尤其是当分支数量增加时。 我对您的系统一无所知,但如果您可以在一个分支中拥有所有配置,这可能会更容易(我的意思是让所有五个配置文件和图形文件始终存在于您的文件系统中)

例如,对于makefile,您可以根据当前目标配置选择要编译和链接的源文件。在您的情况下,makefile可以帮助您将图形文件和配置文件与目标配置相关联


能够构建您的所有配置而不必在两者之间进行任何签出也是很好的,不是吗?

正如您所说,“git rebase master”将展开到HEAD和master的公共父级。在git rebase master涉及19个提交(其中12个有冲突)之后,我开始寻找替代方案。我怎样才能避免这条路线每次都变得越来越长?请注意,使用
git-rebase
,您将失去分支的先前状态!如果您分发一个commit of London,然后重新设置分支的基址,您将无法返回到此状态。对,这是重复提到的
git-rebase
的危险。我认为这并不总是一件坏事。一旦您重新设置了基础,合并就完成了,您就不必再处理它们了(合并也是如此)。OP在提交中不断出现冲突的事实表明存在代码组织和流程问题,而不是方法问题。子模块在我们这里研究的情况下将完成几乎相同的事情,但仍然需要比目前明显发生的更仔细的过程和代码分离。@Gauthier-理解@Mcbeth-“但仍然需要比目前明显发生的更仔细的过程和代码分离。”哎哟-但你是对的:)@Ian这并不是说它可能会变得那么严厉。这个过程是很难的,尤其是在一个从1到多的项目中。如果您可以将变体与master的耦合稍微多一些,建议的任何一种方法都应该适合您,同时希望能够为您提供更多的可维护性。就你提到的过程问题而言,我已经拖延了一段时间把一个爱好项目从一个人转移到另一个人身上。+1。你的方法可能存在的一个问题是我必须添加一个新的图形。更新master和London-然后合并。我能得到什么?然后我需要在master中更改图形,但不需要在London中更改。这次我能得到什么?不是伦敦!结论-为每次安装的BIT制定一份回购协议,并为开发制定一份回购协议。使用makefile在伦敦和开发repos的最终测试位置组装每个版本,并将其部署到生产站点。源、配置、部署过程和生成文件都受版本控制。:)我只需要找时间建造