Git “远程/功能”与“远程功能”有何不同?
在将主功能合并到功能分支时,我总是这样做Git “远程/功能”与“远程功能”有何不同?,git,version-control,git-merge,Git,Version Control,Git Merge,在将主功能合并到功能分支时,我总是这样做 git merge origin master 它一直运作良好。但是,我外围意识到语法origin/master也存在,用于指定要使用的遥控器(我想)。但是今天早上,我想要一个干净版本的master,所以我删除了我的本地副本,然后fetched。现在当我执行git merge origin master时,我收到了消息 我需要正斜杠吗?为什么git现在需要这个?使用它和不使用它有什么区别?这些东西非常令人困惑。如果同时编写了足够多的命令,Git在这里可
git merge origin master
它一直运作良好。但是,我外围意识到语法origin/master
也存在,用于指定要使用的遥控器(我想)。但是今天早上,我想要一个干净版本的master,所以我删除了我的本地副本,然后fetch
ed。现在当我执行git merge origin master
时,我收到了消息
我需要正斜杠吗?为什么git现在需要这个?使用它和不使用它有什么区别?这些东西非常令人困惑。如果同时编写了足够多的命令,Git在这里可能会更加一致。它们不是——这些不同的操作是在几年的时间里组合在一起的,向后兼容性限制了Git作者
让我们定义一些术语:
- 遥控器是一个短名称,如
。这个简短名称的目的有好几个方面:origin
- 它存储一个URL,这样您就不必一直键入它。URL可能是
或https://github.com/user/project.git
或更长的名称,但第一个远程名称几乎总是ssh://git@github.com/user/project.git
,只有六个字母,因此更容易键入origin
- 它充当远程跟踪名称的前缀
遥控器总是表示其他Git。另一个Git是一个完整的Git存储库(尽管它通常是一个
--bare
存储库,这意味着它没有工作树)
master
或topic
或feature/short
或其他名称。分支名称上有一些限制,例如,它们可能不包含两个或多个相邻点,因此hello.world
可以,但嗯……是的
不行
origin/master
或origin/topic
。它由两部分组成:一个远程名称(如origin
)和另一个Git上的分支名称
origin
)调用另一个Git时,您的Git会列出它的所有分支名称。这些分支名称对应于另一个Git存储库中的特定提交。如果您还没有这些提交,Git将从该Git获得这些提交。然后,您的Git将通过创建或更新您的远程跟踪名称来记住他们的分支名称。因此,如果它们的master
表示提交a123456
,则您的源代码/master
现在也将更新为保持a123456
通常,Git可以将分支名称(如master
)或远程跟踪名称(如origin/master
)转换为提交哈希ID。运行:
git rev-parse master
例如,将向您显示Git现在对主机的哈希ID
当您运行git merge
-这是一个早期命令,甚至早于origin
等远程名称的存在-您需要给它的是一个或多个提交的名称。因此git merge origin/master
在这里就足够了,因为origin/master
指定了一个特定的提交<如果您有一个名为topic
的分支,那么code>git merge topic
也就足够了,因为您的分支名topic
指定了一个特定的提交
如果您给两个或多个提交的名称gitmerge
,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
您几乎可以肯定地看到,这两个命令都会生成相同的提交哈希ID。原因是当Git需要分支或远程跟踪名称时,名称origin
本身被扩展为读取origin/HEAD
。然后,origin/HEAD
也被展开,通常扩展到origin/master
。因此,这意味着git merge origin/master
同时,您已经有了自己的master
,因此git merge master
无论如何都不会做任何事情。因此,这个特定的“八达通”合并会折叠成您的主控
与您的源/主控
的常规合并,这是您的Git与其他Git的主控
的内存
一般来说,您应该在这里使用git merge origin/master
,这是明确的,不依赖于origin/HEAD
到origin/master
的映射。此外,您可能希望使用另一个Git特性,称为分支名称的上游设置,这样您就可以运行Git merge
(不需要任何额外的名称)。但是它一直在工作,因为这里的origin
被扩展为origin/HEAD
,意思是origin/master
,而你的八达通合并请求最终变成了一个更普通的合并
请注意,git pull
命令完全不同:它是为了方便起见。它首先运行git fetch
,然后运行第二个git命令。默认的第二个Git命令是gitmerge
。当它执行git fetch
步骤时,它需要一个远程名称,如origin
。因此,git pull origin master
中的origin
用于git fetch
。然后,当它执行第二步时,它需要知道您希望在另一个Git上看到的分支的名称。因此,master
在<
git rev-parse origin/master