如何在2个不同的存储库中合并分支?

时间:2016-07-19 21:17:25

标签: git version-control

enter image description here

我是git的新手,我想知道如何在示例项目2 到 UAT 分支的 Master 分支>分段/支持即可。我知道可以在特定存储库下合并不同的分支,但不确定合并是如何跨存储库工作的。

我真正想要做的是,在完成示例项目2 之后,我想将其移至 UAT 分支进行测试等,最终到发布的生产分支。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:22)

我建议您创建Staging / Support存储库的本地克隆。然后将项目存储库添加为其他远程存储库,这允许您在本地存储库中与它们进行交互。在本地进行合并并将结果推送到Staging存储库。

这可以通过以下步骤来实现。

初始化和首次合并

$ git clone -o staging http://staging

这会克隆您的暂存存储库。您需要替换" http://staging"使用正确的Staging / Support存储库URL。您可能还想提供将存储库克隆为另一个参数的路径。参数-o确保调用远程存储库" staging"这有助于以后将其与项目存储库区分开来。

下一步是添加要合并的远程存储库(在本例中为"示例项目2")

$ git remote add project2 http://sampleproject2

再次,替换" http://sampleproject2"使用存储库的URL"示例项目2"。您还可以更改" project2",这是远程存储库的名称,以更好地适应您的项目。

执行此操作后,git branch -r将显示staging和project2中的分支,如下所示:

$ git branch -r
staging/Production
staging/UAT
project2/Master
project2/QA
project2/DEV

接下来检查要合并的分支,如下所示:

$ git checkout -b staging_UAT --track staging/UAT

这将创建一个名为staging_UAT的新本地分支,该分支从登台存储库跟踪远程分支UAT。新分支将立即签出。

现在您已从签出的分段中获得UAT分支的副本。您可以合并来自project2的更改:

$ git merge project2/Master

现在,来自project2的分支Master的所有更改都合并到当前分支(即staging_UAT)中。您可能需要查看git log才能看到结果。如果它适合您的预期,您可以将其推送到Staging存储库:

$ git push staging staging_UAT:UAT

执行此操作时,将本地分支staging_UAT的当前状态推送到名为staging的远程存储库中的分支UAT。

您可以平等地处理其他项目,还可以添加像staging_Production这样的分支,将您的更改合并到Staging的Production分支中。

未来合并

您可以使用相同的克隆进行将来的合并,而无需一次又一次地进行所有克隆和分支创建。但是,在这种情况下,您需要更新有关远程分支的本地信息:

$ git checkout staging_UAT
$ git pull

首先,您需要更新staging_UAT以匹配Staging存储库中的当前UAT版本。这是通过"拉动变化来完成的。由于分支staging_UAT是使用" - track staging / UAT"创建的,因此git知道从何处获取更改。如果暂存中的UAT永远不会以任何其他方式更改(意味着:使用这个本地克隆来从staging_UAT推送),这不是必需的。

如果在暂存时更改UAT并且您没有拉动,则在推送时会出错,并说:

Updates were rejected because the tip of your current branch is behind its remote counterpart.

另一个更新会影响Project2存储库:

$ git fetch project2

此外,存储库project2的分支可能已更改。如您所见,git fetch用于获取这些更改。 fetch和pull之间的区别在于pull还将更新分支的本地副本。由于没有project2分支的本地副本,因此fetch是可行的方法。 (事实上​​git pull只是git fetchgit merge)的快捷方式。

Adaptions

如果您已拥有包含代码的存储库的本地副本,则还可以将其用于合并过程。您只需要确保不要混淆本地开发和合并,也许您需要处理更多的远程存储库,因为您有更多的开发。

本地分支staging_UAT也可以被称为UAT,这使得推送变得更加简单(在这种情况下git push就够了)。然而,这可能会令人困惑,因为在多个遥控器中存在具有此名称的分支。

或者,您可以更改设置" push.default"。请参阅文档以了解这将如何影响您的推动。