你怎么能 git 只拉当前分支?
Posted
技术标签:
【中文标题】你怎么能 git 只拉当前分支?【英文标题】:How can you git pull only the current branch? 【发布时间】:2011-08-28 11:07:13 【问题描述】:是否有无需指定哪个分支的配置方式来设置它?
【问题讨论】:
【参考方案1】:Git 已经只拉取当前分支。如果您将分支设置为跟踪分支,则无需指定远程分支。 git branch --set-upstream localbranch reponame/remotebranch
将建立跟踪关系。然后你发出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
【讨论】:
没错,也许有点奇怪,因为“git push”(默认)会尝试推送所有分支(具有相同的远程名称)。 @AlessandroDs 好吧,出于这个原因,我将 push.default 设置为 upstream。 push.default 的新默认值是“simple”,它再次只更新当前分支,因此与 pull 的作用更加平行。 @Danjah:所有更改都从远程 repo 中提取(到远程跟踪分支,例如 origin/master origin/foo 等)。如果您签出到定义了上游的本地分支,则只会更新该本地分支。如果您签出到没有上游的本地分支,那么您必须指定更多信息或设置上游。不要尝试修改非本地结帐,创建本地分支并继续。如果您想减少传输的内容,可以在本地 git config 中更新远程的 refspec。 有没有内置的方法不更新所有 refs 只获取当前分支? @aditya menon:不容易。您需要更新 refspec(例如 git config remote.origin.fetch)以仅获取您想要的特定参考(分支、标签等)。有关更多具体示例,请参阅***.com/questions/15507264/…。【参考方案2】:我就是这样做的:
git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"
或
git pull origin $(git rev-parse --abbrev-ref HEAD)
这会从git branch
中提取当前分支,并从远程源拉取该分支。
注意,就像 Seth Robertson 所说,当没有给出参数时,只有当前分支被修改,但所有远程分支都被获取。我不想获取所有远程分支,所以我这样做了。
【讨论】:
git branch
不应该真正被解析为分支信息。该信息可通过git rev-parse
获取命令:git pull origin $(git rev-parse --abbrev-ref HEAD)
@ayke 我将 Paul DelRe 答案添加到你的答案中,因为它也有效,我希望你们都不介意
只是好奇:一个简单的“git pull”(检查了我想拉的分支)和你的建议有什么区别?您的命令替换导致 git pull origin <current-branch>
无论如何都是默认值,不是吗?您是否暗示其他远程分支(例如 origin/other-branch 等)没有更新,从而减少了流量?
我很久以前就回答过这个问题,我真的不知道了。您可能应该接受已接受的答案...
@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
。我真的很想知道没有跟踪信息的情况是如何发生的。【参考方案3】:
更新
我添加的旧答案不再起作用:/。但是在收到一些关于我放置的 PUSH 版本的投票后,对我来说,这意味着这个答案实际上是在帮助那些从搜索引擎来到这里的人,所以我会保留这个答案。
在新版本的 git 上试试这个:
$ git config --global push.default current
【讨论】:
我不相信 pull.default 存在。请参阅git-scm 或kernel.org。 是的。即使使用上述pull.default=current
,Linux 上的 git 2.3.4 也会获取所有分支。我看到默认情况下我的git clone
也添加了remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
,但这是相当标准的。
没有pull.default
配置变量。把它放在你的 git 配置中不会做任何事情。
问题是关于 git pull 的,答案包含 git push 并且有很多点赞。这是误导@BrunoCasali 你为什么编辑你的答案并删除它,如果它对你有用?如果您意识到答案是错误的,请删除它,而不是保留不相关的信息以保持投票。【参考方案4】:
--set-upstream
标志已弃用并将被删除。
因此,请使用--track
或--set-upstream-to
示例: 如果你想为这个分支设置跟踪信息,你可以这样做:
git branch --set-upstream-to=<remote>/<branch> develop
【讨论】:
它可能已被弃用(来源?)但当 git 不知道您的跟踪信息时,它会不断提及--set-upstream-to=
。没有提及弃用。
@AdrienGiboire 以下是有关弃用的一些信息:jira.atlassian.com/browse/SRCTREEWIN-588【参考方案5】:
是的,.gitconfig
中有一个配置可以更改,例如:
[push]
default = current
这将推送当前分支以更新接收端具有相同名称的分支。
检查人:
git config --global --get push.default
请参阅:git-config。
【讨论】:
问题是关于git pull
而不是 git push
所以我对你的回答投了反对票,以防止人们认为这是解决方案【参考方案6】:
这是一个 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 新手,上面的内容可能会简化很多。)
【讨论】:
以上是关于你怎么能 git 只拉当前分支?的主要内容,如果未能解决你的问题,请参考以下文章