http://www.bitsun.com/documents/gittutorcn.htm


 


Git 中文教學


介紹


Git --- The stupid content tracker, 傻瓜內容跟蹤器。Linus 是這樣給我們介紹 Git 的。


Git 是用於 Linux 核心開發的版本控制工具。與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援,使原始程式碼的發佈和交流極其方便。 Git 的速度很快,這對於諸如 Linux kernel 這樣的大項目來說自然很重要。 Git 最為出色的是它的合併跟蹤(merge tracing)能力。


實際上核心開發團隊決定開始開發和使用 Git 來作為核心開發的版本控制系統的時候,世界開源社群的反對聲音不少,最大的理由是 Git 太艱澀難懂,從 Git 的內部工作機制來說,的確是這樣。但是隨著開發的深入,Git 的正常使用都由一些友好的指令碼命令來執行,使 Git 變得非常好用,即使是用來管理我們自己的開發專案,Git 都是一個友好,有力的工具。現在,越來越多的著名專案採用 Git 來管理專案開發,例如:wine, U-boot 等,詳情看 http://www.kernel.org/git


作為開源自由原教旨主義項目,Git 沒有對版本庫的流覽和修改做任何的許可權限制。它只適用於 Linux / Unix 平臺,沒有 Windows 版本,目前也沒有這樣的開發計畫。


本文將以 Git 官方文檔 Tutorial core-tutorial Everyday GIT 作為藍本翻譯整理,但是暫時去掉了對 Git 內部工作機制的闡述,力求簡明扼要,並加入了作者使用 Git 的過程中的一些心得體會,注意事項,以及更多的例子。建議你最好通過你所使用的 Unix / Linux 發行版本的安裝包來安裝 Git, 你可以線上流覽本文 ,也可以通過下面的命令來得到本文最新的版本庫,並且通過後面的學習用 Git 作為工具參加到本文的創作中來。


$ git-clone http://www.bitsun.com/git/gittutorcn.git


建立一個版本庫:git-init-db


建立一個 Git 版本庫是很容易的,只要用命令 git-init-db 就可以了。現在我們來為本文的寫作建立一個版本庫:


$ mkdir gittutorcn


$ cd gittutorcn


$ git-init-db


git 將會作出以下的回應


defaulting to local storage area


這樣,一個空的版本庫就建立好了,並在目前的目錄中建立一個叫 .git 的子目錄。你可以用 ls -a 查看一下,並請注意其中的三項內容:


·         一個叫 HEAD 的檔,我們現在來查看一下它的內容:


$ cat .git/HEAD


現在 HEAD 的內容應該是這樣:


ref: refs/heads/master


我們可以看到,HEAD 檔中的內容其實只是包含了一個索引資訊,並且,這個索引將總是指向你的專案中的當前開發分支。


·         一個叫 objects 的子目錄,它包含了你的專案中的所有物件,我們不必直接地瞭解到這些物件內容,我們應該關心是存放在這些物件中的專案的資料。


Note


關於 git 物件的分類,以及 git 物件資料庫的說明,請參看 [Discussion]



·         一個叫 refs 的子目錄,它用來保存指向物件的索引。


具體地說,子目錄 refs 包含著兩個子目錄叫 heads tags,就像他們的名字所表達的意味一樣:他們存放了不同的開發分支的的索引, 或者是你用來標定版本的標籤的索引。


請注意:master 是預設的分支,這也是為什麼 .git/HEAD 建立的時候就指向 master 的原因,儘管目前它其實並不存在。 git 將假設你會在 master 上開始並展開你以後的工作,除非你自己建立你自己的分支。


另外,這只是一個約定俗成的習慣而已,實際上你可以將你的工作分支叫任何名字,而不必在版本庫中一定要有一個叫 master 的分支,儘管很多 git 工具都認為 master 分支是存在的。


現在已經建立好了一個 git 版本庫,但是它是空的,還不能做任何事情,下一步就是怎麼向版本庫植入資料了。


植入內容跟蹤資訊:git-add


為了簡明起見,我們建立兩個檔作為練習:


$ echo "Hello world" > hello


$ echo "Silly example" > example


我們再用 git-add 命令將這兩個檔加入到版本庫檔索引當中:


$ git-add hello example


git-add 實際上是個指令碼命令,它是對 git 核心命令 git-update-index 的調用。因此上面的命令和下面的命令其實是等價的:


$ git-update-index --add hello example


如果你要將某個檔從 git 的目錄跟蹤系統中清除出去,同樣可以用 git-update-index 命令。例如:


$ git-update-index --force-remove foo.c


Note


git-add 可以將某個目錄下的所有內容全都納入內容跟蹤之下,例如: git-add ./path/to/your/wanted 。但是在這樣做之前,應該注意先將一些我們不希望跟蹤的檔清理掉,例如,gcc 編譯出來的 *.o 文件,vim 的交換檔 .*.swp 之類。



應該建立一個清晰的概念就是,git-add git-update-index 只是刷新了 git 的跟蹤資訊,hello example 這兩個檔中的內容並沒有提交到 git 的內容跟蹤範疇之內。


提交內容到版本庫:git-commit


既然我們刷新了 Git 的跟蹤資訊,現在我們看看版本庫的狀態:


$ git-status


我們能看到 git 的狀態提示:


#


# Initial commit


#


#


# Updated but not checked in:


#   (will commit)


#


#       new file: example


#       new file: hello


#


提示資訊告訴我們版本庫中加入了兩個新的檔,並且 git 提示我們提交這些檔,我們可以通過 git-commit 命令來提交:


$ git-commit -m "Initial commit of gittutor reposistory"


查看當前的工作:git-diff


git-diff 命令將比較當前的工作目錄和版本庫資料庫中的差異。現在我們編輯一些檔來體驗一下 git 的跟蹤功能。


$ echo "It's a new day for git" >> hello


我們再來比較一下,當前的工作目錄和版本庫中的資料的差別。


$ git-diff


差異將以典型的 patch 方式表示出來:


diff --git a/hello b/hello


index a5c1966..bd9212c 100644


--- a/hello


+++ b/hello


@@ -1 +1,2 @@


 Hello, world


+It's a new day for git


此時,我們可以再次使用組合命令 git-update-index git-commit 將我們的工作提交到版本庫中。


$ git-update-index hello


$ git-commit -m "new day for git"


實際上,如果要提交的檔都是已經納入 git 版本庫的檔,那麼不必為這些檔都應用 git-update-index 命令之後再進行提交,下面的命令更簡捷並且和上面的命令是等價的。


$ git-commit -a -m "new day for git"


管理分支:git-branch


直至現在為止,我們的項目版本庫一直都是只有一個分支 master。在 git 版本庫中建立分支的成本幾乎為零,所以,不必吝嗇多建立幾個分支。下面列舉一些常見的分支策略,僅供大家參考:


·         建立一個屬於自己的個人工作分支,以避免對主分支 master 造成太多的干擾,也方便與他人交流協作。


·         當進行高風險的工作時,建立一個試驗性的分支,扔掉一個爛攤子總比收拾一個爛攤子好得多。


·         合併別人的工作的時候,最好是建立一個臨時的分支,關於如何用臨時分支合併別人的工作的技巧,將會在後面講述。


建立分支


下面的命令將建立我自己的工作分支,名叫 robin,並且將以後的工作轉移到這個分支上開展。


$ git-branch robin


$ git-checkout robin


刪除分支


要刪除版本庫中的某個分支,使用 git-branch -D 命令就可以了,例如:


$ git-branch -D branch-name


查看分支


執行下面的命令可以得到你當前工作目錄的分支清單:


$ git-branch


如果你忘記了你現在工作在哪個分支上,執行下面的命令可以告訴你:


$ cat .git/HEAD


查看項目的發展變化和比較差異


這一節介紹幾個查看專案的版本庫的發展變化以及比較差異的很有用的命令:


git-show-branch


git-diff


git-whatchanged


 


我們現在為 robin, master 兩個分支都增加一些內容。


$ git-checkout robin


$ echo "Work, work, workd" >> hello


$ git-commit -m "Some workd" -i hello


$ git-checkout master


$ echo "Play, play, play" >> hello


$ echo "Lots of fun" >> example


$ git-commit -m "Some fun" -i hello example


git-show-branch 命令可以使我們看到版本庫中每個分支的世系發展狀態,並且可以看到每次提交的內容是否已進入每個分支。


$ git-show-branch


這個命令讓我們看到版本庫的發展記錄。


* [master] Some fun


 ! [robin] some work


--


*  [master] Some fun


 + [robin] some work


*+ [master^] a new day for git


譬如我們要查看世系標號為 master^ robin 的版本的差異情況,我們可以使用這樣的命令:


$ git-diff master^ robin


我們可以看到這兩個版本的差異:


diff --git a/hello b/hello


index 263414f..cc44c73 100644


--- a/hello


+++ b/hello


@@ -1,2 +1,3 @@


 Hello World


 It's a new day for git


+Work, work, work


Note


關於 GIT 版本世系編號的定義,請參看 git-rev-parse



我們現在再用 git-whatchanged 命令來看看 master 分支是怎麼發展的。


$ git-checkout master


$ git-whatchanged


diff-tree 1d2fa05... (from 3ecebc0...)


Author: Vortune.Robin


Date:   Tue Mar 21 02:24:31 2006 +0800


 


    Some fun


 


:100644 100644 f24c74a... 7f8b141... M  example


:100644 100644 263414f... 06fa6a2... M  hello


 


diff-tree 3ecebc0... (from 895f09a...)


Author: Vortune.Robin


Date:   Tue Mar 21 02:17:23 2006 +0800


 


    a new day for git


 


:100644 100644 557db03... 263414f... M  hello


從上面的內容中我們可以看到,在 robin 分支中的日誌為 "Some work" 的內容, 並沒有在 master 分支中出現。



    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()