ChatGPT解决这个技术问题 Extra ChatGPT

让现有的 Git 分支跟踪远程分支?

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

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

如下所述,对于现有分支,您可以使用 git push -u origin branch-name
如果本地分支是当前分支,并且本地分支尚未跟踪远程,git pull 通常会提供有关设置跟踪信息的适当命令的有用消息
当一个人在学习 git 以显示指向 git 文档的链接时,这很烦人。该文档似乎是为已经知道他们正在使用 git 做什么的人编写的。
从 Git 2.10 开始,您应该首先检查到预期的本地分支,然后执行此操作 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> 是当前有效的命令。

i
isapir

给定一个分支 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?


“上游”是遥控器的名称吗?即默认情况下大多数人会称之为“起源”?
@安德鲁:是的。 git branch --set-upstream master origin/master 相当于您最初克隆存储库时自动完成的操作。
在相关说明中,将其添加到您的 gitconfig 非常棒:“[push] default=tracking” 这将使推送将进入与拉取相同的位置:)
我得到“致命:不是有效的对象名称:'origin/master'。”
git push -u origin foo via
J
Josh

您可以执行以下操作(假设您已在 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

真的需要遥控器和推送中的分支吗?我的意思是,只有当您签出的分支不是您想要推送的分支时,您才需要它,对吧?
是的 - 但从记忆中,您可能需要明确第一次推送。当然可以很容易地测试...... :)
+1 这是对 1.8 之前的 msysgit“预览”卡住的 Windows 用户的答案。感谢那。
这是唯一对我有用的答案。当我尝试接受的答案时,为现有分支设置上游远程,我得到:error: the requested upstream branch 'upstream/master' does not exist
@SteveK 这很可能是因为您的上游被称为 origin 而不是 upstream
S
Saurav Sahu

我这样做是使用 -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

H
Hedgehog

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

本地分支已经在跟踪一个分支,所以我们可以假设已经添加了远程仓库。
Dopplerganger:请参阅 joachim 对已接受答案的评论。无论如何,假设很容易不同 - 它让事情变得如此有趣;)
J
James Mead

您可能会发现 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

grb 是一个 ruby gem,可以按照 their github 中的说明进行访问
OP 正在询问有关 Git 本身的问题。所以不要引入新工具可能会更好。
grb 是我的 macOS 安装中 git-rebase 的别名。我没有这样做:)
w
wu-lee

我相信早在 Git 1.5.x 中,您就可以像这样让本地分支 $BRANCH 跟踪远程分支 origin/$BRANCH

鉴于 $BRANCHorigin/$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 是我一直在寻找的。
在尝试了各种解决方案(包括如上所述设置上游)之后,没有任何效果。我想要做的就是将 1 个新提交从远程提交到我的本地分支中,并且我最初没有设置跟踪。命令 git branch -f --track $BRANCH origin/$BRANCH 可以解决问题。
I
Isaac

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


主要是简单而简单的答案。
r
romanlv

确保你运行:

git config push.default tracking

能够摆脱麻烦


这可能很方便。但是,我们可以注意到,根据 git-config(1) 手册页,trackingupstream 的同义词已弃用。
m
mipadi

编辑 .git/config 可能是最简单、最快的方法。无论如何,这就是用于处理远程分支的 Git 命令正在做的事情。

如果您不想手动处理文件(这并不难),您总是可以使用 git config 来完成...但同样,这只是编辑 .git/config 文件,反正。

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


A
Asclepius

简而言之

git branch --set-upstream yourLocalBranchName origin/develop

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


@Quincy Check greg's answer - 改用 git push -u origin branch(或 --set-upstream-to
@MadNik,--set-upstream--track 有什么区别?我不太明白为什么我应该使用一个而不是另一个。
P
Peter Mortensen

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

grb track foo upstream

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


y
yrazlik

我使用以下命令(假设您的本地分支名称是“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

您在命令行上颠倒了“branch-name”和“origin/branch-name”。上游先于本地。
@maharvey67 你是对的,谢谢。编辑了答案。
这是金子,谢谢,还因为当您在分支名称中有斜杠时,接受的答案中的任何选项都没有问题
D
DrBeco

在这里,使用 githubgit 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

我的相同用例的一个很好的例子。尽管没有本地“开发”分支的迹象,但当我检查“开发”分支时,该分支出现并神奇地设置为从源头跟踪远程分支“开发”。我很欣赏一步一步的例子和解释!
j
jithu reddy

要创建新分支,我们可以使用以下命令

git checkout --track -b example origin/example

git branch -u origin/remote-branch-name


L
Loukan ElKadi

使用“--track”选项

在 git pull 之后: git checkout --track

或者: git fetch && git checkout


i
iknow

对于 git 版本 2.25.1,使用命令:

git push --set-upstream origin <local_branch_name>

如果您还不打算推送更改,这可能会很不方便!
T
Tom Mettam

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

警惕 push.default。

对于较旧的 git 版本,默认值是匹配的,如果您有,这将导致非常不良的行为,例如:

本地分支“master”跟踪到 origin/master

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

如果你在“upstream”分支上尝试“git push”,那么与 push.default 匹配的 git 会自动尝试将本地分支“master”合并到“upstream/master”中,造成一大堆混乱。

这给出了更理智的行为:

git config --global push.default 上游


你没有白白离开。谢谢。
V
Ville

以某种相关的方式,我试图将远程跟踪分支添加到现有分支,但无法访问我想在其中添加远程跟踪分支的系统上的远程存储库(因为我经常导出这个的副本repo 通过sneakernet 到另一个有权推送到该遥控器的系统)。我发现没有办法强制在本地添加一个尚未获取的远程分支(所以本地不知道该分支存在于远程,我会得到错误:the requested upstream branch 'origin/remotebranchname' does not exist)。

最后,我设法通过在 .git/refs/remotes/origin/remotebranchname 添加一个新的头文件,然后从具有访问权限的系统中复制 ref(目测是最快的,因为它是蹩脚的 ;-) 来添加新的、以前未知的远程分支(不获取)到工作站的原始存储库(使用我添加远程分支的本地存储库)。

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


z
z atef

或简单地通过:

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

[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 

d
davidhcefx

如果运行后出现“错误:请求的上游分支 '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

C
Constantinos

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

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

M
Marinos An

为避免每次收到消息时都记住需要执行的操作:

请指定要合并的分支。有关详细信息,请参阅 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"

M
Mad Physicist

这也可以

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