使现有的Git分支跟踪远程分支?


3534

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

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


26
如下所述,对于现有分支,可以使用git push -u origin branch-name
Zags 2014年

3
如果本地分支是当前分支,并且本地分支尚未跟踪远程git pull
站点

57
当人们在学习git时会看到指向git文档的链接,这很烦人。该文档似乎是为已经知道他们在用git做什么的人编写的。
费利佩·阿尔瓦雷斯

9
从Git 2.10开始,您应该首先结帐到预期的本地分支,然后执行此操作git branch --set-upstream-to origin/<branch>
Mahdi Javaheri

2
--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>是工作当前命令。
超级翡翠

Answers:


4266

给定一个分支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开始:

git branch --set-upstream foo upstream/foo

笔记:

  • 以上所有命令都会导致本地foo分支foo从remote 跟踪远程分支upstream
  • 不推荐使用旧的(1.7.x)语法,而推荐使用新的(1.8+)语法。新语法旨在更加直观和易于记忆。
  • 当针对尚未提取的新创建的远程数据库运行时,定义上游分支将失败。在这种情况下,请git fetch upstream事先运行。

另请参阅:为什么我总是需要执行--set-upstream?


124
“上游”是遥控器的名称吗?即默认情况下,大多数人将其称为“起源”?
Andrew Vit

172
@安德鲁:是的。git branch --set-upstream master origin/master等同于最初克隆存储库时自动执行的操作。
Dan Moulding 2010年

62
与此相关的是,将其添加到您的gitconfig中是非常棒的:“ [push] default = tracking”将使之
生效

61
我得到“致命:无效的对象名称:'origin / master'。”
joachim

84
git push -u origin foo 通过
棉花

235

您可以执行以下操作(假设您已在master上签出,并希望推送到远程分支master):

设置“远程”(如果您还没有的话)

git remote add origin ssh://...

现在将master配置为要跟踪:

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

并推:

git push origin master

真的需要将遥控器和分支推送吗?我的意思是,仅当您签出的分支不是您要推送的分支时才需要它,对吗?
Doppelganger

5
是的-但是从内存中,您可能需要在第一次推送时明确显示。当然可以轻松地进行测试... :)
Paul Hedderly 2010年

+1这是Windows用户使用1.8之前的msysgit“预览”的答案。感谢那。
约翰,

3
这是唯一对我有用的答案。当我尝试接受的答案时,为现有分支设置上游远程服务器,我得到了:error: the requested upstream branch 'upstream/master' does not exist
史蒂夫·K

4
@SteveK最有可能是因为上游调用了,origin而不是upstream
umläute

160

我这样做是因为推入该-u选项的副作用

$ git push -u origin branch-name

等效的long选项为--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 foo
$ git branch --set-upstream-to=origin/foo

要不就

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

1
这是一个更好的解决方案imo
Nils_e

--set-upstream-to=...正是我想要的。
理查德

54

您可能会发现该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

3
grb是一个红宝石宝石,可以按照其github
mcabrams

6
OP正在询问有关Git本身的问题。因此,不引入新工具可能会更好。
zeekvfu 2014年

grb是我的macOS安装上git-rebase的别名。我没有这样做:)
本·辛克莱

53

实际上,对于工作的可接受答案:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

本地分支已经在跟踪分支,因此我们可以假定已添加远程仓库。
Doppelganger

Dopplerganger:请参阅joachim对已接受答案的评论。无论如何,假设很容易就不同了,这使事情变得如此有趣;)
刺猬

44

我相信,早在Git 1.5.x中,您就可以像这样使本地分支$BRANCH跟踪远程分支origin/$BRANCH

鉴于存在$BRANCH并且origin/$BRANCH存在,并且您当前尚未签出$BRANCH(如果有,请转出),请执行以下操作:

git branch -f --track $BRANCH origin/$BRANCH

这将重新创建$BRANCH为跟踪分支。该-f部队的创建,尽管$BRANCH现有的已经。--track如果使用通常的默认值(即git-config参数branch.autosetupmerge为true),则为可选。

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

git push origin $BRANCH

后面的命令将本地分支提升为跟踪分支。


1
git push origin $BRANCH是我一直在寻找的东西。
2013年

在尝试了各种解决方案后,包括如上所述设置上游,没有任何效果。我要做的就是从远程分支将1个新提交提交到我的本地分支中,而我最初并未设置跟踪。该命令git branch -f --track $BRANCH origin/$BRANCH可以解决问题。
DemitryT

38

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

在此处输入图片说明

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

在此处输入图片说明

3-切换到要与遥控器链接的目标分支:使用

git checkout branchName

例如:

在此处输入图片说明

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

git branch --set-upstream-to nameOfRemoteBranch

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

使用示例:

在此处输入图片说明


1
大多是简单的答案。
vibs2006

25

确保您运行:

git config push.default tracking

能够无忧无虑


1
这可能很方便。但是,我们可以注意到,根据git-config(1)手册页,tracking它已被弃用upstream
12

23

编辑.git/config可能是最简单,最快的方法。无论如何,这就是用于处理远程分支的Git命令正在做的事情。

如果您不想手工处理文件(这并不难做到),则可以随时使用git config它...但是同样.git/config,无论如何,这只是编辑文件。

当然,有一些方法可以在使用时自动跟踪远程分支git checkout--track例如,通过传递标志),但是这些命令适用于分支,而不适用于现有分支。


18

在很短的时间内

git branch --set-upstream yourLocalBranchName origin/develop

这将使您的yourLocalBranchName跟踪成为名为的远程分支develop


1
@Quincy检查greg的答案 -改用git push -u origin branch(或--set-upstream-to
Tobias Kienzler

@MadNik,--set-upstream和之间有什么区别--track?我不太明白为什么要在另一个上使用一个。
Acumenus 2014年


12

我使用以下命令(假设您的本地分支名称为“ branch-name-local”,远程分支名称为“ branch-name-remote”):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

如果本地和远程分支都具有相同的名称,则只需执行以下操作:

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

您在命令行上颠倒了“分支名称”和“起源/分支名称”。上游先于本地。
maharvey67 '18 -10-10

@ maharvey67你是对的,谢谢。编辑答案。
yrazlik

谢谢,这是金子,也是因为当分支名称中有斜杠时,接受的答案中的所有选项都
不可行

8

在这里,使用githubgit version 2.1.4,只需执行以下操作:

$ git clone git@github.com:user/repo.git

即使没有本地链接,遥控器也由itelsef提供:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

但是,当然,仍然没有本地分支机构:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

看到?现在,如果您仅结帐开发,它将自动完成魔术:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

太简单!


摘要。只需运行以下两个命令:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
我的用例的一个很好的例子。尽管没有本地'develop'分支的迹象,但当我签出'develop'分支时,该分支仍会出现,并且神奇地设置为从源头跟踪远程分支'develop'。我感谢分步示例和说明!
ElliotPsyIT

8

使用'--track'选项

  • 之后git pull

    git checkout --track <remote-branch-name>

  • 要么:

    git fetch && git checkout <branch-name>


7

为了创建新分支,我们可以使用以下命令

 git checkout --track -b示例来源/示例 
对于已经创建的分支在远程之间创建链接,然后从该分支使用以下命令

 git branch -u起源/远程分支名称


5

这不是此问题的直接答案,但我想在这里给任何人在尝试配置上游分支机构时可能遇到与我相同的问题做个说明。

注意push.default

在较旧的git版本中,默认设置为match,如果您有以下行为,则会导致非常不理想的行为,例如:

本地分支“母版”跟踪到原始/母版

远程分支“上游”跟踪到上游/主服务器

如果您在“上游”分支上尝试“ git push”,则使用push.default匹配的 git会自动尝试将本地分支“ master”合并到“ upstream / master”,从而造成很多混乱。

这会提供更多理智的行为:

git config --global push.default上游


您没有白费。谢谢。
stefgosselin

4

我以某种相关的方式尝试将远程跟踪分支添加到现有分支,但是没有访问我要在其上添加该远程跟踪分支的系统上的远程存储库的权限(因为我经常导出此副本通过sneakernet回购到另一个可以推送到该远程服务器的系统)。我发现没有办法强制在尚未获取的本地上添加一个远程分支(因此本地不知道该分支存在于远程上,我会得到错误:)the requested upstream branch 'origin/remotebranchname' does not exist

最后,我设法在系统上添加了一个新的头文件,.git/refs/remotes/origin/remotebranchname然后从系统中复制了ref(目击最快,, 脚;-)(可以访问原始地址),从而添加了一个以前未知的新远程分支(无需获取)。回购到工作站(以及我在其中添加远程分支的本地回购)。

一旦完成,我就可以使用 git branch --set-upstream-to=origin/remotebranchname


3

或简单地通过:

如果尚未进入分支,请切换至该分支:

[za]$ git checkout branch_name

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

并且您准备:

 [za]$ git push origin branch_name

您可以通过运行以下内容来查看配置文件,以查看正在跟踪什么:

 [za]$ git config -e

知道这一点也很高兴,它显示了跟踪了哪些分支,没有跟踪了哪些分支。:

  [za]$ git remote show origin 

0

对于像我一样只想将本地分支名称与远程分支名称同步的任何人,这是一个方便的命令:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

避免记住每次收到消息时需要做的事情:

请指定您要合并的分支。有关
详细信息,请参见git-pull(1)。
.....

您可以使用以下脚本,将您所在的当前分支的原点设置为上游

就我而言,我几乎从来没有设置其他任何东西作为原始默认上游。另外,我几乎总是为本地和远程分支保留相同的分支名称。因此,以下内容适合我:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

这也可以

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.