我知道如何创建一个跟踪远程分支的新分支,但 how do I make an existing branch track a remote branch?
我知道我可以编辑 .git/config 文件,但似乎应该有一个更简单的方法 .
19 回答
31
您可能会发现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
我以某种相关的方式尝试将远程跟踪分支添加到现有分支,但无法访问该远程分支我希望在系统上添加远程跟踪分支的存储库(因为我经常通过sneakernet将此repo的副本导出到另一个可以推送到该远程的系统) . 我发现没有办法强制在尚未获取的本地上添加远程分支(因此本地不知道远程分支存在,我会得到错误: the requested upstream branch 'origin/remotebranchname' does not exist ) .
19 回答
您可能会发现git_remote_branch工具很有用 . 它提供了用于创建,发布,删除,跟踪和重命名远程分支的简单命令 . 一个很好的功能是你可以要求一个
grb
命令来解释它将执行什么git命令 .这也会奏效
我相信,早在Git 1.5.x你可以让一个本地分支
$BRANCH
跟踪一个远程分支origin/$BRANCH
,就像这样 .鉴于
$BRANCH
和origin/$BRANCH
存在,并且您目前尚未检出$BRANCH
(如果有,请切换),请执行以下操作:这将重新创建
$BRANCH
作为跟踪分支 . 尽管已经存在$BRANCH
,但-f
强制创建 . 如果通常的默认值就位,则--track
是可选的(即git-config参数branch.autosetupmerge
为真) .注意,如果
origin/$BRANCH
尚不存在,您可以通过将本地$BRANCH
推入远程存储库来创建它:接下来是上一个命令,将本地分支推进到跟踪分支 .
确保你运行:
能够推动无故障
或者简单地通过:
如果你还没有进入分支,请切换到分支:
跑
你准备好了:
你可以alawys看一下配置文件,看看通过运行跟踪什么:
知道这一点也很好,它显示了哪些分支被跟踪,哪些分支没有 . :
我这样做是为了推动使用
-u
选项的副作用等效的长选项是
--set-upstream
.git-branch
命令也理解--set-upstream
,但它的使用可能令人困惑 . Version 1.8.0修改界面 .假设您有一个本地
foo
分支,并希望它以与其上游相同的名称处理分支 . 用这个来实现要不就
在这里,使用
github
和git version 2.1.4
,只需:而且遥控器来自itelsef,即使没有在本地链接:
但当然,仍然没有本地分支:
看到?现在,如果您只是结帐develp,它将自动执行魔术:
太简单!
Summary. 只需运行以下两个命令:
这不是这个问题的直接答案,但我想在这里留下一个注释,以便在尝试配置上游分支时可能遇到与我相同问题的任何人 .
警惕 push.default .
对于较旧的git版本,默认值为 matching ,如果您有,则会导致非常不良的行为,例如:
本地分支“master”跟踪到origin / master
远程分支“上游”跟踪到上游/主站
如果您在"upstream"分支上尝试"git push",使用 push.default matching git会自动尝试将本地分支"master"合并到"upstream/master"中,从而导致大量混乱 .
这样可以提供更明智的行为:
git config --global push.default upstream
要创建新分支,我们可以使用以下命令
对于已经创建的分支,在远程之间创建链接,然后从该分支使用下面的命令
编辑
.git/config
可能是最简单,最快捷的方式 . 无论如何,这就是处理远程分支的Git命令正在做的事情 .如果你不那么难做,你可以随时使用
git config
来做...但是,无论如何,这只是编辑.git/config
文件 .当然,有一些方法可以在使用
git checkout
时自动跟踪远程分支(例如,传递--track
标志),但这些命令适用于新分支,而不是现有分支 .给定一个分支
foo
和一个远程upstream
:As of Git 1.8.0:
或者,如果本地分支
foo
不是当前分支:或者,如果您想键入更长的命令,这些命令等同于以上两个:
As of Git 1.7.0:
Notes:
所有上述命令都将导致本地分支
foo
从远程upstream
跟踪远程分支foo
. 不推荐使用旧的(1.7.x)语法,而采用新的(1.8)语法 . 新语法旨在更直观,更易于记忆 .另见:Why do I need to do
--set-upstream
all the time?我以某种相关的方式尝试将远程跟踪分支添加到现有分支,但无法访问该远程分支我希望在系统上添加远程跟踪分支的存储库(因为我经常通过sneakernet将此repo的副本导出到另一个可以推送到该远程的系统) . 我发现没有办法强制在尚未获取的本地上添加远程分支(因此本地不知道远程分支存在,我会得到错误:
the requested upstream branch 'origin/remotebranchname' does not exist
) .最后,我设法添加一个新的,以前未知的远程分支(没有提取),在
.git/refs/remotes/origin/remotebranchname
添加一个新的头文件,然后复制ref(眼球是最快的,因为它是蹩脚的;-)从系统访问到原始仓库到工作站(使用我添加远程分支的本地仓库) .一旦完成,我就可以使用
git branch --set-upstream-to=origin/remotebranchname
对于1.6.x,可以使用git_remote_branch工具完成:
这将导致Git使
foo
跟踪upstream/foo
.使用'--track'选项
git pull
之后:git checkout --track <remote-branch-name>
git fetch && git checkout <branch-name>
实际上,对于已接受的工作答案:
很短的
这将使您的
yourLocalBranchName
跟踪名为develop
的远程分支 .我使用以下命令(假设您的本地分支名称是“branch-name-local”,远程分支名称是“branch-name-remote”):
如果本地和远程分支具有相同的名称,则只需执行以下操作:
您可以执行以下操作(假设您已在主服务器上签出并希望推送到远程分支主服务器):
如果您还没有设置'遥控',请设置它
现在配置master来跟踪:
并推:
1-使用以下方法更新本地元数据: git fetch --all
2-使用: git branch -a 显示您的远程和本地分支,请参阅以下屏幕截图
3-切换到目标分支,即要与远程链接:使用
git checkout branchName
例子:
4-使用以下方法将本地分支链接到远程分支:
git branch --set-upstream-to nameOfRemoteBranch
N.B: nameOfRemoteBranch :从步骤2的输出中复制" git branch -r "
使用示例: