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

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


当前回答

对于1.6.x,可以使用git_remote_branch工具完成:

grb track foo upstream

这将导致Git使foo跟踪上游/foo。

其他回答

对于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

这也行

git branch --set-upstream-to=/< remote>/< branch> < localbranch>

这不是对这个问题的直接回答,但我想在这里为任何在尝试配置上游分支时可能遇到与我相同问题的人留下一条注释。

小心push.default。

对于较旧的git版本,默认值为匹配,如果您有以下情况,则会导致非常不理想的行为:

本地分支机构“主”跟踪到原点/主

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

如果您在“上游”分支上尝试“git push”,则使用push.default匹配,git将自动尝试将本地分支“master”合并为“upstream/master”,从而导致大量混乱。

这会产生更理智的行为:

git-config—全局push.default上游

在这里,使用github和git版本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                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

看见现在,如果您只是签出develp,它将自动执行魔术:

$ 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

如果运行后出现“错误:请求的上游分支'origin/foo'不存在”:

git branch -u origin/foo

确保原点确实有一个foo分支。确保remote.origin.fetch变量设置为+refs/heads/*:refs/remotes/origin/*:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

运行git fetch-v。您应该看到git从origin/foo更新:

$ git fetch -v
From github.com:davidhcefx/test
 * [new branch]      foo             -> origin/foo
 = [up to date]      master          -> origin/master

成功后,git branch-avv将显示方括号,表示跟踪的远程分支:

$ git branch -u origin/foo
branch 'foo' set up to track 'origin/foo'.
$ git branch -avv
* foo                            92c5ada [origin/foo] Initial commit
  master                         92c5ada [origin/master] Initial commit