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

Ram*_*hum 1364 git git-branch

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

git branch my_branch
Run Code Online (Sandbox Code Playgroud)

推它:

git push origin my_branch
Run Code Online (Sandbox Code Playgroud)

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

git pull
Run Code Online (Sandbox Code Playgroud)

但我得到:

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.
Run Code Online (Sandbox Code Playgroud)

我了解到我可以使用它:

git branch --set-upstream my_branch origin/my_branch
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*air 1457

一个不依赖于记住git branch --set-upstream 1的语法的快捷方式是:

git push -u origin my_branch
Run Code Online (Sandbox Code Playgroud)

......你第一次推动那个分支.或者,将当前分支推送到同名分支(方便别名):

git push -u origin HEAD
Run Code Online (Sandbox Code Playgroud)

您只需要使用-u一次,并origin以相同的方式设置分支与分支之间的关联git branch --set-upstream.

就个人而言,我认为必须明确地在分支机构和远程分支机构之间建立关联是一件好事.这只是一个耻辱的规则是不同的git pushgit 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
Run Code Online (Sandbox Code Playgroud)

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

git branch -u origin/my_branch
Run Code Online (Sandbox Code Playgroud)

这个变化及其推理在git 1.8.0发布说明中描述,候选发布版1:

这很诱人git branch --set-upstream origin/master,但这告诉Git安排本地分支origin/master与当前检出的分支集成,这是用户意味着的极不可能.该选项已弃用; 使用新的--set-upstream-to(带有短而甜-u)选项.

  • 这一切都很好,但我仍然认为OP的投诉是有效的.你启动一个本地分支,对它进行处理,将它推送到原点进行共享(没有args); 为什么不应该设置上游?实际上,由于某种原因,在将新分支推送到远程时不要设置上游吗? (91认同)
  • 另请注意,即使您第一次按下时忘记了`-u`,也可以使用该标志再次运行推送,它将开始跟踪. (90认同)
  • 这些都不满足使用没有参数的git push的用例.当我第一次将我的新分支移动到遥控器时,我仍然需要记住'git push -u origin my-branch'. (65认同)
  • 完全不值得开发时间.为什么不自动执行? (19认同)
  • 我讨厌记住这个语法,所以我创建了以下别名:`alias gpo ="git push --set-upstream origin $(git branch | awk'/ ^\*/{print $ 2}')"` (16认同)
  • 自我注意:第一个`git push -u origin master`的更完整的解释:http://stackoverflow.com/a/17096880/6309 (8认同)
  • @Zamith在下面给出了问题的更正确答案.设置全局配置,以便您不必键入任何内容. (5认同)
  • 另一个快捷方式/调整是`git push -u origin HEAD` ...这允许您跳过键入您的分支名称.你需要确保你在正确的分支上. (3认同)
  • @lillialexis,谢谢你的提示.我讨厌看到`Branch foo设置为每次跟踪来自原点的远程分支foo.所以我想出了'alias gu ="git push --set-upstream origin $(git branch | awk'/ ^\*/{print $ 2}')>>/dev/null"`您仍然可以看到输出,但是您看不到冗余消息. (2认同)
  • 如果更新此答案以反映 2.37 中引入的“push.autoSetupRemote”选项,将会很方便,如 VonC 在 /sf/answers/5068132961/ 中所述 (2认同)

Zam*_*ith 1249

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

git config --global push.default current
Run Code Online (Sandbox Code Playgroud)

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

git push -u
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是默认值.如果它只是附带更好的默认值,那么git中的许多东西可以更加用户友好. (62认同)
  • 确实如此,但是当你试图"拉"时,你必须从哪里指定.`-u`设置原点和本地仓库之间的分支跟踪. (28认同)
  • 请注意,"当前"与使用"简单"执行相同操作略有不同,请参阅http://stackoverflow.com/questions/23918062/simple-vs-current-push-default-in-git-for-decentralized -workflow (12认同)
  • 为新创建的存储库中新创建的分支运行`git push -u`,为什么git可以推断出`origin`?假设存储库已被克隆,因此当前分支的远程设置为"origin"? (4认同)
  • 我返回这个答案的次数让我对开发者工具的用户体验状态感到失望‍♂️ (3认同)
  • @Yana是的,您可以根据需要为遥控器命名.`origin`碰巧是git使用的默认值. (2认同)
  • 尽管仍然很方便,但是这仍然强制要求对第一个也是唯一的“推”运行一个不同的命令,这使该问题的整个要点失效。简而言之,**没有一个好的答案。** Git开发人员坚持面对广泛的社区异议而保留这种尴尬的用户体验(AUX)是……令人鼓舞的。和令人沮丧。(最不鼓励的。) (2认同)

Von*_*onC 117

git config --global push.autoSetupRemote true
Run Code Online (Sandbox Code Playgroud)

OP问:

我了解到我可以让它与以下内容一起使用:

git branch --set-upstream my_branch origin/my_branch
Run Code Online (Sandbox Code Playgroud)

但为什么我需要为我创建的每个分支执行此操作?

您不需要一直设置上游。
不再是了(十一年后)。

在 Git 2.37(2022 年第 3 季度)中,agit config --global push.autoSetupRemote true将为您解决这个问题。

请参阅提交 05d5775提交 8a649be提交 bdaf1df(2022 年 4 月 29 日),作者:Tao Klerks ( TaoK)
(由Junio C Hamano 合并 -- gitster--提交 f49c478中,2022 年 5 月 26 日)

push: 新配置选项“ push.autoSetupRemote”支持“ simple”推送

签署人:陶·克勒克斯

在某些simple集中式工作流程中,用户希望远程跟踪分支名称与本地分支名称相匹配。
" git push" ( man )推送到分支的远程版本/实例,而 " git pull" ( man )将任何更改拉取到远程分支(同一用户在另一个地方或其他用户所做的更改)。

push.default默认选项“ ”和新选项“”支持此期望,默认选项“ ”simple拒绝默认推送不匹配的跟踪分支名称,而新选项“”仅为同名远程分支设置远程跟踪。branch.autosetupmergesimple

当用户创建了新分支且尚未推送(且未push.default设置为“ current”)时,系统会提示用户“ The current branch %s has no upstream branch”错误,并说明如何推送和添加跟踪。

此错误很有帮助,因为每个分支遵循一次建议可以永远“解决”该分支的问题,但不方便的是,对于“简单”的集中式工作流程,这始终是正确的做法,因此最好只做吧。

使用新的配置设置 来支持此工作流程,push.autoSetupRemote当没有配置远程跟踪分支时,这将导致默认推送,以推送到远程上的同名 和--set-upstream

The current branch %s has no upstream branch还添加在遇到“ ”错误时提供此新选项的提示,并添加相应的测试。

新的提示是:

要让没有跟踪
上游的分支自动发生这种情况,请参阅push.autoSetupRemote“git help config”中的“”

git config现在包含在其手册页中:

push.autoSetupRemote

如果设置为“ true”,则假设--set-upstream当前分支不存在上游跟踪时默认推送;

push.default该选项与选项“ simple”、“ upstream”和“ ”一起生效current

如果默认情况下您希望将新分支推送到默认远程(如“ push.default=current”的行为)并且还希望设置上游跟踪,那么它非常有用。
最有可能从此选项中受益的工作流是“ simple”中央工作流,其中所有分支都应在远程具有相同的名称。

  • 这个答案应该是公认的:执行 `git config --global push.autoSetupRemote always` 将使您在推送分支/提交后立即自动跟踪原点。 (8认同)

cdu*_*001 85

你可以简单

git checkout -b my-branch origin/whatever
Run Code Online (Sandbox Code Playgroud)

首先.如果您设置branch.autosetupmergebranch.autosetuprebase(我最喜欢)为always(默认为true),my-branch将自动跟踪origin/whatever.

git help config.

  • 顺便说一句,我通常只是`git checkout -t origin/whatever`,它也选择`whatever`作为新的分支名称.很方便! (11认同)
  • 这会导致"致命:无法同时更新路径并切换到分支'my-branch'." (4认同)
  • @cdunn这个很理想,但很难保持一致.该标志应该被称为`-u` /`--set-upstream`. (2认同)
  • 当尝试创建新分支时,“git checkout -t origin/whatever”对我不起作用:“致命:无法同时更新路径并切换到分支“whatever”。” (2认同)
  • `branch.autosetupmerge = false` 也不起作用。它将上游跟踪设置为本地“whatever”分支,而不是远程“origin/whatever”。 (2认同)

Tze*_*zen 78

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

git branch -u origin/my-branch
Run Code Online (Sandbox Code Playgroud)

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

git push -u origin my-branch
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b my-branch -t origin/my-branch
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b my-branch
git push -u origin my-branch
Run Code Online (Sandbox Code Playgroud)

  • "git checkout -b my-branch -t origin/my-branch"如果'origin/my-branch'还不存在,这不起作用. (2认同)
  • `git push -u origin/my-branch` 对我来说失败了,因为 `fatal: 'origin/my-branch' 似乎不是一个 git 存储库。这有效:`git push -u origin my-branch` (2认同)

Tam*_*lyn 62

这是我最常用的The Fuck.

$ 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.
...
Run Code Online (Sandbox Code Playgroud)

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

  • 这个小发现让我很高兴。谢谢 (10认同)
  • 有趣的事实:只有 2.4% 的程序员不同意最后的说法 (6认同)
  • 每当我认为这个命令只是一个笑话时,我都会惊讶地发现它实际上是多么有用 (2认同)

Dan*_*iel 44

您可以使用:

git config --global branch.autosetupmerge总是

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

请参阅https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

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

  • **此设置要小心**!设置后,您会得到此行为。1.切换到“master”。2. 运行`git checkout -b new_branch`。3. 向该分支添加提交。4. `git push origin new_branch`。**这会将提交推送到原点上的“master”分支**(而不是原点上名为“new_branch”的新分支)。 (10认同)
  • 不起作用,我仍然得到`--set-upstream`消息 (7认同)
  • 但这并没有将跟踪分支设置为具有相同分支的远程分支,而是设置为当前本地分支..因此当您执行推送时,它将尝试在创建新分支之前推送到您的LOCAL分支. (7认同)
  • @Dorian,你必须在创建分支之前设置它.请参见http://stackoverflow.com/a/9753268/263998 (2认同)

dja*_*ski 37

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

$ git push -u origin HEAD
Run Code Online (Sandbox Code Playgroud)


Amr*_*tha 19

我个人在bash中使用以下别名

在〜/ .gitconfig文件中

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"
Run Code Online (Sandbox Code Playgroud)

并在〜/ .basehrc或〜/ .zshrc文件中

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
Run Code Online (Sandbox Code Playgroud)

  • 我只需要 hcange .gitconfig,然后我可以使用命令“git Pushup”,它总是将当前分支推送到原点。我总是可以使用“git Pushup”而不是“git Push” (2认同)

you*_*rrr 16

如果以下方法不起作用:

git config --global push.default current
Run Code Online (Sandbox Code Playgroud)

您还应该更新项目的本地配置,因为您的项目可能具有本地git配置:

git config --local push.default current
Run Code Online (Sandbox Code Playgroud)

  • 这个答案感觉是合法的。所有提出别名的建议都是愚蠢的解决方法。其他证明记住长命令序列的理由是迂腐的。 (5认同)
  • 更多的解释会很好。第一行做什么? (2认同)
  • 这适用于推,但不适用于拉。当您推送时,它会使用正确的上游,但不会设置上游,因此您仍然需要运行命令来设置上游,然后才能第一次拉取分支。 (2认同)

小智 11

git branch --set-upstream-to=origin/master<branch_name>
Run Code Online (Sandbox Code Playgroud)


mat*_*lar 10

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

$ git checkout --track origin/somebranch
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你实际上只需要结账到分行.所以`git checkout somebranch`是等价的. (5认同)
  • @Zamith这不是只有在事先立即调用`git fetch`之后才能工作吗? (2认同)
  • 不是立即,但是是的,您确实需要在本地存储库中引用该分支,每当您调用 `git fetch` 或 `git pull` 时都会发生这种情况。不过,我从来没有发现这是一个问题。 (2认同)

mtb*_*ave 9

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

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

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


man*_*roe 9

我使用这个Git别名而不是每次都复制/粘贴Git的建议:https://gist.github.com/ekilah/88a880c84a50b73bd306

下面复制的来源(将其添加到您的~/.gitconfig文件中):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"
Run Code Online (Sandbox Code Playgroud)


123*_*123 7

你可以设置一个非常好的别名来处理这个,而不需要过于冗长的语法.

我有以下别名~/.gitconfig:

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""
Run Code Online (Sandbox Code Playgroud)

在新分支上提交后,只需键入命令即可推送新分支:

git po
Run Code Online (Sandbox Code Playgroud)


Bea*_*com 6

我做了与许多其他用户类似的事情,但想将其作为替代方案分享,因为我没有看到其他人发布此内容。

alias gpu='git push --set-upstream origin $(git branch --show-current)'

Run Code Online (Sandbox Code Playgroud)

(oh-my-zsh 已经有一个 GPU 别名,因此在 .oh-my-zsh/plugins/git/git.plugin.zsh 中进行了编辑)


jch*_*nes 5

对于那些寻找与 一起使用的别名的人git pull,这就是我使用的:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"
Run Code Online (Sandbox Code Playgroud)

现在每当你得到:

$ git pull
There is no tracking information for the current branch.
...
Run Code Online (Sandbox Code Playgroud)

赶紧跑:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull
Run Code Online (Sandbox Code Playgroud)

你可以走了


Tho*_*rge 5

在 git2.37.0或更新版本中,您可以告诉 git 自动设置远程。这是用完成的

git config --global --add --bool push.autoSetupRemote true
Run Code Online (Sandbox Code Playgroud)

然后你就可以写了git push,它会推送到默认的远程。


归档时间:

查看次数:

934712 次

最近记录:

5 年,9 月 前