你怎么能 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 只拉当前分支?的主要内容,如果未能解决你的问题,请参考以下文章

git怎么查询当前分支的版本号

git怎么查询当前分支的版本号

git分支管理

怎么在git提交代码到远程分支

git 分支

Git如何在不提交当前分支的情况下切换到其它分支进行操作——git stash