我在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 v2.37.1及以上版本
如果您使用的是上述版本或更高版本,则可以使用此新的配置项自动设置远程跟踪:
git-config--全局push.autoSetupRemote true
之后,当您执行git推送跟踪时,会自动设置。无需git push-u origin my_branch
一个快捷方式,它不依赖于记住gitbranch的语法——set upstream 1是这样做的:
git push -u origin my_branch
…你第一次推那根树枝。或者,要从同名分支推送到当前分支(方便别名):
git push -u origin HEAD
您只需要使用-u一次,这将以与gitbranch-set-upstream相同的方式在分支和源分支之间建立关联。
就个人而言,我认为必须明确地在分支和远程分支之间建立关联是一件好事。很遗憾,git push和git pull的规则不同。
1这听起来可能很傻,但我经常忘记指定当前分支,假设这是默认分支-不是,结果非常令人困惑。
更新2012-10-11:显然,我不是唯一一个发现容易出错的人!感谢VonC指出,git 1.8.0引入了更明显的git分支——设置上游到,如果您使用分支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/matter与当前签出的分支集成,这很可能不是用户的意思。该选项已弃用;改为使用新的--set upstream to(带有一个短而甜的-u)选项。
您可以通过两种方式更简单地设置上游。创建分支时首先:
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
更新:push.autoSetupRemote现在终于以更简单的方式解决了这个问题!有关更多信息,请参阅此处的另一个答案。
原答覆:
我使用这个Git别名,而不是每次从Git复制/粘贴建议:https://gist.github.com/ekilah/88a880c84a50b73bd306
复制的源代码如下(将其添加到~/.gitconfig文件中):
[alias]
pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"
99%的时间我想将上游设置为同名分支,所以我使用这个(在*nix或GitBash中):
git branch --set-upstream-to=origin/$(git branch --show-current)
这很好,因为它是分支不可知的。请注意,子命令gitbranch--show current会打印当前的分支名称,如果已分离,则不打印。
附带说明:我的配置设置为可以使用gitpush-u,所以我很少需要这样做。但我有时还是会这样做,通常是在我决定要将本地更改重置为远程设备上的任何更改时,这时我意识到我以前在推送时没有使用-u。因此,通常,在设置上游后,我要运行的下一个命令是重置远程分支:
git reset --hard @{u}
这也恰好是分支不可知的。(也许我真的不喜欢输入我的分行名称。)
这里有很多很好的答案,然而,所有这些都要求您在运行git pull之前正确地执行其他操作
使用别名来完成诸如“通过创建本地正在正确跟踪的远程分支,使git push按应有的方式工作”之类的工作当然会有所帮助。然而,当你忘记使用它们,或者经历了不同的工作流程时,这些都不会对你有所帮助。
这里有一个bash函数,您可以使用它来按应该的方式进行拉取,方法是检测何时未配置远程合并目标,但远程上有一个与本地分支同名的分支,然后将该分支设置为合并目标,然后进行拉取。
git-pulldown() {
head="$(git rev-parse --abbrev-ref HEAD)"
if [[ $(git config "branch.$head.merge") ]]; then #there's already a merge target configured, just pull as normal from there
git pull
else
if [[ $(git ls-remote --heads origin $head) ]]; then #there is an upstream branch existing with the same name as our branch
git branch --set-upstream-to origin/$head #set merge target to upstream branch with same name
git pull
else #fail with explanation
echo "Branch $head has no upstream or merge target! You will likely have to push first, or manually configure it"
return 1
fi
fi
}
git config --global push.autoSetupRemote true
OP询问:
我了解到,我可以通过以下方式实现:gitbranch—设置上游my_branch原点/my_branch但为什么我需要为我创建的每个分支都这样做?
您不需要一直设置上游。不再(十一年后)。
在Git 2.37(2022年第三季度)中,一个Git-config--globalpush.autoSetupRemote true将为您解决这一问题。
参见Tao Klerks(TaoK)的提交05d5775、提交8a649e、提交bdaf1df(2022年4月29日)。(于2022年5月26日由Junio C Hamano--gitster在提交f49c478中合并)
push:新配置选项“push.autoSetupRemote”支持“简单”push签字人:Tao Klerks
在一些“简单”的集中工作流中,用户希望远程跟踪分支名称与本地分支名称匹配。“git push”(man)推送到分支的远程版本/实例,“git pull”(man)推送对远程分支的任何更改(同一用户在另一个地方或其他用户所做的更改)。push.default默认选项“simple”支持这种期望,该选项拒绝对不匹配的跟踪分支名称进行默认推送,而新的branch.autosetupmmerge选项“simple”仅为同名远程分支设置远程跟踪。当用户创建了一个新分支,但尚未推送(push.default未设置为“current”)时,系统会提示用户“当前分支%s没有上游分支”错误,以及如何推送和添加跟踪的说明。这个错误很有帮助,因为每个分支只遵循一次建议就可以永远解决该分支的问题,但对于“简单”的集中工作流来说,这总是正确的做法,因此最好只执行它。使用新的配置设置push.autoSetupRemote支持此工作流,当未配置远程跟踪分支时,该设置将导致默认推送到远程和上游--set上的相同名称。当遇到“当前分支%s没有上游分支”错误时,还添加一个提示,提供此新选项,并添加相应的测试。
新提示是:
为无跟踪的分支自动执行此操作上游,请参阅“git-help-config”中的“push.autoSetupRemote”
git-config现在在其手册页中包括:
push.autoSetupRemote如果设置为“true”,则假定--在没有当前分支存在上游跟踪;此选项在push.default选项“simple”、“upstream”和“current”时生效。默认情况下,如果您希望将新分支推送到默认远程(如“push.default=current”的行为),并且还希望设置上游跟踪,则此选项非常有用。最有可能从该选项中受益的工作流是“简单”的中心工作流,其中所有分支在远程上都应具有相同的名称。