Git已经成为程序员必备技能之一,而GitHub作为流行的Git仓库托管平台,不仅提供Git仓库托管,还是一个非常优秀的技术人员社交平台,技术人员可以通过开源的项目进行协作、交流,是现在优秀的工程师必须娴熟运用的方法。
本节从GitHub的历史入手,介绍Git安装、创建仓库、Fork、社会化、命令行开发,到最后的图形化工具的使用。让读者不仅掌握GitHub命令行使用方法,也学会图形化使用方法。
Git是一个优秀的分布版本控制系统。版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态)。另一个状态可以是不同的文件,也可以是不同的文件内容。在一个分布版本控制系统中,每个用户都有一份完整的源代码(包括源代码所有的历史记录信息),可以对这个本地的数据进行操作。分布版本控制系统不需要一个集中式的代码仓库。
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名GitHub。
GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过百万,托管版本数量也非常多,其中不乏知名开源项目Ruby on Rails、jQuery等。
GitHub之所以如此受欢迎,它的优势是不容忽视的。
(1)GitHub只支持Git格式的版本库托管,而不像其他开源项目托管平台还对CVS、SVN、Hg等格式的版本库进行托管。GitHub 的哲学很简单,既然 Git 是最好的版本控制系统之一(对于很多喜欢Git和GitHub的人没有之一),没有必要为兼顾其他版本控制系统而牺牲Git某些独有特性。因此没有支持其他版本控制系统的历史负担,是GitHub成功的要素之一。
(2)GitHub对Git版本库提供了完整的协议支持,支持HTTP智能协议、Git-daemon、SSH协议。
(3)GitHub 提供在线编辑文件的功能,不熟悉 Git 的用户也可以直接通过浏览器修改版本库里的文件。
(4)将社交网络引入项目托管平台是GitHub的创举。用户可以关注项目、关注其他用户进而了解项目和开发者动态。
(5)项目的Fork和Pull Request构成GitHub最独具一格的工作模式。对提交代码的逐行评注及Pull Request构成GitHub特色的代码审核。
(6)GitHub 通过私有版本库托管、面向企业的版本库托管和项目管理平台、人员招聘等付费服务获得了商业上的成功,这种成功使GitHub不必以页面中嵌入广告的方式维持运营,最大的受益者还是用户。
(7)GitHub网站采用Ruby on Rails架构,在Web设计中运用了大量的JavaScript、AJAX、HTML 5等技术,支持对使用Markdown等标记语言的内容进行渲染和显示等。关注细节使得GitHub成为了项目托管领域的后起之秀。
使用GitHub,第一步是注册GitHub账号。
(1)首先登录GitHub官网进行注册。
(2)在打开的页面中单击“Sign up now”注册。
(3)在接下来的页面中创建用户名,填写E-mail和设定密码,单击“Create an account”按钮创建账户。
(4)选择账户类型,这里默认选择“Free”类型,单击“Finish sign up”按钮完成注册。
(1)下载并安装Git最新版本。
(2)安装完成后,打开Terminal命令(针对iOS系统用户)或者命令提示行(针对Windows和Linux用户)。
(3)提供给Git用户的姓名,以便用户的提交能被正确地标记。在$后输入下面的内容:
$ git config --global user.name "YOUR NAME"
(4)提供给Git邮箱地址,以便与用户的Git提交进行关联。用户指定的邮箱要和邮箱设置里相同。如何保持用户的邮箱地址隐藏,请参考:保持你的邮箱地址私有。
$ git config --global user.email "YOUR EMAIL ADDRESS"
当用户通过Git连接到一个GitHub仓库后,用户需要验证GitHub,下面是两种验证方法。
(1)通过HTTPS建立连接(推荐)
选择HTTPS方式,用户可以用一个证书小帮手把GitHub密码缓存在Git。
(2)通过SSH建立连接
选择SSH方式,用户需要在计算机中生成SSH keys,用来从GitHub中push或pull。
(1)在任意的页面右上角单击+,然后单击新建仓库“New repository”,如图 1.16所示。
(2)为仓库创建一个简短便于记忆的名字。例如“hello-world”,如图1.17所示。
图1.16 新建仓库
图1.17 创建名字
(3)为仓库添加一个描述(非必需的)。例如“My first repository on GitHub”,如图1.18所示。
(4)选择仓库类型。仓库类型分为公有(Public)或者私有(Private),具体如下。
图1.18 为仓库添加描述
① Public:公有仓库对于刚入门的新手来说是不错的选择。这些仓库在GitHub上对于每个人是可见,用户可以从协作型社区中受益。
② Private:私有仓库需要更多地步骤。它们只对于用户来说是可用的,这个仓库的所有者属于用户和及其指定要分享的合作者,私有仓库仅仅对付费账户可用。更多的信息请参照“What plan should I choose?”。
本例选择“Public”,如图1.19所示。
图1.19 选择仓库类型
(5)选择初始化文件。选择“Initialize this repository with a README”,如图1.20所示。
图1.20 选择初始化文件
(6)完成创建仓库。单击“Create repository”,完成创建一个仓库。
第一个仓库成功创建,并且通过README文件进行了初始化。
一个提交就像项目里的文件在一个特定时间点上的快照一样。
当创建了一个新仓库,通过README文件初始化。README文件里有关于这个项目的详细解释,或者添加一些关于如何安装或者使用该项目的文档。README文件的内容会自动地显示在仓库的首页。
以下提交一个对README文件的修改。
(1)在仓库的文件列表,单击README.md文件,如图1.21所示。
(2)在文件内容的上方,单击“编辑”按钮。
(3)在Edit file标签上,输入一些关于用户的信息,如图1.22所示。
图1.21 单击README.md文件
图1.22 输入用户的信息
(4)在新内容的上方,单击“Preview changes”,如图1.23所示。
(5)检查用户对这个文件进行的更改,会看到新的内容被绿色标记,如图1.24所示。
图1.23 预览
图1.24 新的内容
(6)在页面的底部,即 "Commit changes" 下方,输入一些简短、有意义的提交信息来解释用户对这个文件所进行的修改,如图1.25所示。
图1.25 注释修改
(7)单击“commit changes”,完成提交。
Fork是对一个仓库的复制。复制一个仓库允许自由试验各种改变,而不影响原始的项目。
一般来说,Fork 被用于更改别人的项目(贡献代码给已经开源的项目)或者使用别人的项目作为用户想法的初始开发点。
(1)一种方式是更改别人的项目。使用Fork提出改变的一个很好的例子是漏洞修复。与其记录一个发现的问题,不如采用如下方式。
Fork这个仓库;
进行修复;
向这个项目的拥有者提交一个pull requset;
如果这个项目的拥有者认同这些成果,他们可能会将这些修复更新到原始的仓库中。
(2)另一种方式是使用别人的项目作为用户想法的初始开发点。开源的核心是共享代码,我们可以制作更好、更可靠的软件。
事实上,当用户在GitHub上创建一个仓库时,可以选择自动包含一个许可文件,这个文件决定用户是否希望将项目分享给其他人。
Fork一个仓库分为两步,如下所示。
① 在GitHub上,定位到octocat/Spoon-Knife仓库。
② 在页面右上角,单击“Fork”按钮,如图1.26所示。
这样就已经Fork这个原始的octocat/Spoon-Knife仓库。
图1.26 Fork一个仓库
在Fork一个项目为了提交更改向upstream或原始仓库的情况下,已经很好地实现了将upstream仓库定期同步到Fork。要做到这一点,需要在命令行中使用Git,可以使用刚Fork的octocat/Spoon-Knife仓库去练习设置upstream仓库。
(1)第一步:安装Git。
(2)第二步:为Fork的仓库创建一个本地克隆。
如此即成功Fork Spoon-Knife仓库,但在用户的计算机上并没有这个仓库的文件。接下来复制Fork的代码到本地的计算机上。
① 在GitHub上,定位到Fork的Spoon-Knife仓库。
② 在Fork的仓库页面的右侧边栏,单击复制图标复制Fork的URL。
③ 打开Terminal命令(针对苹果系统用户)或者命令提示行(针对Windows和Linux用户)。
④ 输入git clone,然后粘贴在步骤②复制的URL,用GitHub的用户名代替YOUR-USERNAME。
$ git clone https://github.com/YOUR-USERNAME/Spoon-Knife
⑤ 按回车键,本地克隆就创建好了。
$ git clone https://github.com/YOUR-USERNAME/Spoon-Knife
Cloning into 'Spoon-Knife'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (8/8), done.
remove: Total 10 (delta 1), reused 10 (delta 1)
Unpacking objects: 100% (10/10), done.
(3)第三步:通过配置Git来同步Fork的原始Spoon-Knife仓库。
如果Fork一个项目是为了提出更改这个原始的仓库,可以配置Git将原始的或者upstream的变化更改到本地。
① 在GitHub上,定位到octocat/Spoon-Knife仓库。
② 在这个仓库页面的右侧边栏,单击复制图标复制这个仓库的URL。
③ 打开Terminal命令(针对Mac用户)或提示命令行(Windows和Linux用户)。
④ 更改到步骤②(创建一个本地)创建的Fork的本地目录。
回到根目录,只输入cd。
输入ls,列出当前目录的文件和文件夹。
输入“cd目录名”进入输入的目录下。
输入“cd ..”回到上一目录。
⑤ 输入git remove -v,按回车键,将会看到Fork当前配置的远程仓库:
$ git remote -v
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
⑥ 输入git remote add upstream,然后粘贴步骤②复制的URL并按下回车键。
$ git remote add upstream https://github.com/octocat/Spoon-Knife.git
⑦ 验证Fork里新指明的这个upstream仓库,再次输入git remote -v。将会看到Fork的URL作为原始的地址,而原始的仓库的URL作为upstream。
$ git remote -v
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
origin https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)
接以上操作,可以利用几个Git命令保持Fork与upstream的仓库的同步。
本小节介绍GitHub界面的总体功能,如图1.27所示。
图中标记的序号含义如下。
(1)进入GitHub主页的按钮。
(2)搜索框,用户可以在这里搜索一些开源项目。
(3)用户的头像,可以在设置里面进行设置。
(4)用户的昵称(账号名称),用户可以在设置中设置昵称。
(5)提示用户添加一个类似于个人描述或个性签名的东西。
(6)这是用户加入GitHub的时间。
(7)此处有三个数据:Followers,追随(关注)你的人;Starred,你点赞(Star)的项目;Following,你追随(关注)的人。
(8)Pull requests:即其他人向用户的仓库提交合并请求。
(9)Issues:即其他人对用户的项目提的问题。
图1.27 GitHub界面总体功能
(10)Gist:代码片段。
(11)系统给用户的提示消息,提示用户去编辑自己的资料。
(12)用户每天的贡献度。
(13)用户的项目仓库。
(14)用户平时的活动或动态,例如在哪个项目做了提交等。
(15)用户每天向GitHub提交的贡献的分布图。
(16)由于新账户还没有贡献,所以列出了官方对于贡献的解释,帮助新手理解。
(17)创建新仓库或新组织的按钮,单击按钮会弹出菜单。
(18)与用户相关的一个按钮,单击后会有一个与用户相关的菜单。
读者可以参考相关的专业书籍详细了解更多相关知识。