问题描述
将master合并到功能分支时,我总是做过
git merge origin master
它一直运行良好。但是,我从外围了解到语法origin/master
也存在,用于指定要使用的遥控器(我认为)。但是,今天早上,我想要主版本的干净版本,所以我删除了本地副本,然后fetch
编辑了。现在,当我git merge origin master
收到消息
Did you mean this? origin/master
我需要正斜杠吗?为什么git现在需要这个?使用和不使用有什么区别?
解决方法
这些东西 非常混乱。如果同时编写了足够多的命令,Git可能会更加一致。事实并非如此-几年来,这些各种各样的操作组合在一起-并且向后兼容限制了Git作者。
让我们定义一些术语:
-
远程 是一个简短的名称,例如
origin
。这个简称的目的有几个方面:-
它存储一个URL,因此您不必继续键入它。 URL可能是
https://github.com/user/project.git
或ssh://[email protected]/user/project.git
或更长的名称,但是第一个远程名称几乎总是origin
,而且只有六个字母,因此输入起来容易得多。 -
它用作远程跟踪名称的前缀。
遥控器始终代表其他的Git 。另一个Git是完整的Git存储库(尽管通常是--bare
存储库,这意味着它没有工作树)。 -
-
分支名称是
master
或topic
或feature/short
之类的名称。分支名称受到一些限制-例如,它们可能不包含两个或多个相邻的点,因此hello.world
可以,但是well...yes
不能。 -
远程跟踪名称是类似于
origin/master
或origin/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
不会做任何事情。因此,此特定的“章鱼”合并会折叠成master
与origin/master
的常规合并,这是Git对其他Git master
的记忆。
通常,此处应明确使用git merge origin/master
,而不要依赖于origin/HEAD
到origin/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
这样的远程跟踪名称。现在他们做到了,我们所遇到的情况。