Git:如何在本地合并远程分支

321
我已通过git fetch --all拉取了所有远程分支。我可以通过git branch -a看到我想合并的分支,它存储在remotes/origin/branchname中。但问题是它无法访问,我无法合并或者检出。
5个回答

499

你可以使用它们的远程名称引用那些远程跟踪分支(在git branch -r中列出)。

你需要获取远程分支:

git fetch origin aRemoteBranch
如果你想将其中一个远程分支合并到你的本地分支:
git checkout aLocalBranch
git merge origin/aRemoteBranch

注1:对于一个有着悠久历史的大型代码仓库,当你使用git fetch时,你将需要添加--depth=1选项。

注2:这些命令也适用于其他远程代码仓库,因此,如果你正在处理一个分叉项目,你可以设置一个origin和一个upstream

注3:user3265569评论中建议以下别名:

aLocalBranch运行git combine remoteBranch
别名:

combine = !git fetch origin ${1} && git merge origin/${1}
相反的情况:如果你想将你的一个本地分支合并到一个远程分支(与上面展示的从远程分支合并到本地分支相反),你需要首先在所述的远程分支之上创建一个新的本地分支:
git checkout -b myBranch origin/aBranch
git merge anotherLocalBranch

这里的想法是将“你的本地分支之一”(这里是anotherLocalBranch)合并到远程分支(origin/aBranch)中。
为此,您首先创建“myBranch”表示该远程分支:即git checkout -b myBranch origin/aBranch部分。
然后您可以将anotherLocalBranch合并到它(myBranch)中。


aLocalBranch?这是打错字了吗?我猜你是想再次写“myBranch”吧? - knocte
2
@knocte No: "如果你想将本地分支合并到远程分支之一": 我正在将"aLocalBranch"合并到"myBranch",其中"myBranch"代表一个名为origin/aBranch的远程分支。 - VonC
1
@rath 您是正确的:看起来我可能有点匆忙地审查了那个编辑,接近粗心大意。我编辑了答案以澄清第二个合并情况:您能告诉我现在是否更清晰了吗? - VonC
我已经为此创建了一个别名。从 aLocalBranch 运行 git combine remoteBranch。别名:combine = !git fetch origin ${1} && git merge origin/${1} - user3265569
@user3265569,感谢您的贡献。我已将您的评论包含在答案中以增加其可见性。 - VonC
显示剩余3条评论

114
无论何时我进行合并操作,我会进入目标分支 (例如 "git checkout branch-i-am-working-in") 然后执行以下命令:

git merge origin/branch-i-want-to-merge-from


4
我猜你需要先执行 git fetch origin/branch-i-want-to-merge-from,是这样吗? - Hinrich
18
执行 git fetch origin develop 后,紧接着执行 git merge origin/develop - Olivier
2
@Olivier 您是正确的,这是正确的方法。仅使用 git merge 是不够的。 - Sam
1
感谢您巧妙的命名规则,这帮助我理解了。 - tony2tones
1
@Akira 不应该是 git add . -> git commit -m <message> -> git push -u origin <branch> 吗? - Cloud Cho
显示剩余3条评论

58

首先从远程仓库获取分支。

git fetch origin remote_branch_name

将远程分支合并到本地分支

git merge origin/remote_branch_name

1
当被接受的答案报告“无法合并”时,这个方法对我很有效。在我的情况下,我正在从GitHub上另一个用户的分叉中进行合并。 - SJT
3
第一条命令是否必需?'git merge origin/remote_branch_name' 是从远程分支读取,而不是本地分支。因此我不需要关心本地分支是否已更新。 - Michael Freidgeim
1
@MichaelFreidgeim 你确实需要先获取(fetch)一下,这样你的本地仓库才知道远程仓库的状态。Git pull 基本上是从当前分支的当前远程版本进行获取(fetch)和合并(merge),但现在你需要从另一个分支进行获取(fetch)和合并(merge)。https://dev59.com/8XVC5IYBdhLWcg3wcgqd - DZet

24

或许你想用本地分支追踪远程分支:

  1. 创建一个新的本地分支:
  git branch -b new-local-branch
  1. 将新创建的分支设置为追踪远程分支:
  git branch --set-upstream-to=origin/remote-branch new-local-branch
  • 进入这个分支:
  git checkout new-local-branch
  1. 将远程分支的所有内容拉取到本地分支:
  git pull

3

如果你已经拉取了远程分支,并且执行 git branch -a 命令,
你会得到如下结果:

* 8.0
  xxx
  remotes/origin/xxx
  remotes/origin/8.0
  remotes/origin/HEAD -> origin/8.0
  remotes/rep_mirror/8.0

接着,您可以使用rep_mirror/8.0来指定远程分支的本地版本。

诀窍在于remotes/rep_mirror/8.0无法工作,但rep_mirror/8.0可以。

因此,像git merge -m "my msg" rep_mirror/8.0这样的命令执行合并操作。

(注:这是对@VonC回答的评论。我将其作为另一个答案,因为代码块不适合评论格式)


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