当我可以在"git init"之后对"git pull"做同样的事情时,为什么要"git clone"?



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

当我在使用git branch --set-upstream-to=origin/master master跟踪远程分支设置必要的上游分支后执行git pull origin master时(我的本地主分支在执行git checkout master后被设置为跟踪远程主分支(,我能够将远程项目分支的所有修订历史记录拉入本地repo。

如果我可以用git pull很好地做到这一点,那么git为什么提供git clone作为一个单独的命令和替代方案?它有什么特殊的用途吗?或者我一个人做git pull会错过什么吗?

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

您可以运行:

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. mkdirpath,以创建一个新的空目录来运行git init。(在特殊情况下,将现有但为空的目录的路径名赋予git clone,在这种情况下,它将使用该路径名,则跳过此步骤。(

  2. 以在新目录中创建新的空存储库。

  3. git remote addremoteurl,其中remote来自git clone选项-o,如果未指定此选项,则为origin,而url是您在clone命令中指定的。

  4. 提供给git clone的选项中的任何附加git config命令。

  5. git fetchremote,以在所提供的URL处从Git获得提交。

  6. git checkoutbranch,其中branch是您在git clone命令中使用-b选项指定的分支,如果您没有指定分支,则是由其他Git指定的分支;如果其他Git没有指定任何分支,则为master

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


git pull命令相当于运行git fetch,然后运行第二个Git命令。第二个命令通常是git merge,不过您可以告诉Git使用git rebase。但git pull还有一种特殊的模式:当您将git pull放入一个完全空的存储库时,就像您在问题中所做的那样,它可以将git checkout作为第二个命令运行,而不是其他两个命令中的任何一个。


注意:与git clone不同,CCD_38在六个步骤之间很少需要任何,对于git pullme在运行第二个命令之前需要检查git fetch获得的提交是很常见的。因此,我通常完全避免git pull,因为它迫使我选择要运行的第二个命令,并在完成提取步骤后立即运行它,当我想在提取之后、之前执行其他操作时,我选择是使用merge、rebase还是完全使用其他操作。

最新更新