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

Make an existing Git branch track a remote branch?

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

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


给定一个分支foo和一个远程upstream

从Git 1.8.0开始:

1
git branch -u upstream/foo

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

1
git branch -u upstream/foo foo

或者,如果要键入更长的命令,这些命令相当于上述两个命令:

1
2
3
git branch --set-upstream-to=upstream/foo

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

从Git 1.7.0开始:

1
git branch --set-upstream foo upstream/foo

笔记:

  • 以上所有命令都将使本地分支foo从远程upstream跟踪远程分支foo
  • 旧的(1.7.x)语法已被弃用,取而代之的是新的(1.8+)语法。新的语法旨在更加直观和易于记忆。
  • 定义上游将失败,因为新创建的远程设备尚未获取。在这种情况下,提前运行git fetch upstream

另请参见:为什么我需要一直执行`--set upstream`操作?


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

如果您还没有"遥控器",请设置它

1
git remote add origin ssh://...

现在将master配置为know to track:

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

推:

1
git push origin master


我这样做是因为使用-u选项的副作用

1
$ git push -u origin branch-name

等价的多头期权是--set-upstream

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

git branch --set-upstream is deprecated and may be removed in a relatively distant future. git branch [-u|--set-upstream-to] has been introduced with a saner order of arguments.

It was tempting to say git branch --set-upstream origin/master, but that tells Git to arrange the local branch"origin/master" to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new --set-upstream-to (with a short-and-sweet -u) option instead.

假设您有一个本地的foo分支,并希望它将该分支与上游分支同名。让这一切发生

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

或者只是

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


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

1
2
3
4
5
6
7
8
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


实际上,对于公认的工作答案:

1
2
3
4
5
git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa


我相信,早在1.5.x吉特,你就可以让一个本地分支机构$BRANCH跟踪一个远程分支机构origin/$BRANCH,就像这样。

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

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

这将把$BRANCH重新创建为跟踪分支。尽管$BRANCH已经存在,但-f仍然强制创造。如果有常见的默认值(即git config参数branch.autosetupmerge),则--track是可选的。

注意,如果origin/$BRANCH还不存在,您可以通过将本地$BRANCH推入远程存储库来创建它,方法是:

1
git push origin $BRANCH

然后执行上一个命令,将本地分支提升为跟踪分支。


1-使用:git fetch--all更新本地元数据

enter image description here

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

enter image description here

3-切换到要与远程设备链接的目标分支:使用

Git签出分支名称

例子:

enter image description here

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

git branch—设置为上游的name of remotebranch

n.b:nameofremotebranch:从步骤2"git branch-r"的输出复制

使用实例:

enter image description here


确保跑步:

1
git config push.default tracking

能够把问题解决


编辑.git/config可能是最简单和最快的方法。不管怎样,处理远程分支的git命令就是这样做的。

如果你不想手工处理这个文件(这并不难),你可以一直使用git config来处理它……但同样,这只会编辑.git/config文件。

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


非常短

1
git branch --set-upstream yourLocalBranchName origin/develop

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


对于1.6.x,可以使用git_远程_分支工具:

1
grb track foo upstream

这将导致git使foo跟踪upstream/foo


这里,使用githubgit version 2.1.4,只需:

1
$ git clone [email protected]:user/repo.git

远程设备由ITELSEF提供,即使没有本地链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git remote show origin

* remote origin
  Fetch URL: [email protected]:user/repo.git
  Push  URL: [email protected]: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)

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

1
2
$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

看到了吗?现在,如果您只签出develp,它将自动执行魔法:

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

很容易!

总结。只需运行以下两个命令:

1
2
$ git clone [email protected]:user/repo.git
$ git checkout develop


使用"--track"选项

  • git pull之后:

    git checkout --track

  • 或:

    git fetch && git checkout


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

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

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

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


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

1
 git checkout --track -b example origin/example

对于已创建的分支,若要在远程分支之间创建链接,请使用以下命令

1
 git branch -u origin/remote-branch-name


这不是这个问题的直接答案,但我想在这里为任何人留下一个注释,当我试图配置一个上游分支时,这些人可能与我有相同的问题。

注意push.default。

对于较旧的Git版本,默认值是匹配的,这将导致非常不受欢迎的行为,例如:

本地分支"主"跟踪到源站/主服务器

远程分支"上游"跟踪到上游/主

如果在"上游"分支上尝试"git push",那么与push.default匹配的git会自动尝试将本地分支"master"合并为"上游/master",造成一片混乱。

这会使你的行为更加理智:

git config—全局push.default上游


在某种程度上,我试图将一个远程跟踪分支添加到一个现有的分支,但没有访问我想要在其中添加该远程跟踪分支的系统上的远程存储库(因为我经常通过Sneakernet将此repo的副本导出到另一个可以访问该远程的系统)。我发现没有办法强制在本地添加一个尚未提取的远程分支(因此本地不知道远程存在该分支,我会得到错误:the requested upstream branch 'origin/remotebranchname' does not exist)。

最后,我通过在.git/refs/remotes/origin/remotebranchname上添加一个新的头文件,然后从访问源站repo的系统向工作站(在我添加远程分支的本地repo上)复制ref(眼球扫描最快,虽然是跛脚的;-),成功地添加了以前未知的新远程分支(没有提取)。

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


或者简单地说:

如果您不在分支中,请切换到该分支:

1
[za]$ git checkout branch_name

运行

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

你准备好了:

1
 [za]$ git push origin branch_name

您可以通过运行以下命令查看配置文件,查看跟踪内容的内容:

1
 [za]$ git config -e

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

1
  [za]$ git remote show origin

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

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


这也行

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