Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git “远程/功能”与“远程功能”有何不同?_Git_Version Control_Git Merge - Fatal编程技术网

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上的分支名称

当您的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