您如何git只拉当前分支?


81

是否有一种无需指定哪个分支即可进行设置的配置方式?

Answers:


82

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”(默认情况下)会尝试推送所有分支(具有相同的远程名称)。
亚历山德罗·德·西蒙妮

2
@AlessandroDs好吧,正是出于这个原因,我将push.default设置为上游。push.default的新默认值是“ simple”,它再次仅更新当前分支,因此与pull的作用更加平行。
塞斯·罗伯逊

1
@Danjah:所有更改都从远程仓库中提取(进入远程跟踪分支,例如origin / master origin / foo等)。如果您签出到定义了上游的本地分支,则只会更新该本地分支。如果您签出到没有上游的本地分支中,那么您必须指定更多信息或设置上游。不要尝试修改非本地签出,创建本地分支并继续。如果要减少传输的内容,可以在本地git配置中更新远程设备的refspec。
塞斯·罗伯森

1
是否有一种内置的方法来不更新所有引用,而仅获取当前分支?
Aditya MP

1
@aditya menon:不容易。您将需要更新refspec(例如git config remote.origin.fetch)以仅获取所需的特定ref(分支,标签等)。有关更多具体示例,请参见stackoverflow.com/questions/15507264/…
塞斯·罗伯森

61

我只是这样做:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

要么

git pull origin $(git rev-parse --abbrev-ref HEAD)

这将从中提取当前分支git branch,并将该分支从远程源中拉出。

请注意,就像塞思·罗伯逊(Seth Robertson)所说的那样,当不提供任何参数时,仅修改当前分支,而获取所有远程分支。我不想获取所有远程分支,所以我这样做。


3
git branch不应真正解析分支信息。该信息可通过git rev-parse以下命令获得:git pull origin $(git rev-parse --abbrev-ref HEAD)
Paul DelRe

@ayke我在您的回答中也添加了Paul DelRe的答案,因为它也有用,我希望你们都不要介意
Timo

1
只是好奇:一个简单的“ git pull”(已经签出我要拉的分支)和您的建议有什么区别?您的命令替换结果git pull origin <current-branch>仍然是默认值,不是吗?您是在暗示其他远程分支(例如起源/其他分支等)未更新,从而减少了流量吗?
彼得-恢复莫妮卡

我很早以前就回答了,我真的不知道了。您可能应该接受公认的答案……
ayke 17/09/29

@ 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

18

更新

我添加的旧答案不再起作用:/。但是,在收到有关我已放置的PUSH版本的一些赞誉之后,对我来说,这个答案实际上是在帮助搜索引擎结尾的人,因此我将保留这个答案。

尝试使用新版本的git:

$ git config --global push.default current

9
我不相信pull.default存在。参见 git-scmkernel.org
Mort 2015年

2
是。linux上的git 2.3.4甚至可以使用上述命令获取所有分支pull.default=current。我看到git clone默认情况下也添加了我的代码,remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*但这很标准。
Mort 2015年

6
没有pull.default配置变量。将其放在您的git配置中不会做任何事情。
大卫·桑德斯

5
问题是关于git pull的,答案是有很多支持的git push。这会误导@BrunoCasali为什么您要编辑答案并删除它(如果它对您有用)?如果您知道答案是错误的,请删除它,而不要保留不相关的信息以保留投票。
TJ

5

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

[push]
  default = current

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

检查方式:

git config --global --get push.default

请参阅:git-config


3

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

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

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

它可能已被弃用(源?),但是--set-upstream-to=当它不知道您的跟踪信息时,它总是被git提及。更不用提弃用了。
阿德里安

@AdrienGiboire这是有关弃用的一些信息: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新手,以上内容可能会简化很多。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.