为什么我需要一直做 “--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吗?如何使它成为默认行为?

答案

一个快捷方式可以做到:与记住git branch --set-upstream 1的语法无关:

git push -u origin my_branch

... 第一次按下该分支。或者,将当前分支推送到同名的分支(方便使用别名):

git push -u origin HEAD

您只需要使用-u一次,就可以与git branch --set-upstream相同的方式在分支和origin分支之间建立关联。

就个人而言,我认为必须在分支机构与远程分支机构之间显式建立关联是一件好事。可惜的是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

... 或使用简短选项:

git branch -u origin/my_branch

git 1.8.0 的发行说明(候选发行版 1 )中描述了此更改及其原因:

git branch --set-upstream origin/master很诱人,但是这告诉 Git 安排本地分支的origin/master与当前已签出的分支集成,这在用户看来是不太可能的。该选项已弃用;使用新的--set-upstream-to (带有简短的-u )选项。

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

git config --global push.default current

这将推断出origin my_branch部分,因此您可以执行以下操作:

git push -u

这将创建具有相同名称的远程分支并对其进行跟踪。

你可以简单地

git checkout -b my-branch origin/whatever

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

参见git help config

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

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

这是我最常使用的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.
...

另外,在终端中输入粗话也很有趣。

您可以使用:

git config --global branch.autosetupmerge 总是

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

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

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

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

$ git push -u origin HEAD

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

在〜/ .gitconfig 文件中

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

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

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

如果以下方法不起作用:

git config --global push.default current

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

git config --local push.default current
git branch --set-upstream-to=origin/master<branch_name>