为什么要在命令行中为“git pull”指定分支?

为什么要在命令行中为“git pull”指定分支?,git,git-config,Git,Git Config,我不想设置默认的源服务器,也不想为分支设置上游 对于push命令,我已将push.default=current配置为可以运行: git push origin git pull origin 我还希望能够运行: 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 d

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

对于
push
命令,我已将
push.default=current
配置为可以运行:

git push origin
git pull origin
我还希望能够运行:

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
    或多或少的意思是“获取、合并或重定基”。)

  • 尽可能靠近,
    push
    fetch
    是不对称的。当您使用
    git fetch remote
    时,您会将来自另一个存储库的提交带到您的存储库中,然后设置远程跟踪名称以指向此类提交的提示。另一个存储库有一些分支B1…Bn,对于每个这样的名称,您的存储库现在都有一个最新的
    remote/Bi

    另一方面,由于您将
    push.default
    设置为
    current
    ,因此当您使用
    git push remote
    时,您的git会为当前分支C发送任何所需的提交,然后要求remote
    remote
    将其分支C设置为指向该提交。C前面没有插入限定符,例如,没有
    eugen/
    使它对您来说是唯一的;您要求他们的Git直接设置他们的名字C

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

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

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


若Git假设从多个系统获取数据,推送到多个系统,那个么它可能有一种方法来完成您想要的任务。但是它没有(假设是这样),所以它没有(有一种方法来做你想做的事情)。

你关闭了你的一个选项(即,你拒绝设置上游),所以你没有选择:你必须指定分支。请注意,您可以编写自己的工具来实现这一点

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

  • 在Git中,
    push
    动词不是
    pull
    动词的对立面。就对立而言,它们是
    push
    fetch
    。(动词
    pull
    或多或少的意思是“获取、合并或重定基”。)

  • 尽可能靠近,
    push
    fetch
    是不对称的。当您使用
    git fetch remote
    时,您会将来自另一个存储库的提交带到您的存储库中,然后设置远程跟踪名称以指向此类提交的提示。另一个存储库有一些分支B1…Bn,对于每个这样的名称,您的存储库现在都有一个最新的
    remote/Bi

    另一方面,由于您将
    push.default
    设置为
    current
    ,因此当您使用
    git push remote
    时,您的git会为当前分支C发送任何所需的提交,然后要求remote
    remote
    将其分支C设置为指向该提交。C前面没有插入限定符,例如,没有
    eugen/
    使它对您来说是唯一的;您要求他们的Git直接设置他们的名字C

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

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

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

若Git假设从多个系统获取数据,推送到多个系统,那个么它可能有一种方法来完成您想要的任务。但是它没有(假设这个),所以它没有