GitHub入门
GitHub 是一个通过 Git 进行版本控制的软件源代码托管平台,由 GitHub 公司的开发者 Chris Wanstrath、PJ Hyett 和 Tom Preston-Werner 使用 Ruby on Rails 编写而成。
GitHub 同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,但是付费账户还可以创建私有的代码仓库。
根据 2009 年的 Git 用户调查,GitHub 是最流行的 Git 访问站点。除了允许个人和组织创建和访问保管中的代码,它也提供了一些方便社会化共同软件开发的功能,即一般人口中的社区功能,包括允许用户追踪其他用户、组织、软件库的动态,对软件代码的改动和 bug 提出评论等。GitHub 也提供了图表功能,用于概观显示开发者们怎样在代码库上工作以及软件的开发活跃程度。
截止到 2015 年,GitHub 已经有超过 900 万的注册用户和 2110 万的代码库,事实上已经成为了世界上最大的代码存放网站和开源社区。
访问 https://github.com/ ,GitHub 首页如图11-2所示。

如果还没有 GitHub 账户,可以在首页注册一个帐号。注册成功后,跟着我们分别从以下几个方面进行学习和操作。
创建并提交到仓库
想要将自己的项目托管到 GitHub 上,需要先在 GitHub 中创建仓库。首先使用自己注册的账号登录 GitHub,登录后才可以进行其他操作。在任意 GitHub 的页面上,点击右上角的符号 +,如图11-3所示。

点击 New repository 创建新的仓库,打开如图11-4所示的界面。

在 Repository name 中输入仓库的名称,例如 simple。在 Description 中可以输入仓库的描述信息,该内容可选,这里可以输入 “simple-MyBatis 用法示例仓库”。
下面使用默认的 Public 公开类型,公开是指所有人都可以看到我们创建的这个仓库,并且可以浏览其中的内容。如果想要选择 Private 私有类型,需要付费才可以使用,私有类型只有自己可以看到。通常创建仓库时,不选择下面的复选框,不使用 README 初始化仓库。填写完成后,点击 Create repository 创建仓库。
创建好仓库后会进入仓库的界面,由于仓库中还没有任何内容,因此 GitHub 默认显示的是如何进行下一步操作。一般情况下,添加远程仓库时通常使用 origin 作为远程仓库的名字,如果按照上一节 Git 入门中的操作步骤添加过本地的远程仓库,那么 origin 已经被使用了,因此要先通过以下命令删除之前创建的 origin。
$ git remote remote origin
$ git remote -v
删除后,再通过上述代码中的第二个命令查看 remote,此时会显示空。接下来按照 GitHub 页面提示的命令进行操作,将本地仓库上传到服务器,使用下面的命令将刚刚创建的远程仓库配置为 origin。
git remote add origin https://github.com/abel533/simple.git
添加好远程仓库后,执行如下命令将本地仓库的代码提交到服务器上。
$ git push -u origin master
...
执行完这个命令后,项目就上传到服务器了。刷新页面或重新打开 https://github.com/abel533/simple 页面,就可以看到项目了,此时的界面如图11-5所示。

为了方便他人了解这个项目,GitHub 建议在项目中添加 README 文件,并且支持多种类型的 README 文件,我们使用开源项目中最常用的 markdown 格式,在项目的根目录下创建一个 README.md 文件,然后输入如下内容。
MyBatis示例
本项目中包含了 MyBatis 中常见的各种用法,是一个用于学习 MyBatis 的最好项目。
保存文件后,依次使用如下命令将该文件添加到版本控制,并且最终提交到 GitHub 中。
$ git add README.md
$ git commit -m '增加README'
$ git push origin master
提交到 GitHub 后,再次刷新刚才的网页,此时在代码下面会显示出刚刚输入的内容,如图11-6所示。

到这一步,我们就完成了创建仓库和提交代码到远程仓库的所有步骤。针对远程仓库的使用,后面的操作就是新增、修改、删除文件,本地提交,然后推送到远程仓库。
Fork仓库并克隆到本地
Fork 仓库指的是创建一个仓库的副本,Fork 仓库后,可以在不影响原始仓库的情况下自由进行更改。Fork 仓库通常是为了在原仓库基础上做一些更改,配合 GitHub 的 Pull Request 功能还可以将自己的更改提交给项目的所有者,如果他们喜欢,就有可能把提交合并到原始仓库中。另一种情况是使用别人的项目作为自己开发的起点,GitHub 上面开源了很多不同类型的基础框架或者功能比较完善的脚手架,以这些开源项目为基础可以使我们直接从更高的起点开始工作。
下面通过 Fork MyBatis 官方仓库来操作一遍。
从浏览器中打开 https://github.com/mybatis/mybatis-3 ,点击右上角的 Fork 按钮,此时会显示正在 Forking,如图11-7所示。

稍等片刻后页面会自动刷新,此时就拥有了一个和 MyBatis 官方完全相同的仓库,在左上角会显示自己的用户名 /mybatis-3,下面还有一行小字 “forked from mybatis/mybatis-3”。
Fork 仓库后,可以对这个仓库进行任何操作,原仓库后续的任何操作都不会对自己的仓库产生影响,这时就会产生一个问题:如何保持和原始仓库的同步?可以通过如下步骤解决这个问题。
-
点击仓库右侧的 Clone or download 按钮,使用 HTTPS 方式,点击输入框右侧的按钮复制仓库的地址。
-
打开 Git Bash。
-
输入 git clone 和第 1 步复制的仓库地址,注意地址部分,使用 GitHub 用户名(下面示例使用的用户名为 abel533)。
$ git clone https://github.com/您的用户名/mybatis-3.git
-
按下回车键,此时将会实现从服务器克隆到本地。
$ git clone https://github.com/abe1533/mybatis-3.git ...
现在就有了一个 MyBatis 的本地仓库。有了这个本地仓库后,可以对这个仓库继续进行如下操作。
-
进入 mybatis-3 目录,输入如下命令查看远程仓库。
$ git remote -v ...
-
输入以下命令,给当前的仓库增加一个上游的仓库,上游仓库的地址从 mybatis 官方仓库页面以相同的方式复制 url。
$ git remote add upstream https://github.com/mybatis/mybatis-3.git
-
再次输入以下命令验证新添加的仓库。
$ git remote -v ...
-
输入如下命令从 upstream 中进行同步。
$ git pull upstream master ...
-
假如在自己的仓库中进行过更改,可以使用如下命令先从上游仓库将代码取回到本地,然后再合并提交。
$ git fetch upstream ... $ git merge upstream/master ...
-
最后,将同步后的内容提交到自己的 GitHub 仓库中。
$ git push origin master ...
此时就完成了我们自己的仓库和原仓库的同步。
社交功能
GitHub 同样是一个必不可少的 “社交” 网站,下面分别简述常用的社交功能。
关注人
当关注某人时,可以在 GitHub 首页收到有关这个人的活动通知。例如进入本书作者的 GitHub 页面,地址是 https://github.com/abel533 ,点击左侧头像下方的 Follow 按钮即可关注(欢迎各位读者关注)。关注后,在 https://github.com/ 页面上会显示如图11-8所示的信息。

收藏和关注项目
如果遇到好的项目想要收藏,或者纯粹为了支持开发者,可以在项目页面上点击右上角的 Star 按钮进行收藏,所有的开发者都会因为有人收藏自己的项目而感到高兴。
如果想要关注某个项目的任意变化,获取实时消息,可以在项目页面点击 Watch 按钮。在这种情况下,当项目有任何变化时,都会收到邮件通知。
Issues
Issues 是指在项目上发起一个讨论或者 bug,可以在此对项目进行反馈,还可以针对某个话题或 bug 进行讨论。这是一个接触开源项目最简单的入门方式,同时项目中大量的历史 Issues 也会对我们学习和使用该项目起到很大的帮助。MyBatis的 Issues 列表如图11-9所示。

Pull Request
如果发现 GitHub 上面的某个项目存在 bug 时,或者想要给某个项目增加合适的功能时,可以先按照前面的步骤 Fork 一个仓库,然后在自己的仓库中修复 bug 或者开发新的功能。开发完成后,如果想要贡献自己对该项目的更改,可以通过 Pull Request 给原仓库推送合并提交的请求。
对于许多对测试有严格要求的项目,建议在开发过程中提供完善的测试,必要时提供相应的文档,良好的编码习惯会让项目的开发者最大程度上合并我们的提交。
接下来演示 Pull Request 的简单流程,大家在学习这些操作时不要随意选择他人的项目进行推送。这里有一个简单的仓库可以让大家来测试,地址是 https://github.com/abel533/PullRequest 。按照前面的操作 Fork 这个仓库,Fork 后的界面如图11-10所示。

这个仓库中只有一个 README.md 文件,点击 README.md 文件,在打开的页面上点击右侧的编辑图标,在线对该文件进行编辑,随意添加一段内容,然后在页面下方输入提交信息,点击 Commit changes 保存提交。
回到仓库首页,点击左侧的 New pull request 按钮,GitHub 会自动和原始仓库进行比对,当内容不同时,会显示如图11-11所示的界面。

点击 Create pull request 按钮,然后输入提交的标题和内容,再次点击右下角的 Create pull request 按钮,此时会跳转到原仓库的 Pull Requests 标签页,如图11-12所示。

等到原仓库的开发人员接收提交后,这次 Pull Request 就会合并到原仓库中。