为什么我要在命令行上为 `git pull` 指定一个分支?
Why should I specify a branch on the command line for `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.
如何绕过此错误消息?
您已经关闭了您的一个选项(即您拒绝设置上游),因此您别无选择:您必须指定分支。请注意,您可以编写自己的工具来执行此操作。
为什么会这样 的答案是复杂的,哲学的,并且取决于维护 Git 的人。不过,从根本上说,我们可以看看这些事实:
在Git中,push
动词不是pull
动词的反义词。就相反数而言,它们是 push
和 fetch
。 (pull
动词或多或少表示 "fetch, then merge-or-rebase"。)
虽然很接近,但 push
和 fetch
并不对称。当您使用 git fetch <em>remote</em>
时,您将来自另一个存储库的提交带入您的存储库,然后设置 remote -跟踪名称 以指向最尖端的此类提交。另一个存储库有一些分支集 B1...Bn,对于每个分支name,你的存储库现在有一个最新的 remote/B<sub>i</sub>
.
另一方面,由于您将 push.default
设置为 current
,当您使用 git push <em>remote</em>
,您的 Git 发送您当前分支 C 所需的任何提交,然后询问远程 remote
设置 its 分支 C 指向同一个提交。在 C 前面没有插入限定符,例如没有 eugen/
,以使其对 you 唯一; 你问他们的 Git直接设置他们的名字C。
即使您使用了其他一些推送设置,一般来说,您仍然会要求远程设置 他们自己的 分支。 fetch
命令的整个名称-space 专用于每个遥控器:您设置 您的 refs/remotes/<em>remote</em>/<em>renamed</em>
,不是你自己的refs/heads/<em>name</em>
。 push 命令让他们设置 refs/heads/<em>name</em>
.
这里有一个内置于 Git 的假设:从多个中获取,推送到一个。这个假设不一定成立,但可用的语法,远程跟踪名称space 系统就是为支持它而构建的。当您走出这个系统时,您必须使用稍微笨拙的语法。您可以选择如何处理(Git 有很多工具)。
如果您只从一个获取并推送到另一个,则根本不需要命名的遥控器(如果只有一个,为什么还要使用 origin
?)。 Git 甚至可以 假设 默认情况下,分支名称在获取和推送时始终相同,并且无需任何上游设置即可使获取和推送工作.当然,这会限制您从一推到一的获取。
如果Git 假定从许多系统中获取,推送到许多 系统,它可能有办法做你想做的事。但它没有(假设这个),所以它没有(有办法做你想做的事)。
我不想设置默认源服务器,也不想为分支设置上游。
对于 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.
如何绕过此错误消息?
您已经关闭了您的一个选项(即您拒绝设置上游),因此您别无选择:您必须指定分支。请注意,您可以编写自己的工具来执行此操作。
为什么会这样 的答案是复杂的,哲学的,并且取决于维护 Git 的人。不过,从根本上说,我们可以看看这些事实:
在Git中,
push
动词不是pull
动词的反义词。就相反数而言,它们是push
和fetch
。 (pull
动词或多或少表示 "fetch, then merge-or-rebase"。)虽然很接近,但
push
和fetch
并不对称。当您使用git fetch <em>remote</em>
时,您将来自另一个存储库的提交带入您的存储库,然后设置 remote -跟踪名称 以指向最尖端的此类提交。另一个存储库有一些分支集 B1...Bn,对于每个分支name,你的存储库现在有一个最新的remote/B<sub>i</sub>
.另一方面,由于您将
push.default
设置为current
,当您使用git push <em>remote</em>
,您的 Git 发送您当前分支 C 所需的任何提交,然后询问远程remote
设置 its 分支 C 指向同一个提交。在 C 前面没有插入限定符,例如没有eugen/
,以使其对 you 唯一; 你问他们的 Git直接设置他们的名字C。即使您使用了其他一些推送设置,一般来说,您仍然会要求远程设置 他们自己的 分支。
fetch
命令的整个名称-space 专用于每个遥控器:您设置 您的refs/remotes/<em>remote</em>/<em>renamed</em>
,不是你自己的refs/heads/<em>name</em>
。 push 命令让他们设置refs/heads/<em>name</em>
.
这里有一个内置于 Git 的假设:从多个中获取,推送到一个。这个假设不一定成立,但可用的语法,远程跟踪名称space 系统就是为支持它而构建的。当您走出这个系统时,您必须使用稍微笨拙的语法。您可以选择如何处理(Git 有很多工具)。
如果您只从一个获取并推送到另一个,则根本不需要命名的遥控器(如果只有一个,为什么还要使用 origin
?)。 Git 甚至可以 假设 默认情况下,分支名称在获取和推送时始终相同,并且无需任何上游设置即可使获取和推送工作.当然,这会限制您从一推到一的获取。
如果Git 假定从许多系统中获取,推送到许多 系统,它可能有办法做你想做的事。但它没有(假设这个),所以它没有(有办法做你想做的事)。