“远程/功能”与“远程功能”有何不同?

问题描述

将master合并到功能分支时,我总是做过

git merge origin master

它一直运行良好。但是,我从外围了解到语法origin/master也存在,用于指​​定要使用的遥控器(我认为)。但是,今天早上,我想要主版本的干净版本,所以我删除了本地副本,然后fetch编辑了。现在,当我git merge origin master收到消息

Did you mean this?
  origin/master

我需要正斜杠吗?为什么git现在需要这个?使用和不使用有什么区别?

解决方法

这些东西 非常混乱。如果同时编写了足够多的命令,Git可能会更加一致。事实并非如此-几年来,这些各种各样的操作组合在一起-并且向后兼容限制了Git作者。

让我们定义一些术语:

  • 远程 是一个简短的名称,例如origin。这个简称的目的有几个方面:

    1. 它存储一个URL,因此您不必继续键入它。 URL可能是https://github.com/user/project.gitssh://[email protected]/user/project.git或更长的名称,但是第一个远程名称几乎总是origin,而且只有六个字母,因此输入起来容易得多。

    2. 它用作远程跟踪名称的前缀。


    遥控器始终代表其他的Git 。另一个Git是完整的Git存储库(尽管通常是--bare存储库,这意味着它没有工作树)。

  • 分支名称mastertopicfeature/short之类的名称。分支名称受到一些限制-例如,它们可能不包含两个或多个相邻的点,因此hello.world可以,但是well...yes不能。

  • 远程跟踪名称是类似于origin/masterorigin/topic的名称。它由两部分组成:一个远程名称(例如origin)和一个在其他Git上看到的分支名称。

当您的Git通过origin之类的远程名称调用另一个Git时,您的Git会将该Git列出所有分支名称。这些分支名称对应于该其他Git存储库中的特定提交。如果您还没有Git,您的Git将从这些Git中获取这些提交。然后,您的Git将通过创建或更新您的 远程跟踪名称来记住他们的 分支的名称。因此,如果他们的master代表提交a123456,那么您的origin/master现在也将更新为保留a123456

通常,Git可以将分支名称(如master或远程跟踪名称(如origin/master)转换为提交哈希ID。正在运行:

git rev-parse master
例如,

将向您显示您的master的Git的哈希ID。

运行git merge(这是一个早期命令,甚至比origin之类的远程名称都存在的时候),您需要赋予它的是一个或多个提交的名称。因此git merge origin/master就足够了,因为origin/master命名了一个特定的提交。如果您有一个名为git merge topic的分支,topic也就足够了,因为分支名称topic会命名一个特定的提交。

如果您给git merge两个或多个提交的名称,Git将(好,有时会)执行Git所谓的章鱼合并。例如:

git merge topic1 topic2 topic3

执行合并,将三个主题分支与您当前的分支(也许是master)结合起来。

如果您一直在跑步:

git checkout master
git merge origin master

您一直在要求Git做这些章鱼合并之一。您要合并的提交为origin

现在,origin本身不是远程跟踪名称。但是尝试运行:

git rev-parse origin

以及:

git rev-parse origin/master

几乎可以肯定地看到,两个命令都生成了 same 提交哈希ID。原因是名称origin本身在Git期望分支或远程跟踪名称的地方使用时,已扩展为读取origin/HEAD。然后,origin/HEAD也通常被扩展为origin/master。因此这意味着git merge origin/master master

同时,您已经{em master ,因此git merge master不会做任何事情。因此,此特定的“章鱼”合并会折叠成masterorigin/master的常规合并,这是Git对其他Git master的记忆。

通常,此处应明确使用git merge origin/master,而不要依赖于origin/HEADorigin/master的映射。此外,您可能希望使用另一种Git功能,称为分支名称的上游设置,以便您可以只运行git merge(根本没有任何额外的名称)。但这之所以有效,是因为origin在这里扩展为origin/HEAD,这意味着origin/master,并且您的章鱼合并请求最终变成了一个更普通的合并。

请注意,git pull命令有很大不同:这是为了方便。它首先运行git fetch,然后运行第二个Git命令。默认的第二个Git命令是git merge。当它执行git fetch步骤时,它需要一个 remote -一个类似origin的名称。因此,origin中的git pull origin master用于git fetch。然后,当执行第二步时,它需要知道您想要的分支的名称,就像在另一个Git上看到的一样。因此master中的git pull origin master表示 master,就像在origin 上看到的一样,您的Git记住,对于非{ {1}}个命令,例如origin/master

这就是所有这些混乱的源头:pull早于遥控器,而您曾经做过git merge之类的事情。在这里,很明显, git pull 部分是要到达其他Git,然后git pull url master就是他们的url。不存在像master这样的遥控器,因此也不存在像master这样的远程跟踪名称。现在他们做到了,我们所遇到的情况。