协慌网

登录 贡献 社区

为什么我需要一直做 `--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 (使用 short-and-sweet -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