为什么我需要一直执行`–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_branch
到origin/my_branch
,那么我想拉origin/my_branch
到my_branch
? 我怎样才能使这个默认行为?
一个不依赖记忆git branch --set-upstream
1语法的快捷方式是:
git push -u origin my_branch
你第一次推这个分支 你只需要做一次,然后在你的分支和origin
分支之间build立关联,就像git branch --set-upstream
一样。
我个人认为,必须明确地build立分支和远程分支之间的关联是一件好事。 git push
和git 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.autosetupmerge
或branch.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一样简单。