我对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 merge
1这仍然会失败——但git pull
有一个特殊的情况。它会注意到初始git checkout
从未使用过,它不会运行正常的第二个命令,而是为您运行git checkout
!
所以,最后(还有一点额外的痛苦),你让Git运行所有正确的命令。不过,为了将来参考,请注意:
git clone https://git.xyz.com/myrepo/app.git new-clone
通常更易于使用。这为您运行六个命令,其中五个是Git命令:
mkdir
,创建一个新的空目录(然后输入一个内部cd
或chdir
来运行剩下的5个Git命令)git init
,在新目录中创建一个新的空存储库git remote add
,设置Git稍后将使用的远程,让您更轻松- 您在命令行上指定的任何额外的
git config
步骤(如果您没有指定任何步骤,则此处实际不使用任何步骤,但如果您列出了它们,则了解它们将在何时运行是很有用的) git fetch
;以及- CCD_ 26
请注意,步骤1中创建的目录的名称是URL后面的参数。如果您不给出这样的参数,git clone
将根据您与git clone
一起使用的URL来计算目录名。您提供的URL将在git remote add
中的步骤3中使用。在步骤3和5中,远程的名称为origin
2要在步骤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专家的原因:如果你没有远程,你就不会得到远程跟踪名称!