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

use*_*213 18 git version-control

在此输入图像描述

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

我真正想要做的是,在完成Sample Project 2的工作之后,我想将其移至UAT分支进行测试等,最终转移到Production分支进行发布.

在此先感谢您的帮助

luc*_*ash 26

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

这可以使用以下步骤来实现.

初始化和首次合并

$ git clone -o staging http://staging
Run Code Online (Sandbox Code Playgroud)

这将克隆您的临时存储库.您需要将" http:// staging " 替换为Staging/Support存储库的正确URL.您可能还想提供将存储库克隆为另一个参数的路径.参数-o确保远程存储库被称为"staging",这有助于稍后将其与项目存储库区分开来.

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

$ git remote add project2 http://sampleproject2
Run Code Online (Sandbox Code Playgroud)

再次,将" http:// sampleproject2 " 替换为存储库"Sample Project 2"的URL.您还可以更改"project2",这是远程存储库的名称,以更好地适应您的项目.

这样做之后,git branch -r将显示staging和project2的分支,如下所示:

$ git branch -r
staging/Production
staging/UAT
project2/Master
project2/QA
project2/DEV
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout -b staging_UAT --track staging/UAT
Run Code Online (Sandbox Code Playgroud)

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

现在,您可以从登台检出中获得UAT分支的副本.您可以合并来自project2的更改:

$ git merge project2/Master
Run Code Online (Sandbox Code Playgroud)

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

$ git push staging staging_UAT:UAT
Run Code Online (Sandbox Code Playgroud)

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

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

未来的合并

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

$ git checkout staging_UAT
$ git pull
Run Code Online (Sandbox Code Playgroud)

首先,您需要更新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.
Run Code Online (Sandbox Code Playgroud)

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

$ git fetch project2
Run Code Online (Sandbox Code Playgroud)

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

Adaptions

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

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

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

  • 我不知道为什么我需要这个命令,但为了让我能够看到执行“git远程更新”所需的分支 (4认同)