跳转到内容

问题描述

现在有一个 Git 仓库 A,A 一直在更新,然后我 clone 了 A,把 A 仓库的代码做了一些修改,自己上传到了仓库 B,B 已经很久没有更新了。现在我需要把最新的 A 代码,合并到我的 B 仓库代码里,但是不能覆盖我以前修改的 B 仓库代码。因为我在 B 仓库新建分支,将 A 代码复制到 B 的新分支上,然后回到 B 主分支,合并 B 的新分支,可这样会导致 B 以前修改的代码被 A 覆盖。怎么做。

这个问题产生的情景:基于开源的仓库 A 进行了一些修改,形成了一个新的仓库 B,同时,A 仓库进行了版本更新,比如增加了新功能,需要把这些新功能合并到 B 仓库中,但不能覆盖 B 以前的修改内容。

解决办法

你可以通过以下步骤来将 A 仓库的最新代码合并到 B 仓库中,而不会覆盖你在 B 仓库中做的修改。这个过程涉及到使用 Git 的rebasemerge功能。

  1. 添加 A 仓库为远程仓库

首先,确保你在 B 仓库中,并添加 A 仓库作为一个新的远程仓库。

bash
cd path/to/B
git remote add upstream path/to/A
  1. 获取 A 仓库的最新代码

从 A 仓库(即upstream)获取最新的代码。

bash
git fetch upstream
  1. 创建一个新的分支

在 B 仓库中创建一个新的分支来处理合并操作。

bash
git checkout -b merge-upstream
  1. 将 A 仓库的最新代码合并到新分支

将 A 仓库的最新代码合并到你刚创建的分支中。

bash
git merge upstream/main

如果 A 仓库的主分支不是main,请替换为相应的分支名。

注意,如果执行 git merge upstream/main 时,遇到报错:fatal: refusing to merge unrelated histories,则需要执行下面的命令

使用 --allow-unrelated-histories 选项强制合并不相关的历史。

bash
git merge upstream/main --allow-unrelated-histories

出现 fatal: refusing to merge unrelated histories 错误是因为 Git 认为两个仓库的历史完全不相关。要解决这个问题,你可以使用 --allow-unrelated-histories 选项来强制 Git 合并这些不相关的历史记录。

  1. 解决冲突

在合并过程中,如果有冲突,Git 会提示你。你需要手动解决这些冲突,然后提交解决后的代码。

bash
git add .
git commit
  1. 将合并后的分支与 B 仓库的主分支合并

切换回 B 仓库的主分支,并将合并后的分支合并到主分支中。

bash
git checkout main
git merge merge-upstream
  1. 解决冲突

如果再次出现冲突,重复解决冲突的步骤。

  1. 推送到 B 仓库

将合并后的代码推送到 B 仓库的远程主分支。

bash
git push origin main

通过这些步骤,你可以将 A 仓库的最新代码合并到 B 仓库中,而不会覆盖你之前在 B 仓库中做的修改。这个过程的关键是使用一个新的分支来处理合并操作,并在解决冲突后将合并后的代码合并回 B 仓库的主分支。

诚者,天之道也;诚之者,人之道也