我知道如何创建一个跟踪远程分支的新分支,但是如何使现有分支跟踪远程分支?
我知道我可以编辑.git/config
文件,但似乎应该有更简单的方法。
给定一个分支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
跟踪远程分支。foo
upstream
git fetch upstream
提前运行。您可以执行以下操作(假设您已在 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
-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
(带有 short-and-sweet-u
)选项。
假设您有一个本地foo
分支,并希望它以与其上游相同的名称来处理该分支。做到这一点
$ git branch foo
$ git branch --set-upstream-to=origin/foo
要不就
$ git branch --set-upstream-to=origin/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_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
我相信早在 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
紧接着上一条命令将本地分支提升为跟踪分支。
确保你运行:
git config push.default tracking
能够摆脱麻烦
编辑.git/config
可能是最简单和最快的方法。无论如何,这就是用于处理远程分支的 Git 命令正在做的事情。
如果您不想手动处理文件(这并不难),您可以随时使用git config
它......但同样,无论如何,这只是要编辑.git/config
文件。
当然,有一些方法可以在使用时自动跟踪远程分支git checkout
(例如,通过传递--track
标志),但这些命令适用于新分支,而不是现有分支。
简而言之
git branch --set-upstream yourLocalBranchName origin/develop
这将使您的yourLocalBranchName
跟踪远程分支称为develop
.
我使用以下命令(假设您的本地分支名称是“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
在这里,使用github
and git 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
要创建新分支,我们可以使用以下命令
git checkout --track -b 示例来源/示例对于已经创建的分支在远程之间创建链接,然后从该分支使用以下命令
git 分支 -u 来源/远程分支名称
之后git pull
:
git checkout --track <remote-branch-name>
或者:
git fetch && git checkout <branch-name>
对于 git 版本2.25.1
,使用命令:
git push --set-upstream origin <local_branch_name>
这不是对这个问题的直接答案,但我想在这里为任何在尝试配置上游分支时可能遇到与我相同问题的人留下一个注释。
小心push.default。
对于较旧的 git 版本,默认值为match,如果您有,这将导致非常不良的行为,例如:
本地分支“master”跟踪到 origin/master
远程分支“上游”跟踪到上游/主
如果你在“upstream”分支上尝试“git push”,与push.default 匹配的 git 会自动尝试将本地分支“master”合并到“upstream/master”中,造成一大堆混乱。
这给出了更理智的行为:
git config --global push.default 上游
以某种相关的方式,我试图将远程跟踪分支添加到现有分支,但无法访问我想在其中添加远程跟踪分支的系统上的远程存储库(因为我经常导出这个的副本repo 通过sneakernet 到另一个有权推送到该遥控器的系统)。我发现没有办法强制在本地添加一个尚未获取的远程分支(所以本地不知道该分支存在于远程,我会得到错误:)the requested upstream branch 'origin/remotebranchname' does not exist
。
最后,我设法添加了一个新的、以前未知的远程分支(没有获取),方法是添加一个新的头文件,.git/refs/remotes/origin/remotebranchname
然后从可以访问源的系统复制 ref(目测是最快的,因为它是蹩脚的;-) repo 到工作站(使用我添加远程分支的本地 repo)。
一旦完成,我就可以使用git branch --set-upstream-to=origin/remotebranchname
或简单地通过:
如果您不在分支中,请切换到分支:
[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
对于像我一样只想将本地分支名称与远程分支名称同步的任何人,这里有一个方便的命令:
git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
为避免每次收到消息时都记住需要执行的操作:
请指定要合并的分支。有关详细信息,请参阅 git-pull(1)
。
......
您可以使用以下脚本将原点设置为您所在的当前分支的上游。
就我而言,我几乎从不将origin 以外的其他内容设置为默认的 upstream。此外,我几乎总是为本地和远程分支保留相同的分支名称。所以以下适合我:
#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"
这也可以
git branch --set-upstream-to=/< remote>/< branch> < localbranch>