将git仓库合并到另一个仓库的分支中。

202

假设有两个仓库 Foo 和 Bar。我想把 Bar 合并到 Foo 中,但是只想合并到一个名为 baz 的独立分支中。

git switch -c baz <= 在这里创建 baz 分支并切换到该分支。


如果您已经安装了Homebrew的hub命令,您可以执行hub merge <github-pr-url-from-the-browser-omg>。但是在此之前,您需要执行git remote add upstream <the repo url>.git。我不知道远程名称是否需要为upstream。 - Devin Rhode
4个回答

350

你无法将一个 仓库 合并到一个 分支 中。你可以将另一个仓库的一个 分支 合并到本地仓库中的一个 分支。假设你有两个仓库,foobar 都位于当前目录中:

$ ls
foo bar

切换到 foo 代码库:

$ cd foo

bar存储库添加为远程并获取它:

$ git remote add bar ../bar
$ git remote update
在“foo”代码库中,基于当前所在的分支创建一个新的名为“baz”的分支:git checkout -b baz
$ git switch -c baz

合并bar仓库的分支 somebranch 到当前分支:

$ git merge --allow-unrelated-histories bar/somebranch

在 Git 版本 2.9 之前,不需要使用 --allow-unrelated-histories


28
自Git 2.9版本以后,你可能需要在git合并命令中添加“--allow-unrelated-histories”选项。 - Drasill
3
@Drasill 的评论信息: https://github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt#L58-L68 - GaTechThomas
24
我不知道我在做什么,而且我无法阅读带有 foo/bar 占位符的内容。是否有人能够使用实际的生活例子(如适当的链接等)来编辑这个内容? - rien333
1
我遇到了很多合并冲突。你能否强制合并到一个新分支中? - nomadoda
1
如果您想创建一个没有合并冲突的单独分支:git checkout --orphan baz,然后在合并之前执行 git rm -rf . - nomadoda
我认为这就是我需要的。所以存储库“foo”存在并且我将其复制到我的Git中新创建的“bar”存储库中。此时,foo == bar。然后我修改了我的“bar”存储库,而其他人则修改了“foo”存储库。 然后当我想要来自“foo”的更新时,我运行上面的命令 - 对吗?而且非常重要的是,它会提示我解决冲突吗? FYI- 我需要这样做的原因是“foo”是开源的,而我正在“bar”中进行一些开源团队不想要的更改。 - David Thielen

118

使用“真实”命令进行更新:

从您的仓库目录开始,确保您的工作副本是干净的(没有更改、添加或删除文件)。


创建一个新分支:

git checkout -b <my-branch>

添加第二个远程主机,然后提取它:

git remote add <repo-name> git@github.com:xxx/<repo-name>.git
git remote update

将它们的一个分支合并到您当前的分支中:

git merge <repo-name>/<their-branch>


如果您不知道要选择哪个<their-branch>,那就选择master

如果您确定要接受所有远程更改并避免冲突(覆盖您的更改),则可以在最后一步为git merge指定 -X theirs 选项。

如果您想将其添加到子目录中,则应该使用git子模块


4
很棒的回答,与被采纳的回答结合起来...帮助我完成了一个大规模合并,以上命令序列使整个过程相对顺利。谢谢。 - Jeff Wright
针对“实际应用”的另一个建议:使用能够协助 git 合并的 IDE。例如,VS Code 的 Git Lens 可以让你将冲突进行侧边比较,并选择新、旧或两者兼备。这大大简化了合并冲突的过程。 :) - Mike Williamson
9
如果你遇到了 "refusing to merge unrelated histories" 的 git 错误,则可以使用选项 --allow-unrelated-histories (详情请参见:https://dev59.com/ploU5IYBdhLWcg3wAjYs#37938036)。 - Jordy

7
使用larsks的指南,我能够利用SourceTree做到以下操作:
  1. 在目标仓库中创建了一个分支
  2. 通过点击设置按钮并添加源代码仓库,将源代码仓库添加为远程仓库。
  3. 现在两个仓库的分支都显示在分支列表中。我使用合并工具将来自源代码仓库的分支合并到我的新目标仓库的分支中。
  4. 使用SourceTree或我的IDE解决任何冲突。
  5. 提交我的分支中的更改。
  6. 通过使用设置按钮,从远程列表中删除源代码仓库。

2

流行的rien333评论了被接受的答案,并要求提供带有填充示例的命令。

例如,我正在使用LLM聊天模板Big-AGI,并且有自己的Github存储库,它不是一个分支,而是一个副本。几周后,我想要集成最新的更改。

首先,我需要确保在GitHub上设置了SSH密钥

使用以下命令验证SSH密钥是否正确设置:

ssh -T git@github.com

// Hi andrewschreiber! You've successfully authenticated, but GitHub does not provide shell access.

完成后,我在终端中导航到我的代码库并输入

git checkout -b update-from-boilerplate1
git remote add big-agi https://github.com/enricoros/big-agi
git remote update
git merge --allow-unrelated-histories big-agi/main
// Solve any merge conflicts
git checkout main
git merge update-from-boilerplate1

您可以通过运行远程更新随时获取最新的更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接