如何将现有的Git分支与远程分支关联?

4007

我知道如何创建一个跟踪远程分支的新分支,但是如何使现有分支跟踪远程分支?

我知道可以编辑.git/config文件,但似乎应该有更简单的方法。


31
如下所述,对于现有的分支,您可以使用git push -u origin 分支名称。该命令可以将本地分支推送到远程仓库,并将其设置为默认上游分支。 - Zags
6
如果本地分支是当前分支,并且本地分支尚未跟踪远程分支,那么git pull命令通常会提供有关设置跟踪信息的适当命令的帮助信息。 - billrichards
92
当一个人在学习Git时,被给出一个指向Git文档的链接是很烦人的。那份文档似乎是为那些已经知道如何使用Git的人编写的。 - Felipe Alvarez
15
从 Git 2.10 开始,您应该首先切换到想要的本地分支,然后执行以下命令 git branch --set-upstream-to origin/<branch> - Mahdi Javaheri
5
--set-upstream 产生错误:fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead. 因此,目前有效的命令是 git branch --set-upstream-to origin/<branch name>。请注意,该命令不再支持--set-upstream选项,而应改用--track--set-upstream-to选项。 - Super Jade
显示剩余4条评论
23个回答

4813

假设有一个分支 foo 和一个远程仓库 upstream:

从 Git 1.8.0 开始:

git branch -u upstream/foo

或者,如果本地分支 foo 不是当前分支:

git branch -u upstream/foo foo

或者,如果你喜欢打更长的命令,这些命令与上面两个命令等效:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

从 Git 1.7.0 开始(在 1.8.0 之前):

git branch --set-upstream foo upstream/foo

注:

  • 上述所有命令都会使本地分支 foo 跟踪远程 upstream 的分支 foo
  • 旧语法(1.7.x)已被新语法(1.8+)弃用。新语法旨在更加直观易记。
  • 定义上游分支时,如果针对尚未获取的新创建的远程运行,则操作将失败。在这种情况下,请先运行 git fetch upstream

另见:为什么我需要每次都执行 `--set-upstream`?


153
“upstream” 是指远程仓库的名称吗?也就是默认情况下大多数人称之为“origin”的那个仓库吗? - Andrew Vit
194
@Andrew: 是的。git branch --set-upstream master origin/master 相当于在最初克隆存储库时自动执行的操作。 - Dan Moulding
65
顺便提一下,将以下内容添加到你的gitconfig中非常棒:“[push] default=tracking”。这会使得推送的代码会到与拉取代码相同的位置 :) - jpswain
64
我得到了“fatal: Not a valid object name: 'origin/master'.”的错误提示。 - joachim
97
git push -u origin foo 的翻译是将本地分支 foo 推送到远程仓库 origin,并将本地分支设置为远程分支的上游。 - Cotton
显示剩余26条评论

272
你可以按照以下步骤操作(假设你已经检出 master 分支并想要推送到名为 master 的远程分支):
如果你还没有设置“remote”,可以先设置一下。
git remote add origin ssh://...

现在配置主节点以知道如何进行跟踪:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

同时进行推送:

git push origin master

在推送时真的需要远程和分支吗?我的意思是,只有在你检出的分支不是你想要推送的分支时才需要它们,对吧? - Doppelganger
6
是的,但根据我的记忆,你可能需要在第一次推送时明确说明。当然也可以轻松地进行测试... :) - Paul Hedderly
+1 这是针对Windows用户的答案,他们被困在预览版之前的msysgit版本中。感谢您的帮助。 - John
3
这是唯一对我有效的答案。当我尝试采纳已接受的答案去为现有分支设置上游远程时,我遇到了以下错误:error: the requested upstream branch 'upstream/master' does not exist - Steve K
4
很可能是因为你的上游分支叫做 origin 而不是 upstream - umläute
请注意,如果您想手动更新 .git/config 文件,则应将其翻译为以下内容:[branch "master"] remote = origin merge = refs/heads/master - jhyry-gcpud

207
我这样做是因为在推送时使用了-u选项的副作用。
$ git push -u origin branch-name

等效的长选项是--set-upstream

git-branch命令也理解--set-upstream,但使用它可能会令人困惑。版本1.8.0修改了界面。

git branch --set-upstream已被弃用,并可能在相对较远的将来被移除。引入了git branch [-u|--set-upstream-to],参数顺序更合理。

诱人的是使用git branch --set-upstream origin/master,但这告诉Git将本地分支"origin/master"与当前检出的分支集成,这很不可能是用户的意图。该选项已被弃用;请改用新的--set-upstream-to(使用简洁的-u)选项。

假设你有一个名为foo的本地分支,并希望它使用与其同名的上游分支。使用以下命令实现:

$ git branch --set-upstream-to=origin/foo

74

针对 Git 1.8.0 及以上版本:

实际上,要使得已接受的答案起作用:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR Git version 1.8.0 and higher:
git branch --set-upstream-to=upstream/qa
# Gitversions lower than 1.8.0
git branch --set-upstream qa upstream/qa

本地分支已经在跟踪一个分支,因此我们可以假设远程仓库已经被添加。 - Doppelganger
2
Dopplerganger:请参考Joachim对被接受答案的评论。无论如何,假设很容易不同 - 这就是使事情如此有趣的原因 ;) - Hedgehog

61

你可能会发现git_remote_branch工具很有用。它提供了简单的命令来创建、发布、删除、跟踪和重命名远程分支。一个不错的功能是你可以要求grb命令解释它将执行哪些git命令。

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

4
GRB是一个Ruby宝石(gem),可以按照它们的GitHub页面所述访问。 - mcabrams
6
OP正在询问有关Git本身的问题。因此,最好不要介绍新工具。 - zeekvfu
grb 是我在 macOS 上安装的 git-rebase 的别名。这不是我做的 :) - pronebird

53

1- 使用以下命令更新本地元数据:git fetch --all

图片描述

2- 使用以下命令显示远程和本地分支:git branch -a,见下面的截图

图片描述

3- 切换到目标分支,将其与远程分支链接起来:

git checkout branchName

例如:

图片描述

4- 使用以下命令将本地分支链接到远程分支:

git branch --set-upstream-to nameOfRemoteBranch

注意: nameOfRemoteBranch:从步骤2的输出“git branch -r”中复制。

使用示例:

图片描述


3
大多数都是简单易懂的答案。 - vibs2006
为什么这不是最佳答案?简直无法相信到了2023年,git命令还是如此不必要的复杂。我想做的只是拉取一个远程分支,而这个答案是最简单的方法。 - akashlal.com

49

我相信在 Git 1.5.x 中,您可以使本地分支 $BRANCH 跟踪远程分支 origin/$BRANCH,如下所示。

假设 $BRANCHorigin/$BRANCH 存在,并且您当前没有检出 $BRANCH(如果您已经检出,请切换到其他分支),则执行以下操作:

git branch -f --track $BRANCH origin/$BRANCH
这会重新创建一个跟踪分支$BRANCH。使用-f选项,即使$BRANCH已存在也强制创建。如果通常的默认设置已经生效(如branch.autosetupmerge配置参数为true),那么--track是可选的。

请注意,如果origin/$BRANCH不存在,您可以通过将本地的$BRANCH推送到远程存储库来创建它:

git push origin $BRANCH

在上一条命令之后,将本地分支升级为追踪分支。


1
"git push origin $BRANCH" 是我正在寻找的。 - User
在尝试了各种解决方案(包括如上所述设置上游)后,仍然没有效果。我想做的就是从远程分支中拉取1个新提交到我的本地分支,但最初没有设置跟踪。命令 git branch -f --track $BRANCH origin/$BRANCH 就可以解决问题。 - DemitryT

29

确保你运行了:

git config push.default tracking

能够无障碍地推动


2
这可能很方便。然而,我们需要注意的是,根据 git-config(1) 手册页面,tracking 已被弃用,其同义词为 upstream - FooF
小心!在使用以下命令从 origin 的 master 分支创建本地分支并进行更改后:git checkout -b mybranch origin/master,当您运行 git push 时,会将更改推送到远程的 master 分支。对大多数人来说,这可能是意料之外的。 - Tao

26

编辑.git/config可能是最简单和最快的方法,这就是处理远程分支的Git命令所做的事情。

如果您不想手动操作该文件(而且这并不难),您可以始终使用git config来完成操作...但再次提醒,那只是编辑.git/config文件。

当使用git checkout时,当然有自动跟踪远程分支的方式(例如通过传递--track标志),但这些命令仅适用于新建分支,而不适用于现有的分支。


22

简单来说

git branch --set-upstream yourLocalBranchName origin/develop

这将使你的yourLocalBranchName跟踪名为develop的远程分支。


1
@Quincy,请查看Greg的回答 - 使用git push -u origin branch(或--set-upstream-to)代替。 - Tobias Kienzler
1
@MadNik,--set-upstream--track有什么区别?我不太明白为什么我应该使用其中之一。 - Asclepius

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