使用 git 自动跟踪远程分支

当我使用本地分支 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版本,这是相当新的版本,所以不可能仅仅是这样。

36310 次浏览

不是 Github 是你们本地的蠢货,他们做了这些。

If you are creating mybranch locally with git checkout 还有 it already exists as origin/mybranch in your local repository, you can simply git checkout mybranch and your local git will see that origin/mybranch exists and create local mybranch with origin/mybranch as its upstream.

另一方面,如果 origin/mybranch还不存在,而你正在用 git checkout -b或类似的方法在本地创建 mybranch,你不能真正地将它设置为跟踪还不存在的上游分支(你可以用 配置来跟踪那个分支,但是你会偶尔收到抱怨说上游版本不存在)。

在这种特殊情况下,在 第一推送(将在上游创建分支的推送)上,您可以使用:

git push -u origin mybranch

它告诉本地 git 将 mybranch推到 origin 还有,完成这一步后,将 origin/mybranch设置为 mybranch的跟踪分支。

请注意,这与运行 git branch --set-upstream-to是相同的: 运行 一次,然后在本地设置它,不需要再次运行。这只是更方便,因为您可以与在 origin上创建分支的 push一起执行此操作。但是你仍然必须记住这样做(一次; 当你运行 git push没有 -u origin mybranch时,你会得到提醒)。

一个可能的解决方案是将您的 git 推送行为修改为 current(注意,这也会有一些其他的影响)。您可以通过直接修改 ~/.gitconfig(作为一个文件,这里假设您是在 Linux 上)或者执行:

git config --global push.default current

现在,当您使用 push时,git 将自动将当前分支推送到使用 同一个名字的远程分支,即使您没有显式地指定它。此外,如果当前分支没有远程等价物,那么将创建一个远程分支,并将当前分支设置为跟踪它(与 git push -u origin new_branch相同,但只有一个 git push)。还可以看一下 这个问题,其中详细描述了 git 推送行为。

从 git 2.37.0开始,使用 git 配置就可以做到这一点。

运行以更新配置:

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

Then git push will automatically setup the remote branch.

注意: --global标志意味着这将适用于您机器上的所有 git 命令(不管是哪个回购) ,您可以省略该标志,使其特定于您机器上的单个回购。

文件:

Https://git-scm.com/docs/git-config#documentation/git-config.txt-pushautosetupremote

推送 autoSetupRemote

If set to "true" assume --set-upstream on default push when no upstream tracking exists for the current branch; this option takes effect with push.default options simple, upstream, and current. It is useful if by default you want new branches to be pushed to the default remote (like the behavior of push.default=current) and you also want the upstream tracking to be set. Workflows most likely to benefit from this option are simple central workflows where all branches are expected to have the same name on the remote.