首页 > 解决方案 > 为什么要在命令行上为 `git pull` 指定一个分支?

问题描述

我不想设置默认源服务器,也不想为分支设置上游。

对于push我配置push.default=current为能够运行的命令:

git push origin

我也希望能够运行:

git pull origin

但得到错误:

You asked to pull from the remote 'origin', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.

如何绕过此错误消息?

标签: gitgit-config

解决方案


您已经关闭了一个选项(即,您拒绝设置上游),因此您别无选择:您必须指定分支。请注意,您可以编写自己的工具来执行此操作。

为何会出现这种情况的答案是复杂的、哲学的,取决于维护 Git 的人。不过,从根本上说,我们可以看看这些事实:

  • 在 Git 中,push动词不是动词的反义词pull。就对立面而言,它们是pushfetch。(pull动词的意思是“获取,然后合并或变基”,或多或少。)

  • 尽可能接近,push并且fetch不对称。当您使用时,您将来自另一个存储库的提交带入您的存储库,然后设置远程跟踪名称以指向最尖端的此类提交。另一个存储库有一些分支B 1 ...B n,对于每个这样的名称,您的存储库现在都有一个 up-to-date 。git fetch remoteremote/Bi

    另一方面,由于您将您设置push.defaultcurrent,当您使用 时,您的 Git 会为您当前的分支C发送任何所需的提交,然后要求远程将分支C设置为指向同一个提交。在C前面没有插入限定符,例如,使它对你来说是唯一的;你让他们的 Git直接设置他们的名字C。git push remoteremoteeugen/

    即使您使用了其他推送设置,通常您仍然会要求遥控器设置自己的分支。该fetch命令将整个名称空间专用于每个遥控器:您设置的是您的 ,而不是您自己的。push 命令让他们设置他们的.refs/remotes/remote/renamedrefs/heads/namerefs/heads/name

这里有一个内置于 Git 的假设:从多个中获取,推送到一个。 这个假设不一定成立,但可用的语法和远程跟踪命名空间系统是为了支持它而构建的。当你跳出这个系统时,你必须使用一种稍微笨拙的语法。如何处理是你的选择(Git 有很多工具)。

如果您只从一个获取并推送到一个,那么您根本不需要命名遥控器(origin如果只有一个,为什么还要打扰?)。Git 甚至可以默认假设分支名称在 fetch-from 和 push-to 上总是相同的,并且在不需要任何上游设置的情况下使 fetch 和 push 工作。当然,这将限制您从一推到一获取。

如果 Git 假设从多个系统中获取,推送到多个系统,它可能有办法做你想做的事。但它没有(假设这一点),所以它没有(有办法做你想做的事)。


推荐阅读