Git 入門筆記
前言
這兩天花了蠻多時間在 Survey Git 這套先進的 SCM。在新的工作上,我打算從 Subversion 轉換到 Git 來做專案、程式的版本控制。
之前在學習 Subversion 時,是根據 SVN Book 中文版開始入門,從而瞭解 CVS 和 Subversion 設計及使用的觀念,讓我知道,使用 CVS 或 Subversion 的差異,以及該如何使用 SVN 融入我的開發流程,以文件來說, SVN Book 是寫的相當清楚易懂的。不過 Git 在這個部份,我卻沒有找到相似的介紹文件,尤其是它著名的 Distributed 特性,讓我不太了解如何套用,以及使用這樣 Distributed 的特性,會對原本工作的流程產生什麼樣的影響和變化。這些都是在 Survey 的過程中需要先被確認的。
疑問 – 如何規劃 Repository?
首先,我的第一個問題就是「我該如何規劃 Repository?」在 CVS/Subversion 中,我們可以使用一個 Repository 來放許多個不同的 Project,並以目錄來區分,如同工作複本這段所敘述的。更複雜一點的,可以使用檔案庫配置這段所建議兩種架構中選擇一種。


而在工作目錄的部份,可以直接依據情況,只 checkout 需要的子目錄部份即可,而因為 Subversion 會在 Working Directory 的每個子目錄下,都建立一個 .svn/ ,所以它仍可以正確對應目錄資訊,不過 Git 由於只在 Working Directory 的最頂層放一個 .git/ 來處理,使得我蠻懷疑要怎麼處理這樣的狀況?
從這樣的一個基本的疑問,我開始查資料去瞭解 Git ~
參考文件
一開始我先看 Linus 之前在 Google 演講 Git 的錄影 – Linus Torvalds on git (相關介紹可參考 Rex’s 的介紹),不過聽了半天,發現我只能斷斷續續的聽懂幾句話,而且錄影是以 Linus 的講演為主,對我來說學習的效果不佳,只好另外找其他資料。
於是找到了另一篇簡報的錄影 – OGRE Git Tutorial,這篇介紹了 Git 的內部設計(實做)概念,以及幾個主要的 Work Flow 跟常用指令,這一篇就蠻有幫助的。
以下是一些相關的筆記:
- 不需要 trunk 或 branch 這樣的目錄結構,在 .git 裡面會處理這訊息 *
-
git show = svn status (and svn diff)
git show –stat 單純顯示 status, 也就是 Working 和 HEAD 的差異
git show –name-status 如同 svn st 的顯示方式 - branch 分成3種: local branch (綠色方塊)、tag (藍紫色方塊)、remote branch(橘色方塊)
- 使用 git checkout -b 做切換分支的動作 *
- HEAD 代表目前 Work Directory 所使用的 branch (的最新版本)
- merge 指令
- rebase 指令, 可以將 (local) branch 整合到 (local) trunk 上,但和 merge 有點不同,感覺有點類似 merge 以後將分支砍掉的感覺 *
其中有標 * 的表示和 Subversion (包括觀念或用法)比較不同的地方。
不過在最後面有關 push 跟 poll 的部份,我還沒有看懂是怎麼分辨其他人能不能 push patch 到 original 去的,不過這不是大問題,用了以後就會知道了。
結論
基本上看完這些以後,目前是傾向把一個 git 來管理一個 project 吧,否則一個 branch 或 tag 在 git 是代表整個 repository 的版本,但對對多個 project 來說,這樣的 branch 或 release tag 並沒有意義。