题 为什么我需要一直做`--set-upstream`?


我在Git中创建了一个新分支:

git branch my_branch

推它:

git push origin my_branch

现在说有人在服务器上做了一些更改,我想从中拉出来 origin/my_branch。我做:

git pull

但我得到:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

我了解到我可以使用它:

git branch --set-upstream my_branch origin/my_branch

但为什么我需要为我创建的每个分支执行此操作?如果我推动,这不是很明显 my_branch 成 origin/my_branch,那我想拉 origin/my_branch 成 my_branch?如何将其设为默认行为?


1060
2018-05-22 16:39


起源


默认值为 branch.autosetupmerge 表示仅在从远程跟踪分支创建分支时自动设置新分支的上游配置(例如, <remote-name>/<branch-name>)(见 GIT-配置(1))。您可能正在从现有的本地分支机构创建分支机构。如果您直接从远程分支的尖端进行分支(尽管位于本地分支上),那么您可以使用 git branch my_branch <remote-name>/<branch-name> 自动设置上游配置。 - Chris Johnsen
仅供参考 --set-upstream 选项已弃用。你应该用 --track 要么 --set-upstream-to 代替。 - Sean the Bean
如果 --set-upstream 不推荐使用,那么git devs应该从运行时显示的帮助消息中删除它 git push 没有选项,没有设置上游? - Christopher Hunter
@ChristopherHunter你的评论已经过了一年多了 仍然 说。这只是一个草率的反馈,或者是否有一个技术明智的理由来保持它我们无知? - Konrad Viltersten
对于其他寻找更新的单线程(post git 2.0)的人: BRANCH=$(git symbolic-ref --short HEAD) && git branch --set-upstream-to=origin/$BRANCH $BRANCH - jrhorn424


答案:


一种快捷方式,它不依赖于记住语法 git branch --set-upstream  1 是做:

git push -u origin my_branch

......你第一次推动那个分支。您只需要执行一次,并设置您的分支与之间的关联 origin 在相同的方式 git branch --set-upstream 确实。

就个人而言,我认为必须明确地在分支机构和远程分支机构之间建立关联是一件好事。这是规则的耻辱 不同的 git push 和 git pull


1 这可能听起来很傻,但我经常忘记指定当前分支,假设这是默认值 - 它不是,结果最令人困惑:)

更新2012-10-11:显然我不是唯一一个容易出错的人!谢谢 VonC 指出git 1.8.0引入的更明显 git branch --set-upstream-to,如果你在分支机构,可以使用如下 my_branch

git branch --set-upstream-to origin/my_branch

......或者用短选项:

git branch -u origin/my_branch

这种变化及其推理在中描述 git 1.8.0的发行说明,发布候选人1

很有诱惑力 git branch --set-upstream origin/master,但这告诉Git安排当地分行 origin/master 与当前签出的分支集成,这非常不可能是用户的意思。该选项已弃用;使用新的 --set-upstream-to (短而甜蜜 -u)而是选项。


1201
2018-05-22 16:58



还要注意,即使你忘记了 -u 第一次推动时,您可以使用该标志再次运行推送,它将开始跟踪。 - Henrik N
这些都不满足使用没有参数的git push的用例。当我第一次将新分支移动到遥控器时,我仍然需要记住'git push -u origin my-branch'。 - Karl the Pagan
自我注意:第一个更完整的解释 git push -u origin master: stackoverflow.com/a/17096880/6309 - VonC
我讨厌记住这种语法,所以我创建了以下别名: alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')" - lillialexis
这一切都很好,但我仍然认为OP的投诉是有效的。你启动一个本地分支,对它进行处理,将它推送到原点进行共享(没有args);为什么不应该设置上游?实际上,由于某种原因,在将新分支推送到远程时不要设置上游吗? - GaryO


您可以通过减少输入来实现这一目标。首先,改变推送的工作方式:

git config --global push.default current

这将推断出 origin my_branch 部分,因此你可以这样做:

git push -u

这将创建具有相同名称的远程分支并跟踪它。


968
2018-04-08 10:14



为什么git可以推断出来 origin 跑步的时候 git push -u 在新创建的存储库中新创建的分支?假设存储库已被克隆,因此当前分支已将其远程设置为 origin? - Piotr Dobrogost
这应该是默认值。如果它只是附带更好的默认值,那么git中的许多东西可以更加用户友好。 - phreakhead
请注意,“当前”与使用“简单”做同样的事情略有不同,请参阅 stackoverflow.com/questions/23918062/... - Air
这也没有用 -u。 - pstryk
它确实如此,但是当你尝试时 pull 你必须从哪里指定。该 -u 设置原点和本地仓库之间的分支跟踪。 - Zamith


你可以简单

git checkout -b my-branch origin/whatever

首先。如果你设置 branch.autosetupmerge 要么 branch.autosetuprebase (我最喜欢的) always (默认是 truemy-branch 会自动跟踪 origin/whatever

看到 git help config


70
2018-03-17 20:04



这会导致“致命:无法同时更新路径并切换到分支'my-branch'。” - Karl the Pagan
@Karl,解释了这个罕见的错误 这里。 - cdunn2001
顺便说一句,我通常只是 git checkout -t origin/whatever,也选择 whatever 作为新的分支名称。很方便! - cdunn2001
@cdunn这个很理想,但很难保持一致。应该调用该标志 -u/--set-upstream。 - Tobu
git checkout -t origin/whatever 在尝试创建新分支时对我不起作用: fatal: Cannot update paths and switch to branch 'whatever' at the same time. - wisbucky


您可以通过两种方式将上游设置为更简单。首先,当您创建分支时:

git branch -u origin/my-branch

或者在创建分支后,可以使用此命令。

git push -u origin/my-branch

您还可以在单​​个命令中分支,检出和设置上游:

git checkout -b my-branch -t origin/my-branch

我个人倾向于通过两步命令执行此操作:

git checkout -b my-branch
git push -u origin/my-branch

45
2018-03-17 13:28



很棒的答案!解决这两种常见用例。跑完之后 git branch -u origin/my-branch 我可以跑 git pull 拉下我的变化。 - Ben Atkin
这需要是公认的答案 - Etienne Marais
“git checkout -b my-branch -t origin / my-branch”如果'origin / my-branch'还不存在,这不起作用。 - Spongman
你其实可以做到的 git checkout -t origin/my-branch 没有 -b my-branch,它只会自动推断 my-branch 为本地分支名称。但是,正如@Spongman所提到的,如果这个命令不起作用 origin/my-branch 首先不存在。 - wisbucky
是的,将工作@wisbucky,-t工作得很好。就个人而言,即使在我写回复的两年后,我仍然更喜欢用checkout -b和push -u分成两行。当我没有远程时,它更明确且没有错误结账-b - 这在实验时经常发生:) - Tzen


您可以使用:

git config --global branch.autosetupmerge总是

每次创建或签出新分支时都会链接上游分支。

看到 https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

这也适用于autosetuprebase,如果您遵循更多关注rebase的工作流程,但除非您知道自己在做什么,否则不要使用它,因为它会将您的拉动行为默认为rebase,这可能会导致奇怪的结果。


36
2018-04-28 20:05



不行,我还是得到了 --set-upstream 信息 - Dorian
@Dorian,你必须在创建分支之前设置它。看到 stackoverflow.com/a/9753268/263998 - cdunn2001
我得到:致命:您当前分支的上游分支与您当前分支的名称不匹配... - Riscie
但这并没有将跟踪分支设置为具有相同分支的远程分支,而是设置为当前本地分支..因此当您执行推送时,它将尝试在创建新分支之前推送到您所在的LOCAL分支。 - Arnold Roa
这甚至比默认情况更奇怪。如果你的工作基于一个分支,它的行为真的很奇怪。 - Beefster


顺便说一句,将当前分支推送到具有相同名称的远程的快捷方式:

$ git push -u origin HEAD

29
2017-09-15 14:20





这是我最常用的用法 他妈的

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

此外,在终端中输入脏话词也很有趣。


27
2017-11-15 17:22





git branch --set-upstream-to=origin/master<branch_name>

11
2018-06-30 04:39





你也可以明确地告诉git pull要拉什么远程分支(正如它在错误消息中提到的那样):

git pull <remote-name> <remote-branch>

但要注意这一点: 如果你在一个不同的分支上做一个明确的拉动,你拉的refspec将合并到你所在的分支!


8
2018-03-20 14:41





对于它的价值,如果你试图跟踪遥控器上已经存在的分支(例如origin / somebranch)但尚未在本地检查它,你可以这样做:

$ git checkout --track origin/somebranch

注意:' - t'是'--track'选项的缩短版本。

这样即可立即建立相同的关联。


8
2017-12-08 16:11



你实际上只需要结账到分行。所以 git checkout somebranch 是等价的。 - Zamith
@Zamith这不仅仅是在打电话后才有效 git fetch 马上预先? - Walter Roman
不是立即,但是,是的,您确实需要在本地仓库中引用该分支,这在您打电话时会发生 git fetch 要么 git pull。不过,我从未发现这是一个问题。 - Zamith