我知道如何创建一个跟踪远程分支的新分支,但是如何使现有分支跟踪远程分支?
我知道我可以只编辑 .git/config
文件,但似乎应该有更简单的方法。
git push -u origin branch-name
。
git pull
通常会提供有关设置跟踪信息的适当命令的有用消息
git branch --set-upstream-to origin/<branch>
--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>
是当前有效的命令。
给定一个分支 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。
旧的 (1.7.x) 语法已弃用,取而代之的是新的 (1.8+) 语法。新语法旨在更直观、更容易记住。
当针对尚未获取的新创建的遥控器运行时,定义上游分支将失败。在这种情况下,请事先运行 git fetch upstream。
另请参阅:Why do I need to do `--set-upstream` all the time?
您可以执行以下操作(假设您已在 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
error: the requested upstream branch 'upstream/master' does not exist
。
origin
而不是 upstream
。
我这样做是使用 -u
选项推动的副作用,如
$ git push -u origin branch-name
等效的长选项是 --set-upstream
。
git-branch
命令也可以理解 --set-upstream
,但它的使用可能会令人困惑。 Version 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
对于 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
已经存在。如果有通常的默认值(即 git-config 参数 branch.autosetupmerge
为 true),则 --track
是可选的。
请注意,如果 origin/$BRANCH
尚不存在,您可以通过将本地 $BRANCH
推送到远程存储库来创建它:
git push origin $BRANCH
紧接着上一条命令将本地分支提升为跟踪分支。
git push origin $BRANCH
是我一直在寻找的。
git branch -f --track $BRANCH origin/$BRANCH
可以解决问题。
1- 使用 git fetch --all 更新您的本地元数据
https://i.stack.imgur.com/UBUNn.png
2-使用: git branch -a 显示您的远程和本地分支,请参见以下屏幕截图
https://i.stack.imgur.com/J1xB9.png
3-切换到要与远程链接的目标分支:使用
git checkout 分支名称
例子 :
https://i.stack.imgur.com/WeBwL.png
4-使用以下命令将本地分支链接到远程分支:
git branch --set-upstream-to nameOfRemoteBranch
注意:nameOfRemoteBranch:从步骤 2 的输出中复制“git branch -r”
使用示例:
https://i.stack.imgur.com/arZFk.png
确保你运行:
git config push.default tracking
能够摆脱麻烦
git-config(1)
手册页,tracking
是 upstream
的同义词已弃用。
编辑 .git/config
可能是最简单、最快的方法。无论如何,这就是用于处理远程分支的 Git 命令正在做的事情。
如果您不想手动处理文件(这并不难),您总是可以使用 git config
来完成...但同样,这只是编辑 .git/config
文件,反正。
当然,在使用 git checkout
时有一些方法可以自动跟踪远程分支(例如,通过传递 --track
标志),但这些命令适用于 new 分支,而不是现有分支。
简而言之
git branch --set-upstream yourLocalBranchName origin/develop
这将使您的 yourLocalBranchName
跟踪名为 develop
的远程分支。
--set-upstream
和 --track
有什么区别?我不太明白为什么我应该使用一个而不是另一个。
我使用以下命令(假设您的本地分支名称是“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
和 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 example origin/example
git branch -u origin/remote-branch-name
使用“--track”选项
在 git pull 之后: git checkout --track
或者: git fetch && git checkout
对于 git 版本 2.25.1
,使用命令:
git push --set-upstream origin <local_branch_name>
这不是对这个问题的直接答案,但我想在这里为任何在尝试配置上游分支时可能遇到与我相同问题的人留下一个注释。
警惕 push.default。
对于较旧的 git 版本,默认值是匹配的,如果您有,这将导致非常不良的行为,例如:
本地分支“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(目测是最快的,因为它是蹩脚的 ;-) 来添加新的、以前未知的远程分支(不获取)到工作站的原始存储库(使用我添加远程分支的本地存储库)。
完成后,我就可以使用 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
如果运行后出现“错误:请求的上游分支 'origin/foo' 不存在”:
git branch -u origin/foo
确保 origin 确实有一个 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
对于像我一样只想将本地分支名称与远程分支名称同步的任何人,这里有一个方便的命令:
git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
为避免每次收到消息时都记住需要执行的操作:
请指定要合并的分支。有关详细信息,请参阅 git-pull(1)。 ......
您可以使用以下脚本将原点设置为您所在的当前分支的上游。
就我而言,我几乎从不将 origin 以外的其他内容设置为默认上游。此外,我几乎总是为本地和远程分支保留相同的分支名称。所以以下适合我:
#!/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>
git branch --set-upstream master origin/master
相当于您最初克隆存储库时自动完成的操作。git push -u origin foo
via