两个项目分支合并操作

326 阅读5分钟

在实际开发中,B 项目可能是从 A 项目中独立出来的。由于 A 项目持续维护,而 B 项目又希望同步 A 项目的一些修改(比如 bug 修复、功能更新等),避免重复操作,最好的方式就是将 A 项目的某个分支合并到 B 项目的对应分支。下面是如何操作的详细步骤

1. 在 B 项目中创建或切换分支

首先,在 B 项目中创建一个新的分支或者切换到目标分支(此处假设是在 master-test 分支上操作)。

创建新分支并切换:

git checkout -b <branch-name>  # 创建新分支并切换到新分支

例如:

git checkout -b sync-from-a  # 创建并切换到 sync-from-a 分支

切换到目标分支:

git checkout master-test  # 切换到已有的目标分支

备注:在实际操作时,<branch-name> 可以根据需要选择适合的名称。如果直接在现有分支上操作,可以跳过创建分支的步骤,直接切换到目标分支。

2. 关联 A 项目的远程仓库

接下来,在 B 项目中添加 A 项目的远程仓库。这样,B 项目就可以与 A 项目进行交互,拉取 A 项目的分支内容。

添加远程仓库:

git remote add a-project <A项目远程仓库地址>

例如:

git remote add a-project http://xxxxx.git  // a-project: 给a项目仓库起个别名,后面就是a项目仓库地址
 
git remote add a-project http://git.example.com/a-project.git

这里的 a-project 是 A 项目的仓库别名,你可以根据需要替换为任何名称。

3. 检查远程仓库是否关联成功

使用 git remote 命令查看当前所有关联的远程仓库地址,确保 A 项目的远程仓库已成功添加。

检查远程仓库:

git romote -v // 会显示你关联的a项目仓库别名  a-project

如果添加成功,命令输出应该包含 a-project 和对应的 A 项目仓库地址:

a-project    http://git.example.com/a-project.git (fetch)
a-project    http://git.example.com/a-project.git (push)

类似这样,打码地方就是关联的项目别名(嗯...各种原因就不展示别名了)

8.png

4. 拉取 A 项目分支代码

此时,B 项目已经与 A 项目建立了关联,可以从 A 项目的远程仓库拉取所需的分支代码。假设要将 A 项目的 test 分支的代码合并到 B 项目中,使用以下命令:

拉取 A 项目的 test 分支代码:

git pull a-project test  // 拉取a-project 项目的test 分支代码  

注意:如果 A 项目的 test 分支和 B 项目的目标分支没有共同的历史,执行上述命令时会出现如下错误: fatal: refusing to merge unrelated histories

9.png 这通常是因为两个项目的历史记录没有任何交集。Git 会拒绝合并这两个不相关的历史记录。

5. 允许合并不相关的历史

为了解决上面的错误,Git 提供了一个 --allow-unrelated-histories 选项,允许强制合并两个不相关的历史。

执行带 --allow-unrelated-histories 的拉取命令:

 git pull a-project test --allow-unrelated-histories // 翻译而来的意思是:允许不相关历史操作

解释:该命令的作用是告诉 Git,允许将 A 项目的 test 分支代码合并到 B 项目中,即使这两个分支的历史记录不相关。

6. 合并完成后的效果

执行完上述操作后,B 项目的目标分支(例如 master-test)会完全合并 A 项目 test 分支的所有代码和提交记录。你可以通过 git log 查看合并后的提交历史,确认 A 项目的提交记录是否已经成功合并到 B 项目中。 查看提交历史:

git log  # 查看提交历史,确认是否有 A 项目的提交记录

此时,B 项目的 master-test 分支会包含所有来自 A 项目 test 分支的提交。


补充说明

1. 解决冲突

在合并 A 项目和 B 项目的代码时,可能会出现文件冲突。此时需要手动解决冲突。冲突解决后,使用以下命令标记冲突已解决并提交合并:

git add <conflicted-files>  # 将解决冲突后的文件添加到暂存区
git commit  # 提交合并后的修改
2. 推送更新到 B 项目远程仓库

合并操作完成后,记得将合并后的分支推送到 B 项目的远程仓库。

git push origin master-test  # 推送合并后的 master-test 分支到 B 项目的远程仓库
3. 同步多个分支

如果 A 项目有多个分支需要同步到 B 项目,可以按照相同的步骤为每个分支执行拉取和合并操作。

例如,若还需要合并 A 项目的 dev 分支,可以执行:

git pull a-project dev --allow-unrelated-histories

总结

通过上述步骤,你可以将 A 项目的某个分支(如 test)合并到 B 项目,确保 B 项目能够同步 A 项目的维护更新,而不必重复劳动。注意,合并时要处理好可能出现的冲突,并使用 --allow-unrelated-histories 选项来允许合并不相关的历史。

这个操作尤其适用于 B 项目需要频繁与 A 项目保持同步,但又不希望将两个项目合并成一个项目的场景。