当我可以在“git init”之后对“git pull”做同样的事情时,为啥要“git clone”? [复制]

Posted

技术标签:

【中文标题】当我可以在“git init”之后对“git pull”做同样的事情时,为啥要“git clone”? [复制]【英文标题】:Why "git clone" when I can do the same with "git pull" after "git init"? [duplicate]当我可以在“git init”之后对“git pull”做同样的事情时,为什么要“git clone”? [复制] 【发布时间】:2020-02-22 21:32:59 【问题描述】:

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

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

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

【问题讨论】:

如果每次你想克隆时都要求这些体操,那将是相当敌对的。 【参考方案1】:

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

你可以运行:

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涉及的六个步骤是:

    mkdir <em>path</em>,创建一个新的空目录来运行git init。 (在特殊情况下跳过此步骤,在这种情况下,您为 git clone 提供现有但空目录的路径名,在这种情况下它会使用该路径名。)

    git init,在新目录中创建一个新的空仓库。

    git remote add <em>remote</em> <em>url</em>,其中 remote 来自您的 git clone 选项 -o,或者如果您未指定此选项,则为 origin,并且 url 是您在克隆命令中指定的那个。

    提供给git clone 的选项中的任何其他git config 命令。

    git fetch <em>remote</em>,在提供的 URL 处从 Git 获取提交。

    git checkout <em>branch</em>,其中 branch 是您在 git clone 命令中使用 -b 选项指定的那个,或者是由 other 指定的分支 如果您没有指定分支,则为 Git,如果另一个 Git 未指定任何分支,则为 master

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,因为它迫使我选择第二个命令来运行,并在获取步骤完成后立即运行它,当我想在获取之后做其他事情时,before 我选择是使用合并,还是变基,或者完全使用其他东西。

【讨论】:

以上是关于当我可以在“git init”之后对“git pull”做同样的事情时,为啥要“git clone”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

git init后添加远程仓库地址

Git init初始化本地仓库

git init与git init --bare

Docker命令RUN无法使用git init --bare吗?

GitGit 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )

GitGit 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )