如何避免执行“git branch --setup-upstream”命令,而是默认自动设置远程跟踪?

1960
我在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中。我怎样才能将此设置为默认行为呢?

34
branch.autosetupmerge 的默认设置意味着,当从远程跟踪分支(例如 <remote-name>/<branch-name>) 创建分支时,新分支的上游配置才会自动设置 (参见 git-config(1)). 你可能是从现有的本地分支创建分支。如果你要直接从远程分支的最新提交(尽管你在本地分支上)创建分支,则可以使用 git branch my_branch <remote-name>/<branch-name> 自动设置上游配置。 - Chris Johnsen
27
FYI,--set-upstream选项已被弃用。应使用--track--set-upstream-to代替。 - Sean the Bean
215
如果--set-upstream已经被弃用,那么Git开发者应该从帮助信息中移除它,这样当你在没有设置上游分支的情况下运行git push时,就不会再显示该选项了。 - Christopher Hunter
24
自从你发表评论以来已经过了一年,但是它仍然没有改变。这只是一个草率的反馈意见,还是可能有一个我们不知道的技术上明智的原因让它保留下来? - Konrad Viltersten
50
git branch --set-upstream 已经被废弃,git push --set-upstream 没有被废弃。 - Rag
显示剩余7条评论
29个回答

12

如果你想追踪远程已经存在的分支(例如origin/somebranch),但是还没有在本地检出,可以执行以下操作:

$ git checkout --track origin/somebranch

注意:'-t'是'--track'选项的缩写。

这将立即设置相同的关联。


5
实际上,您只需切换到该分支即可。因此,git checkout somebranch 是等效的。 - Zamith
2
@Zamith 这不是只有在之前立即调用了 git fetch 才能起作用吗? - Walter Roman
2
不是立即需要,但是确实需要在本地仓库中引用该分支,这会在调用 git fetchgit pull 时发生。虽然我从未发现过这个问题。 - Zamith

12

更新:push.autoSetupRemote现在以更简单的方式解决了这个问题!有关更多信息,请参见此处的其他答案

原始回答:

我使用这个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"

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

不再支持。 - sol0mka

10
你还可以明确告诉git pull要拉取哪个远程分支(就像错误消息中提到的那样): < p >< code > git pull < remote-name & gt; < remote-branch & gt; 但是,需要注意一点:如果你在不同的分支上并进行了显式的拉取操作,则将合并所拉取的refspec到当前所在的分支中!

7
你可以设置一个非常好的别名来处理这个问题,而无需使用过于冗长的语法。
我在~/.gitconfig中有以下别名:
po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

在新分支上提交代码后,您只需输入以下命令即可推送您的新分支:
git push -u origin [new_branch_name]
git po

为什么使用 popush origin 是什么意思?如果多次运行会发生什么? - Arnold Roa
是的,就像 push origin 一样。如果运行多次,什么也不会发生。我还设置了一个 git push -f 别名为 git pf,所以在 origin 已经被推送后,我会使用它。 - 123
请参考djanowski的评论,您可以直接使用HEAD - arhak

6

我和很多其他用户做了类似的事情,但由于没有看到其他人发布这篇文章,所以我想分享一下我的方法作为另一种选择。

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

(oh-my-zsh已经有一个名为gpu的别名,所以在.oh-my-zsh/plugins/git/git.plugin.zsh文件中进行了编辑)


5

如果您正在寻找一个可以与 git pull 一起使用的别名,这就是我使用的:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

现在,每当您遇到以下情况时:
$ git pull
There is no tracking information for the current branch.
...

只需运行:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

现在你已经准备就绪了


5
在 git 版本 2.37.0 或更高版本中,您可以告诉 git 自动设置远程仓库。这可以通过以下方式完成:
git config --global --add --bool push.autoSetupRemote true

然后你只需要输入 git push,它将推送到默认的远程仓库。


1
当然没问题。我只是觉得你的回答有点冗长。 - Thorkil Værge
这个答案应该涵盖90-99%的人使用此功能。如需更深入的解释,请参考@VonC的答案。 - Thorkil Værge
但是什么是“默认远程”?我需要知道这是否将主分支(master)设置为默认。 - undefined

4

99%的情况下,我想要将上游设置为同名的分支,因此我在*nix或Git Bash中使用以下命令:

git branch --set-upstream-to=origin/$(git branch --show-current)

这个命令很好用,因为它不分支派。注意子命令 git branch --show-current 会打印出当前分支的名称,如果你是游离状态则不会有输出。

附注: 我的配置设置使我可以使用 git push -u 命令,所以我很少需要这样做。但有时我还是需要,通常是当我决定要将本地更改重置为远程的内容时,此时我意识到之前我没有加上 -u 参数进行推送。因此,通常在设置了上游之后,我要运行的下一个命令就是重置为远程分支:

git reset --hard @{u}

这也与分支无关。 (也许我只是非常不喜欢输入我的分支名称。)


得到错误:请求的上游分支 'origin/test' 不存在。 - Vitaly Zdanevich
@VitalyZdanevich 这意味着您尚未推送您的分支。(这个问题是关于在您已经推送分支之后设置上游。) 在您的情况下,您可以在第一次推送时设置上游,例如 git push --set-upstream origin test - TTT
但我可以在不推送/拉取的情况下设置上游吗?我想要一个别名来创建一个新的分支并设置上游,目前我有这个错误的代码: [alias] cr =“!f(){git switch-c $1; git branch --set-upstream-to = origin / master $1;}; f” - Vitaly Zdanevich
@VitalyZdanevich 我不知道如何恰当地表达“这是我将来想要跟踪的内容”。我想你可以更新你的别名,在分支创建时将其推送到上游,虽然在没有新提交的情况下宣布一个新的分支名称可能有些奇怪,但至少可以实现你的目标... - TTT

3

oh-my-zsh的git插件已经将此命名为gpsup。这将推送并设置上游到分支,一次完成所有操作!

我个人喜欢标准化和一致性的解决方案。建议其他人使用相同的别名。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接