git获取一个全新的本地存储库



我对git有点困惑。我按照的顺序使用了以下命令

git init
git fetch https://git.xyz.com/myrepo/app.git

此时,本地计算机上没有分支,也没有文件。所以,我的问题是,init之后的fetch有什么意义?此时,我如何下载文件?我使用

git remote add origin https://git.xyz.com/myrepo/app.git
git merge
fatal: No remote for the current branch.

我无法使用创建分支

git checkout master

最后,我使用

git pull

以下载实际文件。我试图获取和合并,而不是根据手册直接拉。那么我错在哪里了?为什么提取/合并不起作用?clone替代方案有效,但我想尝试Fetch/Merge。

假设您从一个空目录开始,那么:

git init

创建一个新的空存储库,您的第二步

git fetch https://git.xyz.com/myrepo/app.git

现在已经完成了git clone命令的大部分工作。然而,您忽略了两个关键步骤。第一个应该在运行git fetch之前完成,不过您可以在之后重新运行git fetch

  • git remote add,这将为URLhttps://git.xyz.com/myrepo/app.git提供一个名称。这一步在技术上没有必要:如果你是Git专家,你可以在没有这个名字的情况下做你需要做的一切。但是,如果你不是Git专家,你就会让自己头疼。

    要修复此部分,您需要运行:

    git remote add origin https://git.xyz.com/myrepo/app.git
    

    然后运行:

    git fetch origin
    
  • 您缺少的最后一个步骤是git checkout

    因为您省略了git remote add步骤,所以现在实际执行签出是很棘手的。

以下是您实际所做的:

git remote add origin https://git.xyz.com/myrepo/app.git

这很好:它正是您需要运行的。

git merge

正如您所看到的,这失败了,部分原因是您尚未重复git fetch步骤,但更重要的是,因为您尚未运行git checkout

git pull

这将运行git fetch,然后运行第二个Git命令。这样就处理了缺失的git fetch步骤。

有趣的是,在这个git fetch步骤之后,git pull第二个Git命令通常是git merge1这仍然会失败——但git pull有一个特殊的情况。它会注意到初始git checkout从未使用过,它不会运行正常的第二个命令,而是为您运行git checkout

所以,最后(还有一点额外的痛苦),你让Git运行所有正确的命令。不过,为了将来参考,请注意:

git clone https://git.xyz.com/myrepo/app.git new-clone

通常更易于使用。这为您运行六个命令,其中五个是Git命令:

  1. mkdir,创建一个新的空目录(然后输入一个内部cdchdir来运行剩下的5个Git命令)
  2. git init,在新目录中创建一个新的空存储库
  3. git remote add,设置Git稍后将使用的远程,让您更轻松
  4. 您在命令行上指定的任何额外的git config步骤(如果您没有指定任何步骤,则此处实际不使用任何步骤,但如果您列出了它们,则了解它们将在何时运行是很有用的)
  5. git fetch;以及
  6. CCD_ 26

请注意,步骤1中创建的目录的名称是URL后面的参数。如果您不给出这样的参数,git clone将根据您与git clone一起使用的URL来计算目录名。您提供的URL将在git remote add中的步骤3中使用。在步骤3和5中,远程的名称为origin2要在步骤6中创建的分支的名称由Git在您提供的URL处提供3


1您可以使用配置信息或命令行标志来更改它。

2您可以使用-o选项进行更改,或者在即将发布的Git版本中,使用配置信息进行更改。

3您可以使用-b选项对此进行更改。请注意,当它是分支名称时,就像通常的情况一样,这确实会在您自己的存储库中创建分支:

  • fetch步骤(步骤5)从源Git复制所有提交,但不复制任何分支名称。相反,它根据每个分支名称创建远程跟踪名称。一旦你有了自己的Git存储库,你就可以创建你想要的任何分支名称:-b选项可以让你选择一个,而不是接受另一个Git的建议,或者,如果你愿意,你可以使用-n选项来阻止git clone完全执行第6步。

  • CCD_ 37步骤使用CCD_;DWIM模式";创建分支(尽管git clone有点作弊,而且在内部确实作弊——这取决于fetch代码被构建到与git clone相同的二进制文件中)。

通过";DWIM模式";有点复杂,并且依赖于那些远程跟踪名称。这是为了让使用Git变得更容易,对于标准的git clone来说,它实际上成功地实现了这个目标,但这肯定很复杂。这也是为什么如果你不使用git remote add,你需要成为Git专家的原因:如果你没有远程,你就不会得到远程跟踪名称!