git中的pull和clone有什么区别?


237

(在mkdir repo和之后cd 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

我的意思是,显然一个人较短,但除此之外,他们基本上是在做同一件事吗?

Answers:


122

它们基本相同,只是clone将设置其他远程跟踪分支,而不仅仅是master。查看手册页

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


10
git fetch --all设置其他远程跟踪分支,因此基本上它们是相同的。
cmcculloh 2010年

251

git clone是如何获取现有存储库的本地副本。对于给定的存储库,它通常仅使用一次,除非您希望拥有多个工作副本。(或者想要弄乱本地副本后得到干净的副本...)

git pull(或git fetch+ git merge)是如何使用远程存储库中的新提交更新本地副本的方法。如果您正在与其他人协作,则该命令将使您经常运行。

如您的第一个示例所示,可以git clone使用各种其他git命令进行仿真,但实际上git pull做与“基本上相同”的情况git clone(反之亦然)。


4
git clone所执行的具体操作是由涉及“ git pull”的命令序列完成的吗?
cmcculloh

21
@cmcculloh:没什么-您描述的顺序可以有效完成“ git clone”的工作。关键是,“ git pull”用于完成除您所做的事情之外的各种事情-更不用说“ git pull”实际上就是“ git fetch; git merge <当前分支> <origin /当前分支>”。IOW,如果您真的愿意的话,您可以没有克隆生活。此外,您可以从克隆来源以外的其他资源中提取信息。我喜欢将“克隆”理解为“使我成为该存储库的本地副本”,而将“拉取”理解为“从某个特定的远程服务器获取更新”。
ebneter's


41

git clone 表示您正在系统中复制存储库。

git fork 表示您要将存储库复制到您的Github帐户。

git pull 表示您正在获取最后修改的存储库。

git push 表示修改后将返回存储库。

用外行的话来说:

git clone正在下载并且git pull令人耳目一新。


9

clone:将远程服务器存储库复制到本地计算机。

pull:获取其他已添加到本地计算机的新更改。

这是区别。

克隆通常用于获取远程回购副本。

如果您在团队中工作,Pull用于查看其他队友添加的代码。


5

git clone仅用于完全下载远程服务器存储库上当前正在运行的内容,并将其保存在放置该项目的计算机文件夹中。通常,只有在我们第一次上传项目时才使用它。在那之后拉是更好的选择。

git pull本质上是一个(克隆(下载)+合并)操作,通常在您进行团队合作时使用。换句话说,当您想要该项目中的最新更改时,可以拉动。


3

克隆小姐:我得到了一份新鲜的副本到本地。

Pull先生:我已经在本地拥有它,我只是对其进行更新。


克隆小姐:我可以做你想做的!你只是我的一部分。

拉先生:同上!


克隆小姐:不,您不创建。这是我的工作:

  1. 创建空的裸仓库
  2. 填充远程跟踪分支
  3. 运行不带参数的git fetch

您只执行#3,然后合并,而我不需要这样做(我是新鲜的)。

拉夫先生:聪明的裤子,没什么大不了的,我先做一个“ git init”!然后我们是一样的。另外,我在现有存储库上具有额外的“合并”功能!这使我成为Git中最常用的命令;)


Git的创造者:拉马先生,如果--bare或--mirror与clone或init一起使用,您的合并将不会发生。它仍然是只读的。


被低估的答案。
sinekonata

2

嗯,像拉克隆时一样,看到远程分支“ 4.2”时缺少什么?显然不完全相同。

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2

我也对此表示怀疑,并且我怀疑git默认值随时间的变化是问题所在。我在Windows上有1.9.5.msysgit,在Mac上有2.3.2-applegit-55。
AnneTheAgile 2015年

2

git clone URL --->完整的项目或资源库将作为单独的目录下载。而不只是更改git pull URL ---> fetch + merge->它只会获取已完成的更改,而不是整个项目


1

尽管该git fetch命令将提取服务器上尚未存在的所有更改,但它根本不会修改您的工作目录。它只会为您获取数据,并让您自己合并。但是,在大多数情况下,有一个称为的命令,该命令git pull实际上git fetch紧随其后git merge

阅读更多:https : //git-scm.com/book/zh/v2/Git-Branching-Remote-Branches#Pulling


1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
ekad '16

0

克隆 -:它将在本地计算机上创建与远程存储库项目完全相同的副本。

-:假设两个或两个以上的人共享同一个存储库。(假设另一个人的名字是Syam)(一个存储库是您的项目在Github中的位置)因此,如果Syam在其本地的同一项目中进行了一些更改并将其推送到远程存储库,那么无论Syam所做的更改如何,这些更改都会不在您当地反映。因此,要在本地反映这些新变化,您必须使用git pull。总的来说,我们使用git pull来更新项目。

因此,基本上我们只使用git clone一次,而我们多次使用git pull。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.