Git中pull和clone有什么区别?

330

在执行mkdir repocd repo之后,两者之间有何不同:

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

git clone git://github.com/cmcculloh/repo.git

我的意思是,显然一个更短,但除此之外它们基本上做的是同样的事情吗?


2
“git pull” 是最无用的 Git 命令。每个人都在使用它,但却不理解它的作用以及为什么很多时候使用它是错误的。 - axiac
3
“git pull” 是无用的这种说法并不正确。只需查看顶部答案即可知道,它会获取其他用户所做的更改,这是开始将现有本地更改与远程更改合并的唯一方法。在我看来,如果你想要进行协作工作,最好从使用 “pull” 命令开始,而不是使用 “clone”。 - alchemy
12个回答

317

git clone 是获取现有仓库的本地副本以供开发使用的方式。通常情况下,除非希望在不同位置拥有多个工作副本或在本地副本出现问题后需要获取干净的副本,否则只会使用一次。

git pull (或 git fetch + git merge) 是从远程仓库获取新提交并将其更新到本地副本的方式。如果你与他人协作开发,则经常需要运行此命令。

正如第一个示例所示,在其他各种 git 命令的帮助下模拟 git clone 是可能的,但实际上 git pull 并不是在 "基本上做着与 git clone 相同的事情"(反之亦然)。


12
"git clone" 和包含 "git pull" 的命令序列之间有何具体差别? - cmcculloh
35
@cmcculloh:你描述的操作序列实际上已经完成了 "git clone" 的功能。重点是,“git pull” 用于完成许多其他任务--更不用说“git pull”实际上正是“git fetch; git merge <current branch> <origin/current branch>”的组合。换句话说,如果你真的想要,你可以在没有克隆和拉取的情况下生存下来。此外,你可以从其他不同于你克隆的仓库中拉取。我认为 'clone' 的意思是“给我复制一份本地版本库”,而 'pull' 的意思是“获取特定远程仓库的更新”。 - ebneter
git clone需要在repo级别上进行git init,并在本地repo中创建一个额外的repo文件夹层。个人认为在repo级别上不需要.git文件,也不需要额外的repo文件夹层。在我看来,git pull是创建新本地repo的更优雅的方法。在项目文件夹中进行git init,不会创建额外的repo文件夹。这是基于我的有限技术经验。我可能是错的。 - OLe3446

164

通俗易懂的语言可以这样说:

  • 克隆:获取远程存储库的工作副本。
  • 拉取:我正在进行工作,请获取其他人可能更新的新更改。

3
我认为你的“拉取(Pull)”定义也同样适用于“克隆(Clone)”。 - henrywright
14
你如何处理还未克隆的项目? - Jyoti Prakash
我不明白你的意思? - henrywright
1
@henrywright 希望,ebneter的回答能够解决你的问题。 - Mrk
“clone” 会覆盖我的本地副本吗? - F. Kam
2
@F.Kam 'clone' 只在第一次使用时用于获取存储库的新副本。 - Jyoti Prakash

147

它们基本相同,除了克隆将设置额外的远程跟踪分支,而不仅仅是主分支。请查看手册页

将存储库克隆到新创建的目录中,为克隆存储库中的每个分支创建远程跟踪分支(可以使用git branch -r查看),并创建和检出一个初始分支,该分支从克隆存储库的当前活动分支派生。


12
git fetch --all 会设置额外的远程跟踪分支,因此它们基本上是相同的。 - cmcculloh
2
你可以在 clone 命令中使用 --single-branch 参数。 - dain

87

git clone 的意思是在你的系统中复制存储库。

git fork 的意思是将存储库复制到您的 Github 帐户。

git pull 的意思是获取最新修改的存储库。

git push 的意思是在修改后返回存储库。

通俗易懂地说:

git clone 是下载,git pull 是刷新。


38
Miss Clone: 我把一个新的副本复制到本地。
Mr Pull: 我已经有了本地的副本,我只是更新一下。

克隆小姐:我能做你所做的!你只是我的子集。

普尔先生:同样!


Miss Clone: 不,你不需要创建。这是我的工作:
  1. 在本地计算机上创建空的裸库。
  2. 填充远程跟踪分支(将存储库中的所有分支下载到本地计算机)。
  3. 运行无参数的 git fetch 命令。
你只需要做第三步,然后进行合并(fetch + merge),而这一步我不需要做。我的状态是全新的……哥们!
Mr Pull: 聪明鬼,没问题,我会先执行 "git init"!然后我们就一样了。

克隆小姐: 不,亲爱的,你不需要一个“已检出的分支”...即 git checkout吗?谁来做呢?当然是我!

拉取先生:哦对了...我需要一个已检出的本地分支来操作。但等等..你默认检出 master 分支。有人在 master 分支上工作吗?没有!你正在交付一个可能从未使用的功能!我让用户决定最好的分支去检出,这就是我的方式!


Git的创造者们:慢下来,Pull先生,如果在克隆或初始化时使用--bare或--mirror参数,你的合并将不会发生。它将保持只读状态。至于你,Clone小姐,可以用git fetch <remote> <srcBranch>:<destBranch>替代git checkout,除非你想在fetch中使用-s <strategy>,这是pull中缺少的。
Miss Clone: 说到“主”分支的问题,我会自动设置我的本地主分支来跟踪远程主分支。你的命令让开发者困惑不解!
Mr Pull向朋友们挥手,然后走开了...脸微微泛红...
Miss Clone: 是的,你可以走开,但是你依赖于git checkout来进行远程跟踪。当没有跟踪时,pull不会从“远程”获取更改!而且当开发者尝试push时,他们会遇到合并问题!我不依赖别人来做我的工作。我是一个独行侠!
Git的创建者们:是的,这确实有点棘手,特别是当checkout决定远程跟踪时。但是当你执行git statusgit branch -vv时,它会显示你是否正在跟踪任何远程分支。基于此,你可以决定是否强制进行远程跟踪。这真的不是Pull先生的错。建议开发人员更多地了解 git checkout以及跟踪origin的命令
克隆小姐:不知怎么的,我已经觉得自己是个赢家了,但还是让我补充一下:我的命令适用于仓库中的所有分支。你是那种心胸开阔的Pull先生吗?
拉取先生:当涉及从仓库中获取所有分支名称(只是“名称”)时,我是心胸开阔的。因为我不喜欢将不必要的分支和GB拉到我的硬盘上(有时他们只是为了获取最新的分支名称而进行“拉取”)。但合并只会发生在当前选中的分支上。独特性就是名字!
Git创作者们:干得好!只有一个补充:如果需要,克隆小姐可以被限制在只有一个分支上:git clone --single-branch --branch <branch name> <url>

8
被低估的答案。 - sinekonata
2
喜欢那种对话式的风格! - Shariq Hasan Khan
1
真棒的@蓝色云彩。 - insoftservice
1
你有博客吗? :) - Kid
1
@Kid 我在博客中用故事的方式解释了数字证书,希望你喜欢:http://the-blueclouds.blogspot.com/2011/11/public-key-private-key-hashing-blah.html - Blue Clouds
1
在ChatGPT出现之前 - user13267

13

克隆: 将远程服务器的代码库复制到本地机器。

拉取: 获取其他人在本地机器上添加的新更改。

这就是区别。

克隆通常用于获取远程代码库副本。

如果您正在团队中工作,可以使用拉取查看其他团队成员添加的代码。


5

git clone 用于从远程服务器仓库下载当前正在工作的内容,并将其保存在您机器上项目所在的文件夹中。通常只有在第一次上传项目时才使用它。之后,pull 是更好的选择。

git pull 基本上是一个(clone(下载)+ merge(合并))操作,主要用于团队协作。换句话说,当您想要该项目中的最新更改时,可以进行 pull 操作。


3
虽然git fetch命令会将您尚未拥有的服务器上的所有更改获取下来,但它不会修改您的工作目录。它只是为您获取数据并让您自己合并。但是,有一个命令叫做git pull,在大多数情况下它实质上是一个git fetch紧接着一个git merge
阅读更多: https://git-scm.com/book/zh/v2/Git-分支-远程分支#_拉取

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - ekad

3

git clone <remote-url> <=>

  • 创建一个新目录
  • git init // 初始化一个新的仓库
  • git remote add origin <remote-url> // 添加远程仓库
  • git fetch // 获取所有远程分支
  • git switch <default_branch> // 切换到默认分支

git pull <=>

  • 获取所有远程分支
  • 将当前本地分支与其追踪的远程分支合并(如果本地分支存在)

git pull <remote> <branch> <=>

  • 获取远程分支
  • 将当前本地分支与其对应的远程分支合并(如果本地分支存在)

3
克隆:它会在你的本地机器上创建一个与远程仓库项目完全重复的副本。 拉取:假设两个或多个人共享同一个存储库。 (假设另一个人的名字是 Syam) (存储库是 Github 中项目所在的位置)。 所以如果 Syam 在他的本地对同一项目进行了一些更改并将其推送到远程存储库,那么 Syam 所做的任何更改都不会反映在您的本地。 所以要在本地反映这些新更改,您必须使用 git pull。总体上,我们使用 git pull 来更新项目。
因此,我们基本上只使用 git clone 一次,而我们使用 git pull 多次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接