跳转至

2.克隆一个Repo

上一章给你上了一堂Git的基础速成课,让你开始使用Git的基本机制:克隆一个repo,创建分支,切换到分支,提交你的修改,把这些修改推送回远程,在GitHub上打开一个拉取请求,让你的修改被审核。

这说明了Git的方面,但是,如果你用Git工作过一段时间(或者根本没有用过Git),你会知道方面是不够的。了解Git的"为什么"是很重要的,这样不仅可以更好地理解引擎盖下发生的事情,还可以了解当你的仓库进入一个奇怪的状态时,如何解决这些问题。

所以,首先,你将从Git最基本的方面开始:通过cloning将仓库复制到你的本地系统。

什么是克隆?

克隆就是它听起来的样子:创建一个仓库的副本,或者说克隆。Git仓库没有什么特别之处;它只是一个包含代码、文本或其他资产的目录,可以追踪自己的历史。然后在这个目录前面有一个安全的文件传输魔法,让你同步更改。就是这样。

Git仓库通过一个隐藏的.git目录来追踪仓库内所有变化的历史,你通常不必去管它--它只是静静地追踪仓库内发生的一切。在本书的后面,你会了解更多关于隐藏的.git目录的结构和功能。

因此,由于Git仓库只是一个特殊的目录,理论上,你可以通过压缩朋友或同事工作站上的仓库中的所有文件,然后用电子邮件发送给自己,来实现一个相当便宜和肮脏的克隆操作。当你解压缩文件的内容时,你的电脑上就会有一个版本库的精确拷贝。

然而,用电子邮件发送东西可能(而且确实)会变得很混乱。相反,许多组织利用在线资源库主机,如GitHubGitLabBitBucket或其他。有些组织甚至选择自我托管仓库,但这已经超出了本书的范围。现在,你将坚持使用在线主机--在这个例子中是GitHub

使用GitHub

GitHub,从最基本的层面来看,其实只是一个大型的云端仓库解决方案,其中夹杂着账户和访问管理以及一些协作工具。但你不需要了解GitHub的所有功能,就可以开始使用托管在GitHub上的仓库,正如前一章的Git速成课程所展示的。

从在线仓库克隆是一个相当简单的操作。要开始使用,你只需具备以下条件:

  • 在你的本地系统上安装一个可以工作的Git
  • 你想克隆的仓库的远程URL
  • 在线主机的任何凭证。

Note

一般来说,不使用证书也可以克隆存储库,但你将无法将你在本地副本上所做的修改传播到在线主机上。

GitHub仓库的主页

GitHub上已经建立了一个供你克隆的仓库,所以你首先需要获得该仓库的远程URL

要开始,请浏览https://github.com/raywenderlich/ideas,用你的GitHub用户名和密码登录。如果你还没有建立一个账户,现在就可以了。

img

一旦你到了版本库的主页,看看页面上列出的文件和目录列表。这些列表和目录代表版本库的内容,它们是你要克隆到本地系统的文件。

但你从哪里找到仓库的远程URL来克隆它呢?就像Git中的许多事情一样(以及一般的计算机),克隆一个仓库有多种方法。在本章中,你将使用最简单和最常见的克隆方法,它从GitHub仓库主页开始。

找到仓库的克隆URL

在仓库主页上寻找并点击 Code 按钮。

img

弹出的小对话框给了你几个选项,让你把版本库克隆到你的本地系统:

img

  1. 这是版本库的主HTTPS URL。这是你在本章中使用的URL,用于从命令行git客户端克隆。
  2. 你也可以使用SSH来克隆版本库。点击这个链接可以让你在使用SSHHTTPS之间进行切换,以使用版本库。
  3. 如果你安装了GitHub桌面应用程序,你可以使用Open in Desktop按钮来启动GitHub桌面并一步到位地克隆该仓库。
  4. 如果你只想得到一份仓库中的压缩拷贝(但不是仓库本身的全部内容),Download ZIP按钮会让你做到这一点。

现在,通过URL右边的小剪贴板图标按钮,复制你在对话框中看到的HTTPS URL。这将在你的剪贴板上复制HTTPS URL,这样你就可以在以后的命令行中粘贴它。

在命令行上克隆

现在,转到你的命令提示符。切换到一个合适的目录,你想把你的仓库放在那里。在本例中,我将在我的主目录下创建一个名为GitApprentice的目录,我想把本书的所有版本存放在这里。

执行下面的命令来创建这个新目录:

mkdir GitApprentice

现在,执行下面的命令,看看目录中的文件清单(你的文件将与下面显示的不同)。

ls

我看到我的系统上有以下目录,还有我的新GitApprentice目录:

~ $ ls
Applications        Downloads       Music
Dropbox             Pictures        Library
Public              Desktop         GitApprentice
Documents           Movies

执行下面的命令,导航到新的目录:

cd GitApprentice

现在你已经准备好使用命令行来克隆版本库了。

输入以下命令,但先不要按Enter键或Return键:

git clone

现在,按Space bar添加一个空格字符,并粘贴你先前复制的URL,所以你的命令看起来如下:

git clone https://github.com/raywenderlich/ideas.git

现在,你可以按EnterReturn来执行命令。

你会看到下面关于Git正在做什么的简短总结:

~/GitApprentice $ git clone https://github.com/raywenderlich/ideas.git
Cloning into 'ideas'...
remote: Enumerating objects: 52, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 52 (delta 0), reused 2 (delta 0), pack-reused 49
Receiving objects: 100% (52/52), 6.26 KiB | 173.00 KiB/s, done.
Resolving deltas: 100% (22/22), done.

执行ls命令,查看你的GitApprentice目录的新内容:

~/GitApprentice $ ls
ideas

使用cd命令,然后是ls命令,导航到新的ideas目录,看看里面有什么:

~/GitApprentice $ cd ideas
~/GitApprentice/ideas $ ls
LICENSE     README.md   articles    books       videos

这就是存储库的内容。好吧,至少是可见的内容。再次运行ls命令,使用a选项,显示前面讨论的隐藏的.git目录:

~/GitApprentice/ideas $ ls -a
.       .git        README.md   books
..      LICENSE     articles    videos

啊哈--这就是那个神奇的.git隐藏目录。来看看里面有什么吧。

探索.git目录

使用cd命令导航到.git目录:

cd .git

再次执行ls命令,看看这个目录里有什么黑魔法。这一次,使用-F选项,这样你就可以知道哪些实体是文件,哪些是目录:

ls -F

你会看到以下内容:

~/GitApprentice/ideas/.git $ ls -F
HEAD        config      hooks/      info/       objects/    refs/
branches/   description index       logs/       packed-refs

所以我承认,这并不是什么黑暗艺术。但这里的是一些重要的文件和目录,它们跟踪和控制着你本地Git仓库的各个方面。在这一点上,大部分内容可能对你来说没有什么意义,这很好。随着本书的深入,你会了解到这些东西的作用。

不过现在,让一切保持原样;很少有理由在版本库的这一层工作。几乎所有你做的事情都应该发生在你的工作目录中,而不是在.git子文件夹中。

所以,用cd命令回溯到你的版本库的工作目录一级:

cd ..

你现在回到了相对安全的版本库的顶层。现在,只要知道.git目录在哪里就够了,而且你现在真的没有理由去处理那里的任何东西。

分叉

你成功地克隆了ideas仓库,但是尽管ideas是一个公共仓库,ideas仓库目前属于raywenderlich组织。由于你不是raywenderlich组织的成员,ideas 仓库的访问控制设置意味着你无法将任何本地修改推送回服务器。遗憾的是。

但对于大多数公共资源库,如ideas,你可以在服务器上的个人用户空间创建一个资源库的远程拷贝。你或你授权的任何人都可以在本地克隆该副本,进行修改并将这些修改推送到服务器上的远程副本。创建一个版本库的远程克隆被称为forking

首先,你需要把你的机器从现有的本地克隆的ideas版本库中删除。在目前的状态下,它对你来说没有什么用处,所以把它处理掉就可以了。

首先,从你的工作目录往上走一级,执行下面的命令:

cd ..

你应该回到主GitApprentice目录:

~/GitApprentice $

现在,用rm命令摆脱本地克隆,并使用-rf选项来递归删除所有子目录和文件,并强制删除所有文件:

rm -rf ideas

执行ls以确定该目录已经消失:

~/GitApprentice $ ls
~/GitApprentice $

看起来不错。你已经准备好创建raywenderlich ideas仓库的分叉了......这让你看到了本章的挑战!

挑战

挑战:在GitHub上分叉并创建本地克隆

这个挑战的目标有两个:

  1. 在你自己的用户账户下,在GitHub上创建一个ideas仓库的分叉。
  2. 将分叉的仓库克隆到你的本地系统。

导航到https://github.com/raywenderlich/ideas ideas仓库的主页。在页面的右上角,你会看到Fork按钮。这是你的起点。

img

这一挑战的步骤是:

  1. 在你的个人用户账户下分叉ideas资源库。
  2. 找到你新分叉的版本库的克隆URL
  3. 克隆分叉的ideas版本库到你的本地系统。
  4. 验证本地克隆是否成功创建。
  5. 奖励:证明你克隆的是分叉的版本库,而不是原始版本库。

如果你被卡住了,你可以在本书下载的资料中的本章projects/challenge文件夹下找到这个挑战的解决方案。

关键点

  • Cloning创建一个远程Git仓库的本地副本。
  • 使用git clone和远程仓库的克隆URL来创建一个仓库的本地拷贝。
  • 克隆一个仓库会自动创建一个隐藏的.git目录,追踪本地仓库的活动。
  • Forking在你的个人用户空间下创建一个版本库的远程拷贝。

接下来去哪里?

一旦你成功地完成了本章的挑战,就可以进入下一章,在那里你将学习到statusdiffaddcommit命令。你还会学到一些关于Git是如何跟踪你在本地仓库所做的修改的。