我在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/mi_branch拉到my_brance,这不是很明显吗?如何将此设置为默认行为?


当前回答

因为git能够将不同的分支推/拉到不同的“上游”存储库。您甚至可以使用单独的存储库来推送和拉取同一个分支。这可以创建一个分布式、多层次的流,我可以看到这在诸如Linux内核之类的项目上非常有用。Git最初是为用于该项目而构建的。

因此,它没有假设您的分行应该跟踪哪个回购协议。

另一方面,大多数人不会以这种方式使用git,因此它可能是一个很好的默认选项。

Git通常是相当低级的,它可能会令人沮丧。然而,有GUI,如果您仍然想从shell使用它,那么编写助手脚本应该很容易。

其他回答

您还可以明确地告诉gitpull要拉哪个远程分支(正如错误消息中提到的那样):

git pull<remote name><remote branch>

但是,要小心:如果您在不同的分支上执行显式拉取,那么您拉取的refspec将被合并到您所在的分支中!

这里有一个gitpush的bash别名,它在每次推送时都可以安全运行,并且会自动在第一次推送设置上游和之后执行正常推送之间切换。

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

原始帖子

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

如果以下操作不起作用:

git config --global push.default current

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

git config --local push.default current

您可以使用:

git config --global branch.autosetupmerge always

每次创建或签出新分支时,它将链接上游分支。

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

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