使用 Git 和 GitHub
GitHub 是一个开源项目的社交化代码存储空间,基于 Git 作为版本控制系统。它的首要功能就是代码共享和项目协作。在本章你可以快速找到用 GitHub 学习本书的一些方法。
本章节假设你不太了解 Git 和 GitHub。如果你已经熟悉他们了,你可以直接跳到下一章!
代码提交
Git 最基本的工作单元是提交。你可以把提交设想为你的代码库在某个特定时间的一个快照。
与其简单地给你一个 Microsocope 项目的最终代码版本,我们更愿意把开发过程中每一步的快照都提供出来,这样你在 Github 上在线看到。
比如,这个就是我们上一章最后一次提交 (https://github.com/DiscoverMeteor/Microscope/commit/chapter3-2) 看起来是这样的:
你可以看到 post_item.js
这个文件的“diff”(差异),换句话说就是这次提交改动了这个文件的什么地方。因为我们这个文件是新建的,所以你可以看到所有内容都是绿色高亮。
让我们对比一下另外一个例子本书中以后会用到的文件:
这次,只有修改的代码行被高亮为绿色了。
当然,有时候我们并不增加和修改代码,而是直接删除某些行:
好了,我们现在看到 GitHub 的第一个好处:一览代码的改动。
浏览提交的代码
Git 的提交视图给我们显示了本次提交的代码改动,但是有时候我们还是需要看看没有修改的 那些代码,从而确认他们的代码看起来合理。
好,让 GitHub 再次来解决这个问题。在提交页面上点击 Browse code(浏览代码)按钮:
你现在可以看到某次提交的时候代码库的样子了。
GitHub 没有给我们足够的视觉提示让我们知道我们正在看一个提交,不过你可以通过与 “正常” 的主视图进行比较,就会发现文件结构的不同了:
访问本地提交
我们刚刚看到在 Github 上如何在线浏览某个提交的整个代码。但是你是否想在本地也看到呢?比如你也许想退回到某次提交的代码状态测试一下那时候运行的样子。
想做到这个你需要首次(也许你早已经不是首次了,但是至少在本书中是第一次用命令行)用 git
命令行。对于新手首先要确定你已经安装了 Git。然后 克隆 Clone(或者叫下载一份本地拷贝)一份 Microscope 的代码库。命令如下:
git clone git@github.com:DiscoverMeteor/Microscope.git github_microscope
命令行最后的 github_microscope
实际上就是将会存代码库的本地目录名。假设你已有了 microscope
文件夹,那就随便起一个新名字(不是必须用和 GitHub 代码库相同的名字)。
让我们 cd
进这个代码库,然后就可以使用 git
命令了。
cd github_microscope
现在我们已经从 GitHub 克隆了代码库,我们已经下载了这个应用的 全部 代码,也就是说我们正在看的是最后一次提交。
值得感激的是我们有办法check out(签出)代码回退到某一个特定的提交,而不会影响到其他提交。让我们试一下:
git checkout chapter3-1
Node:checking out 'chapter3-1'.
你现在是在 'detached HEAD' 状态. 你可以随便看看做点实验性的修改并提交。你只需再次签出代码即可放弃你的提交,而不会影响的任何其他分支。
如果你想建立新的分支来保留你的提交,你可以这样做(现在或者以后也行),迁出代码的时候使用 -b 参数。
举例:
git checkout -b new_branch_name
HEAD is now at a004b56... Added basic posts list template and static data.
Git 通知你现在在 ‘分离头’ “detached HEAD” 状态,也就是说就 Git 而言, 你可以发现过去的历史提交但是不能修改。你可以想象一个巫婆用水晶球回顾历史。
(注意 Git 还有让你 改变 历史提交的命令。这更像是时间旅行,不过那些不是我们本书需要讨论的范畴了。)
你能够简单地输入 chapter3-1
是因为我们实现已经把所有的 Microscope 的提交都打了标签了。 如果你的提交没有标签,那么你需要先找到你的提交的 哈希码 hash,或者ID。
再一次 GitHub 让我们可以轻松地在提交的右下角看到蓝色提交框中提交哈希码。如图所示:
这一次让我们试试哈希码而不是标签:
git checkout c7af59e425cd4e17c20cf99e51c8cd78f82c9932
Previous HEAD position was a004b56... Added basic posts list template and static data.
HEAD is now at c7af59e... Augmented the postsList route to take a limit
好了,别再用水晶球看历史提交了,让我们想看看最新的代码状态,我们可以让 Git 签出主分支master:
git checkout master
注意,你也可以现在运行
meteor
命令,即使是在“detached HEAD”的状态下。你也许首先需要运行一下meteor update
命令,如果 Meteor 提示有丢失的代码包,因为 Microscope 的 Git 代码库没有包括包代码。
Historical Perspective
这里还有一种常见的情形:你看代码文件的时候发现有一些你以前没有见到过的改动。大多数情况是你不记得什么时候你改了这个文件。你可以逐个检查每个提交直到你发现某个提交造成了这个改动,不过还有一种更好的方法,那就是 GitHub 的 历史 功能。
首先,在 GitHub 上找一个代码库里的文件,然后找到 “历史” 按钮:
你现在可以看到所有影响这个文件的提交历史:
问责游戏
让我们看看问责:
这个简洁的视图给我们逐行显示了谁修改过这个文件,以及在哪次提交中修改的。(换句话说,知道软件搞坏了该找谁算账):
现在的 Git 已经是一个相当复杂的工具了 - GitHub 也一样 - ,所以你不可能在这里覆盖所有功能。事实上,我们只是学习了一点皮毛。尽管如此,这点皮毛已经够我们在本书的学习中用了。