为什么我需要一直执行`–set-upstream`?

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

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 (eg '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 

但为什么我需要为我创build的每个分支做这个? 是不是很明显,如果我推my_branchorigin/my_branch ,那么我想拉origin/my_branchmy_branch ? 我怎样才能使这个默认行为?

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

 git push -u origin my_branch 

你第一次推这个分支 你只需要做一次,然后在你的分支和origin分支之间build立关联,就像git branch --set-upstream一样。

我个人认为,必须明确地build立分支和远程分支之间的关联是一件好事。 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 

…或者有一个简短的select:

 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 )选项。

您可以使用较less的input来实现这一点。 首先,改变推送的方式:

 git config --global push.default current 

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

 git push -u 

这将同时创build具有相同名称的远程分支并跟踪它。

你可以简单

 git checkout -b my-branch origin/whatever 

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

请参阅git help config

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

 git branch -u origin/my-branch 

或者在创build分支之后,可以使用此命令。

 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 

您可以使用:

总是configuration – 全局branch.autosetupmerge

每次创build或检出新分支时,都会连接上游分支。

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

这也适用于autosetuprebase,如果你遵循更多的重定位工作stream程,但不要使用这个,除非你知道你在做什么,因为它会默认你的拉动行为rebase,这可能会导致奇怪的结果。

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

 $ git push -u origin HEAD 

如果你试图追踪远程存在的分支(例如origin / somebranch),但是还没有在本地检查出来,你可以这样做:

 $ git checkout --track origin/somebranch 

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

这立即build立了同样的协会。

你也可以明确地告诉git拉什么远程分支拉(错误消息中提到):

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

但是要小心,如果你在一个不同的分支上并且做了一个明确的拉取,那么你所抽取的refspec将被合并到你所在的分支中!

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

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

 [alias] pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream" 
 git branch --set-upstream-to=origin/master<branch_name> 

你可以设置一个真正好的别名,可以处理这个没有过分冗长的语法。

我在~/.gitconfig有以下别名:

 po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\"" 

在一个新的分支上进行提交后,只需input以下命令即可推送新的分支:

 git po 

因为git具有很酷的能力来将不同的分支推送到不同的“上游”存储库。 您甚至可以使用单独的存储库来推拉同一分支。 这可以创build一个分布式的多层次的stream程,我可以看到这在Linux内核等项目上很有用。 Git最初是为了在该项目上使用而build立的。

因此,它不会假设您的分支应跟踪哪个回购。

另一方面,大多数人不会以这种方式使用Git,所以它可能是默认选项的好例子。

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

你也可以做git push -u origin $(current_branch)

由于这个问题,我重新发现legit (仅限OS X)。 现在所有我用分支是这两个命令:

legit publish [<branch>]发布指定的分支到远程。 (别名: pub

legit unpublish <branch>取消legit unpublish <branch>从远程移除指定的分支。 (别名: unp

SublimeGit默认提供了legit支持,这使得整个分支程序像按Ctrl-b一样简单。