当我可以在“ git init”之后对“ git pull”执行相同操作时,为什么选择“ git clone”?

时间:2019-10-27 06:08:16

标签: git

我使用git init创建了一个git存储库,并使用git remote add origin https://remote-url添加了一个远程仓库URL

当我通过使用git pull origin master来跟踪远程分支来设置必要的上游分支之后执行git branch --set-upstream-to=origin/master master时(我的本地主分支被设置为在执行git checkout master之后跟踪远程主分支),我可以将远程项目分支的所有修订历史记录拉入本地存储库中。

如果我可以很好地使用git pull进行此操作,那么为什么 git 提供git clone作为单独的命令和替代方法?它是否有任何特殊目的,还是我独自一人git pull会错过任何事情?

1 个答案:

答案 0 :(得分:2)

这不是一个不合理的问题。但是这个也是:

您可以运行:

git write-tree
git commit-tree -p HEAD -m message <hash-from-git-write-tree>
git branch -f <current-branch> <hash-from-git-commit-tree>

这样做是一样的-嗯,如果没有错误,它也会这样做:

git commit -m message

那么为什么我们要使用git commit命令呢?

这是一个后续问题:哪个更易于使用?


git clone命令实际上等效于最多运行六个命令,其中五个是Git命令。 git clone涉及的六个步骤是:

  1. mkdir path,创建一个新的空目录,在其中运行git init。 (在特殊情况下,如果您为git clone提供现有但为空的目录的路径名,则跳过此步骤。)

  2. git init,以便在新目录中创建一个新的空存储库。

  3. git remote add remote url,其中 remote 来自您的git clone选项-o,或者来自您的origin不指定此选项,而 url 是您在clone命令中指定的选项。

  4. 提供给git config的选项中的所有其他git clone命令。

  5. git fetch remote,以通过提供的URL从Git获取提交。

  6. git checkout branch,其中 branch 是您在-b命令中使用git clone选项指定的一个,或者 other Git指定的分支(如果您未指定分支),或者master(如果另一个Git未指定任何分支)。

git clone命令还处理在此过程中可能发生的各种错误,否则您将不得不自行处理。


git pull命令等效于运行git fetch,然后再执行第二个Git命令。第二个命令通常是git merge,尽管您可以告诉Git改用git rebase。但是git pull还有另外一种特殊的模式:当您git pull进入一个完全空的存储库时,就像您在问题中所做的那样,它可以将git checkout作为第二个命令运行,而不是另一个命令两个。


注意:与git clone不同,在六个步骤之间 很少需要使用git pull me 在运行第二条命令之前,需要检查git fetch获得的提交。因此,我通常完全避免使用git pull,因为它迫使我选择第二个命令来运行,并在获取步骤完成后立即运行它,而在提取后我想做其他事情时,之前,我选择是使用合并还是重新设置基础,或者完全使用其他方式。