当我可以在“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”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Docker命令RUN无法使用git init --bare吗?
GitGit 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )
GitGit 基础命令 ( Git 版本库概念 | 创建版本库 git init | 克隆版本库 git clone )