Git 系列(三):建立你的第一個 Git 倉庫

Seth Kenlon發表於2016-08-04

現在是時候學習怎樣建立你自己的 Git 倉庫了,還有怎樣增加檔案和完成提交。

在本系列前面的文章中,你已經學習了怎樣作為一個終端使用者與 Git 進行互動;你就像一個漫無目的的流浪者一樣偶然發現了一個開源專案網站,克隆了倉庫,然後你就可以繼續鑽研它了。你知道了和 Git 進行互動並不像你想的那樣困難,或許你只是需要被說服現在去使用 Git 完成你的工作罷了。

雖然 Git 確實是被許多重要軟體選作版本控制工具,但是並不是僅能用於這些重要軟體;它也能管理你購物清單(如果它們對你來說很重要的話,當然可以了!)、你的配置檔案、週報或日記、專案進展日誌、甚至原始碼!

使用 Git 是很有必要的,畢竟,你肯定有過因為一個備份檔案不能夠辨認出版本資訊而抓狂的時候。

Git 無法幫助你,除非你開始使用它,而現在就是開始學習和使用它的最好時機。或者,用 Git 的話來說,“沒有其他的 push 能像 origin HEAD 一樣有幫助了”(千里之行始於足下的意思)。我保證,你很快就會理解這一點的。

類比於錄音

我們經常用名詞“快照”來指代計算機上的映象,因為很多人都能夠對插滿了不同時光的照片的相簿充滿了感受。這很有用,不過,我認為 Git 更像是進行一場錄音。

也許你不太熟悉傳統的錄音棚卡座式錄音機,它包括幾個部件:一個可以正轉或反轉的轉軸、儲存聲音波形的磁帶,可以透過拾音頭在磁帶上記錄聲音波形,或者檢測到磁帶上的聲音波形並播放給聽眾。

除了往前播放磁帶,你也可以把磁帶倒回到之前的部分,或快進跳過後面的部分。

想象一下上世紀 70 年代樂隊錄製磁帶的情形。你可以想象到他們一遍遍地練習歌曲,直到所有部分都非常完美,然後記錄到音軌上。起初,你會錄下鼓聲,然後是低音,再然後是吉他聲,最後是主唱。每次你錄音時,錄音棚工作人員都會把磁帶倒帶,然後進入迴圈模式,這樣它就會播放你之前錄製的部分。比如說如果你正在錄製低音,你就會在背景音樂裡聽到鼓聲,就像你自己在擊鼓一樣,然後吉他手在錄製時會聽到鼓聲、低音(和牛鈴聲)等等。在每個迴圈中,你都會錄製一部分,在接下來的迴圈中,工作人員就會按下錄音按鈕將其合併記錄到磁帶中。

你也可以複製或換下整個磁帶,如果你要對你的作品重新混音的話。

現在我希望對於上述的上世紀 70 年代的錄音工作的描述足夠生動,這樣我們就可以把 Git 的工作想象成一個錄音工作了。

新建一個 Git 倉庫

首先得為我們的虛擬的錄音機買一些磁帶。用 Git 的話說,這些磁帶就是倉庫;它是完成所有工作的基礎,也就是說這裡是存放 Git 檔案的地方(即 Git 工作區)。

任何目錄都可以成為一個 Git 倉庫,但是讓我們從一個新目錄開始。這需要下面三個命令:

  • 建立目錄(如果你喜歡的話,你可以在你的圖形化的檔案管理器裡面完成。)
  • 在終端裡切換到目錄。
  • 將其初始化成一個 Git 管理的目錄。

也就是執行如下程式碼:

$ mkdir ~/jupiter  # 建立目錄
$ cd ~/jupiter     # 進入目錄
$ git init .       # 初始化你的新 Git 工作區

在這個例子中,資料夾 jupiter 是一個空的但是合法的 Git 倉庫。

有了倉庫接下來的事情就可以按部就班進行了。你可以克隆該倉庫,你可以在一個歷史點前後來回穿梭(前提是你有一個歷史點),建立交替的時間線,以及做 Git 能做的其它任何事情。

在 Git 倉庫裡面工作和在任何目錄裡面工作都是一樣的,可以在倉庫中新建檔案、複製檔案、儲存檔案。你可以像平常一樣做各種事情;Git 並不複雜,除非你把它想複雜了。

在本地的 Git 倉庫中,一個檔案可以有以下這三種狀態:

  • 未跟蹤檔案Untracked:你在倉庫裡新建了一個檔案,但是你沒有把檔案加入到 Git 的管理之中。
  • 已跟蹤檔案Tracked:已經加入到 Git 管理的檔案。
  • 暫存區檔案Staged:被修改了的已跟蹤檔案,並加入到 Git 的提交佇列中。

任何你新加入到 Git 倉庫中的檔案都是未跟蹤檔案。這些檔案儲存在你的電腦硬碟上,但是你沒有告訴 Git 這是需要管理的檔案,用我們的錄音機來類比,就是錄音機還沒開啟;樂隊就開始在錄音棚裡忙碌了,但是錄音機並沒有準備錄音。

不用擔心,Git 會在出現這種情況時告訴你:

$ echo "hello world" > foo
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)    
    foo    
nothing added but untracked files present (use "git add" to track)

你看到了,Git 會提醒你怎樣把檔案加入到提交任務中。

不使用 Git 命令進行 Git 操作

在 GitHub 或 GitLab 上建立一個倉庫只需要用滑鼠點幾下即可。這並不難,你單擊“New Repository”這個按鈕然後跟著提示做就可以了。

在倉庫中包括一個“README”檔案是一個好習慣,這樣人們在瀏覽你的倉庫的時候就可以知道你的倉庫是幹什麼的,更有用的是可以讓你在克隆一個有東西的倉庫前知道它有些什麼。

克隆倉庫通常很簡單,但是在 GitHub 上獲取倉庫改動許可權就稍微複雜一些,為了透過 GitHub 驗證你必須有一個 SSH 金鑰。如果你使用 Linux 系統,可以透過下面的命令生成:

$ ssh-keygen

然後複製你的新金鑰的內容,它是純文字檔案,你可以使用一個文字編輯器開啟它,也可以使用如下 cat 命令檢視:

$ cat ~/.ssh/id_rsa.pub

現在把你的金鑰貼上到 GitHub SSH 配置檔案 中,或者 GitLab 配置檔案

如果你透過使用 SSH 模式克隆了你的專案,你就可以將修改寫回到你的倉庫了。

另外,如果你的系統上沒有安裝 Git 的話也可以使用 GitHub 的檔案上傳介面來新增檔案。

跟蹤檔案

正如命令 git status 的輸出告訴你的那樣,如果你想讓 git 跟蹤一個檔案,你必須使用命令 git add 把它加入到提交任務中。這個命令把檔案存在了暫存區,這裡存放的都是等待提交的檔案,或者也可以用在快照中。在將檔案包括到快照中,和新增要 Git 管理的新的或臨時檔案時,git add 命令的目的是不同的,不過至少現在,你不用為它們之間的不同之處而費神。

類比錄音機,這個動作就像開啟錄音機開始準備錄音一樣。你可以想象為對已經在錄音的錄音機按下暫停按鈕,或者倒回開頭等著記錄下個音軌。

當你把檔案新增到 Git 管理中,它會標識其為已跟蹤檔案:

$ git add foo
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file:   foo

加入檔案到提交任務中並不是“準備錄音”。這僅僅是將該檔案置於準備錄音的狀態。在你新增檔案後,你仍然可以修改該檔案;它只是被標記為已跟蹤處於暫存區,所以在它被寫到“磁帶”前你可以將它撤出或修改它(當然你也可以再次將它加入來做些修改)。但是請注意:你還沒有在磁帶中記錄該檔案,所以如果弄壞了一個之前還是好的檔案,你是沒有辦法恢復的,因為你沒有在“磁帶”中記下那個檔案還是好著的時刻。

如果你最後決定不把檔案記錄到 Git 歷史列表中,那麼你可以撤銷提交任務,在 Git 中是這樣做的:

$ git reset HEAD foo

這實際上就是解除了錄音機的準備錄音狀態,你只是在錄音棚中轉了一圈而已。

大型提交

有時候,你想要提交一些內容到倉庫;我們以錄音機類比,這就好比按下錄音鍵然後記錄到磁帶中一樣。

在一個專案所經歷的不同階段中,你會按下這個“記錄鍵”無數次。比如,如果你嘗試了一個新的 Python 工具包並且最終實現了視窗呈現功能,然後你肯定要進行提交,以便你在實驗新的顯示選項時搞砸了可以回退到這個階段。但是如果你在 Inkscape 中畫了一些圖形草樣,在提交前你可能需要等到已經有了一些要開發的內容。儘管你可能提交了很多次,但是 Git 並不會浪費很多,也不會佔用太多磁碟空間,所以在我看來,提交的越多越好。

commit 命令會“記錄”倉庫中所有的暫存區檔案。Git 只“記錄”已跟蹤的檔案,即,在過去某個時間點你使用 git add 命令加入到暫存區的所有檔案,以及從上次提交後被改動的檔案。如果之前沒有過提交,那麼所有跟蹤的檔案都包含在這次提交中,以 Git 的角度來看,這是一次非常重要的修改,因為它們從沒放到倉庫中變成了放進去。

完成一次提交需要執行下面的命令:

$ git commit -m 'My great project, first commit.'

這就儲存了所有提交的檔案,之後可以用於其它操作(或者,用英國電視劇《神秘博士》中時間領主所講的 Gallifreyan 語說,它們成為了“固定的時間點” )。這不僅是一個提交事件,也是一個你在 Git 日誌中找到該提交的引用指標:

$ git log --oneline
55df4c2 My great project, first commit.

如果想瀏覽更多資訊,只需要使用不帶 --oneline 選項的 git log 命令。

在這個例子中提交時的引用號碼是 55df4c2。它被叫做“提交雜湊commit hash”(LCTT 譯註:這是一個 SHA-1 演算法生成的雜湊碼,用於表示一個 git 提交物件),它代表著剛才你的提交所包含的所有新改動,覆蓋到了先前的記錄上。如果你想要“倒回”到你的提交歷史點上,就可以用這個雜湊作為依據。

你可以把這個雜湊想象成一個聲音磁帶上的 SMPTE 時間碼,或者再形象一點,這就是好比一個黑膠唱片上兩首不同的歌之間的空隙,或是一個 CD 上的音軌編號。

當你改動了檔案之後並且把它們加入到提交任務中,最終完成提交,這就會生成新的提交雜湊,它們每一個所標示的歷史點都代表著你的產品不同的版本。

這就是 Charlie Brown 這樣的音樂家們為什麼用 Git 作為版本控制系統的原因。

在接下來的文章中,我們將會討論關於 Git HEAD 的各個方面,我們會真正地向你揭示時間旅行的秘密。不用擔心,你只需要繼續讀下去就行了(或許你已經在讀了?)。


via: https://opensource.com/life/16/7/creating-your-first-git-repository

作者:Seth Kenlon 譯者:vim-kakali 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章