---
title: 使用 Git 和 GitHub
slug: github
date: 0003/01/02
number: 3.5
points: 5
sidebar: true
contents: 學習 GitHub 并應用到本書的學習中。
paragraphs: 32
---
[GitHub](https://github.com/) 是一個開源項目的社交化代碼存儲空間,基于 [Git](http://git-scm.com/) 作為版本控制系統。它的首要功能就是代碼共享和項目協作。在本章你可以快速找到用 GitHub 學習本書的一些方法。
本章節假設你不太了解 Git 和 GitHub。如果你已經熟悉他們了,你可以直接跳到下一章!
### 代碼提交
Git 最基本的工作單元是*提交*。你可以把提交設想為你的代碼庫在某個特定時間的一個快照。
與其簡單地給你一個 Microsocope 項目的最終代碼版本,我們更愿意把開發過程中每一步的快照都提供出來,這樣你在 Github 上在線看到。
比如,這個就是我們上一章最后一次提交 (https://github.com/DiscoverMeteor/Microscope/commit/chapter3-2)
看起來是這樣的:
<%= screenshot "s3-1", "GitHub 上的一次代碼提交" %>
你可以看到 `post_item.js` 這個文件的“diff”(差異),換句話說就是這次提交改動了這個文件的什么地方。因為我們這個文件是新建的,所以你可以看到所有內容都是綠色高亮。
讓我們對比一下另外一個例子[本書中以后會用到的文件](https://github.com/DiscoverMeteor/Microscope/commit/chapter13-1):
<%= screenshot "s3-2", "修改代碼" %>
這次,只有修改的代碼行被高亮為綠色了。
當然,有時候我們并不增加和修改代碼,而是直接[刪除](https://github.com/DiscoverMeteor/Microscope/commit/chapter12-2)某些行:
<%= screenshot "s3-3", "刪除代碼" %>
好了,我們現在看到 GitHub 的第一個好處:一覽代碼的改動。
### 瀏覽提交的代碼
Git 的提交視圖給我們顯示了本次提交的代碼改動,但是有時候我們還是需要看看*沒有修改*的
那些代碼,從而確認他們的代碼看起來合理。
好,讓 GitHub 再次來解決這個問題。在提交頁面上點擊 **Browse code(瀏覽代碼)**按鈕:
<%= screenshot "s3-5", "瀏覽代碼按鈕" %>
你現在可以看到某次提交的時候代碼庫的樣子了。
<%= screenshot "s3-6", "提交編號 3-2 的代碼庫。" %>
GitHub 沒有給我們足夠的視覺提示讓我們知道我們正在看一個提交,不過你可以通過與 “正常” 的主視圖進行比較,就會發現文件結構的不同了:
<%= screenshot "s3-7", "提交編號 14-2 的代碼庫。" %>
### 訪問本地提交
我們剛剛看到在 Github 上如何在線瀏覽某個提交的整個代碼。但是你是否想在本地也看到呢?比如你也許想退回到某次提交的代碼狀態測試一下那時候運行的樣子。
想做到這個你需要首次(也許你早已經不是首次了,但是至少在本書中是第一次用命令行)用 `git` 命令行。對于新手首先要確定你已經[安裝](http://git-scm.com/downloads)了 Git。然后 **克隆 Clone**(或者叫下載一份本地拷貝)一份 Microscope 的代碼庫。命令如下:
~~~bash
git clone git@github.com:DiscoverMeteor/Microscope.git github_microscope
~~~
命令行最后的 `github_microscope` 實際上就是將會存代碼庫的本地目錄名。假設你已有了 `microscope` 文件夾,那就隨便起一個新名字(不是必須用和 GitHub 代碼庫相同的名字)。
讓我們 `cd` 進這個代碼庫,然后就可以使用 `git` 命令了。
~~~bash
cd github_microscope
~~~
現在我們已經從 GitHub 克隆了代碼庫,我們已經下載了這個應用的 *全部* 代碼,也就是說我們正在看的是最后一次提交。
值得感激的是我們有辦法*check out(簽出)*代碼回退到某一個特定的提交,而不會影響到其他提交。讓我們試一下:
~~~bash
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 讓我們可以輕松地在提交的右下角看到藍色提交框中提交哈希碼。如圖所示:
<%= screenshot "s3-4", "找到提交的哈希碼" %>
這一次讓我們試試哈希碼而不是標簽:
~~~bash
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**:
~~~bash
git checkout master
~~~
注意,你也可以現在運行 `meteor` 命令,即使是在“detached HEAD”的狀態下。你也許首先需要運行一下 `meteor update` 命令,如果 Meteor 提示有丟失的代碼包,因為 Microscope 的 Git 代碼庫沒有包括包代碼。
### Historical Perspective
這里還有一種常見的情形:你看代碼文件的時候發現有一些你以前沒有見到過的改動。大多數情況是你不記得**什么時候**你改了這個文件。你可以逐個檢查每個提交直到你發現某個提交造成了這個改動,不過還有一種更好的方法,那就是 GitHub 的 **歷史** 功能。
首先,在 GitHub 上找一個代碼庫里的文件,然后找到 “歷史” 按鈕:
<%= screenshot "s3-8", "GitHub 的歷史按鈕" %>
你現在可以看到所有影響這個文件的提交歷史:
<%= screenshot "s3-9", "顯示一個文件的歷史" %>
### 問責游戲
讓我們看看**問責**:
<%= screenshot "s3-10", "GitHub 的問責按鈕" %>
這個簡潔的視圖給我們逐行顯示了誰修改過這個文件,以及在哪次提交中修改的。(換句話說,知道軟件搞壞了該找誰算賬):
<%= screenshot "s3-11", "GitHub 問責視圖" %>
現在的 Git 已經是一個相當復雜的工具了 - GitHub 也一樣 - ,所以你不可能在這里覆蓋所有功能。事實上,我們只是學習了一點皮毛。盡管如此,這點皮毛已經夠我們在本書的學習中用了。