你如何只拉取当前分支的git pull?

97

有没有一种配置方式可以设置这个而不必指定分支?

6个回答

102

Git已经仅拉取当前分支。如果你将分支设置为跟踪分支,就不需要指定远程分支。git branch --set-upstream-to=reponame/remotebranch localbranch会建立跟踪关系,然后使用git pull [--rebase]只会更新那个分支。

当然,所有远程跟踪分支和所有远程引用都会被更新,但只有你的本地跟踪分支会被修改。

有用的Bash别名可减少这种常见操作的输入:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

执行相同操作的PowerShell函数:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}

2
@AlessandroDs 嗯,我将 push.default 设置为 upstream 就是为了这个原因。push.default 的新默认值是 "simple",它只更新当前分支,所以更类似于 pull 的操作方式。 - Seth Robertson
2
@Danjah:所有更改都会从远程仓库拉取(到远程跟踪分支,例如origin/master origin/foo等)。如果您已经检出了一个具有上游定义的本地分支,则只会更新该本地分支。如果您已经检出了一个没有上游的本地分支,则必须指定更多信息或设置上游。不要尝试修改非本地检出,创建一个本地分支并继续。如果您想减少传输内容,可以在本地git配置中更新远程的refspec。 - Seth Robertson
3
有没有内置的方法可以不更新所有引用,只获取当前分支? - Aditya M P
1
为什么在这个页面:https://git-scm.com/book/en/v2/Git-Internals-The-Refspec 中它指定在“默认情况下,它会拉取所有分支”,如果你只想拉取主分支,你需要在 refspecs 中指定它..? - Matt
1
fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead. - neaumusic
显示剩余4条评论

77

我就是这样做的:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"
或者
git pull origin $(git rev-parse --abbrev-ref HEAD)

这从git branch中提取当前的分支,并从远程origin拉取该分支。

注意,就像Seth Robertson所说,当没有给出参数时,只修改当前分支,但是会获取所有远程分支。我不想获取所有远程分支,因此我采用了这种方式。


3
git branch shouldn't really be parsed for branch information. That information is available with git rev-parse making the command: git pull origin $(git rev-parse --abbrev-ref HEAD) - Paul DelRe
@ayke,我将Paul DelRe的答案添加到了你的答案中,因为它也有效,希望你们两个都不介意。 - Timo Huovinen
1
只是好奇:简单的“git pull”(已经检出我想要拉取的分支)和你的建议有什么区别?您的命令替换结果为git pull origin <current-branch>,这本来就是默认设置,对吧?您是否在暗示其他远程分支(例如origin / other-branch等)未更新,因此流量减少了? - Peter - Reinstate Monica
我很久以前回答过这个问题,现在我真的不太清楚了。你应该选择被接受的答案... - ayke
@PeterA.Schneider 如果你只输入 git pull,你可能会收到类似于 There is no tracking information for the current branch. Please specify which branch you want to merge with. 的消息。然后你总是需要输入 git pull origin my-feature-branch。我真的很想知道为什么会出现没有跟踪信息的情况。 - Alfe
git pull origin $(git branch --show-current) 这个更容易记住。 - RN Kushwaha

12

更新

我之前提供的旧答案已经失效了 :/。但是由于我收到了一些有关PUSH版本的赞,这对那些通过搜索引擎来到这里的人实际上是有帮助的,因此我将保留这个答案。

尝试使用以下内容适用于新版本的git:

$ git config --global push.default current

10
我不相信 "pull.default" 这个配置项存在。请参考以下链接来了解更多信息: git-scm 或者 kernel.org - Mort
2
是的。在Linux上,git 2.3.4即使使用了上述pull.default=current,也会获取所有分支。我发现我的git clone默认还添加了remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*,但这是相当标准的。 - Mort
7
没有“pull.default”配置变量。将其加入您的git配置中不会产生任何效果。 - David Sanders
9
问题涉及git pull,而答案包含很多赞的git push。这会产生误导。@BrunoCasali 为什么你编辑了你的答案并删除它,如果它对你有效吗?如果你意识到答案是错误的,请删除它,而不是保留与主题无关的信息以保持点赞数。 - T J

1

--set-upstream 标志已被弃用并将被移除。因此,请使用 --track--set-upstream-to

示例: 如果您希望为此分支设置跟踪信息,可以使用以下命令:

git branch --set-upstream-to=<remote>/<branch> develop

它可能已经被弃用了(来源?),但是当Git不知道您的跟踪信息时,--set-upstream-to= 仍然会被提及。没有提到弃用。 - Adrien
@AdrienGiboire 这里有一些关于弃用的信息:https://jira.atlassian.com/browse/SRCTREEWIN-588 - biniam

0

这里有一个 git 别名,它不假定远程是 origin 并且处理如果分支没有跟踪远程。

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(免责声明:我非常菜鸟 bash,上面的代码可能可以简化很多。)


-2

是的,在.gitconfig中有一个可以更改的配置,例如:

[push]
  default = current

这将推送当前分支以更新接收端具有相同名称的分支。

检查方式:

git config --global --get push.default

请参见:git-config


2
这个问题是关于 git pull 而不是 git push,所以我给你的答案投了反对票,以防止人们认为这是解决方案。 - Manse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接