使用git自动跟踪远程分支

259

当我使用本地分支mybranch时,我想能够只使用git pushgit pull来推送和拉取origin mybranch的更改。目前,我必须费力地写出git push origin mybranchgit pull origin mybranch。如果我尝试只使用git pull,例如,会出现以下错误:

There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> mybranch

如果我输入git branch --set-upstream-to=origin/mybranch mybranch,那么它就有效了。但这几乎与先前的命令一样繁琐。我能不能让git默认执行这个操作呢?我看到类似的问题被问过,答案往往表明较新版本的git会这样做,但我正在使用的是git版本2.1.3,这已经相当新了,所以不可能只是因为它。


4
下次推送时,请使用 git push -u origin mybranch。从那时起,当您在 mybranch 分支上时,只需运行 git pushgit pull 即可。 - jub0bs
23
在Git 2.37(2022年第三季度)中,git config --global push.autoSetupRemote可以提供帮助。 - VonC
除非你知道自己在做什么,否则不要使用“--global”。当你已经忘记曾经使用过“--global”时,一年后可能会出现难以找到的错误。 - Martin
3
或者始终使用全局变量,这样你就知道你的所有存储库都会表现相同。 - Jonatan Cloutier
4个回答

547

从 git 2.37.0 开始,这现在可以使用 git 配置实现。

运行以下命令来更新您的配置:

git config --global --add --bool push.autoSetupRemote true

然后git push将自动设置远程分支。

注意: --global标志表示这将适用于您机器上所有的git命令(无论是哪个存储库),您可以省略该标志,使其只针对机器上的单个存储库。

文档:

https://git-scm.com/docs/git-config#Documentation/git-config.txt-pushautoSetupRemote

push.autoSetupRemote

如果设置为“true”,则假定默认情况下推送时使用--set-upstream,当当前分支不存在上游跟踪时;此选项对push.default选项simple,upstream和current有效。 如果您希望默认情况下将新分支推送到默认远程(例如push.default=current的行为),并且还希望设置上游跟踪,则该选项非常有用。 最有可能从此选项中受益的工作流是简单的中央工作流,其中预期所有分支在远程上具有相同的名称。


3
我认为在告诉用户使用“--global”时,没有告知他们会更改机器上所有存储库的配置是很危险的。 - Martin
8
我添加了一个关于“全局”的解释。 - Loren
8
--add 标志表示添加选项,这个设置可以有多个选项。在这种情况下,--bool 标志也是不需要的。 - Qtax
1
在我的 Mac 上,git version 2.39.1 似乎没有起作用;当我运行 git pull 命令时,它仍然要求我设置跟踪信息。 - soMuchToLearnAndShare
你必须设置配置并先推送该分支(以设置远程)。 - Loren

58

一种可能的解决方案是修改您的git push行为为current(请注意,这也会有其他一些副作用)。您可以通过直接修改您的~/.gitconfig文件(假设您在Linux上)或执行以下操作来实现:

 git config --global push.default current 
git config --global push.default current

现在当你执行push命令时,即使你没有明确指定远程分支的名称,git也会自动将当前所在的分支推送到一个具有相同名称的远程分支。此外,如果当前分支没有对应的远程分支,则会创建一个远程分支,并将当前分支设置为跟踪它(与git push -u origin new_branch相同,但只需要单个git push)。同时可以查看这篇问题 ,其中详细描述了git push的行为。


11
使用git config --global pull.default current命令可以使得Git自动从远程仓库拉取与当前本地分支同名的分支。注意,翻译时要保证准确性和简洁性,不可添加额外解释或内容。 - Alexander Rodin
3
@AlexanderRodin不起作用,仍要求使用git 2.15.0设置上游。 - Édouard Lopez
4
@AlexanderRodin 这个配置选项在任何文档中都没有记录。你确定它存在吗? - xeruf
1
文档 https://git-scm.com/docs/git-config#Documentation/git-config.txt-pushdefault - Aurelio
3
我将 push.default 设置为 current,但第一次推送时并没有设置远程跟踪。使用 git config --global push.default upstream 可能会有所帮助。 - phil pirozhkov
显示剩余2条评论

24

不是Github,而是本地的Git完成所有这些操作。

如果你使用git checkout在本地创建了mybranch分支,并且它已经存在于本地仓库中的origin/mybranch分支中,那么你可以简单地使用命令git checkout mybranch,你的本地Git会发现origin/mybranch已经存在,并创建以origin/mybranch为上游的本地mybranch分支。

另一方面,如果origin/mybranch还不存在,并且你正在使用git checkout -b或类似命令在本地创建mybranch分支,那么你无法将其设置为跟踪尚未存在的上游分支(你可以配置它来跟踪该分支,但是你会偶尔收到上游版本不存在的投诉)。

在这种特定情况下,在第一次推送时(将创建上游分支),可以使用以下命令:

git push -u origin mybranch

这将告诉您的本地 git 将 mybranch 推送到 origin并且在完成后,将origin/mybranch设置为mybranch的跟踪分支。

请注意,这与运行 git branch --set-upstream-to 相同:您只需执行一次操作,之后它将在本地设置,您无需再次执行。这只是更方便,因为您可以将其与创建位于 origin 的分支的push 一起执行。但是您仍然需要记得去做它(一次;当您运行没有-u origin mybranchgit push时会提醒您)。


啊,我本来想避免特别提到Github的,但是打错了。我会修复的。谢谢你的信息!我想我会在创建分支时制作一个Bash别名来完成这个操作。 - limp_chimp

0

git -u origin HEAD 是一种不必写出分支的完整名称的方法。

-u--set-upstream 的简写,HEAD 指的是当前头部的名称(即你当前所在的分支)。


这并未解决问题。问题要求自动化该过程的方法(可以通过配置选项实现,如其他答案所述),而不是简写方式。 - amycodes
@amycodes Stack Overflow没有让我将这个作为关于git push -u origin mybranch的后续评论添加到其他回答中,因为我没有50个声望,所以我不得不以对发布者的评论回复的方式进行回答。 - triple
很遗憾,你只能等到获得50个声望。我也认为这个系统有缺陷,但这就是现实。答案不应该被用作评论。 - amycodes

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