【问题标题】:How can you git pull only the current branch?你怎么能 git 只拉当前分支?
【发布时间】:2011-08-28 11:07:13
【问题描述】:

是否有无需指定哪个分支的配置方式来设置它?

【问题讨论】:

    标签: git config pull


    【解决方案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)以仅获取您想要的特定参考(分支、标签等)。有关更多具体示例,请参阅stackoverflow.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-scmkernel.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 新手,上面的内容可能会简化很多。)

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 2017-06-21
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2013-06-20
      相关资源
      最近更新 更多