Git版本管理工具

轉載文章《Git版本管理工具(一)》

Git 是一個分佈式版本控制工具,它的作者 Linus Torvalds 是這樣給我們介紹 Git  —— The stupid content tracker(傻瓜式的內容跟蹤器)

1、 Git 背景

Git 最初由Linus Torvalds編寫,用於 Linux 內核開發的版本控制工具。

Git 與常用的版本控制工具 CVSSubversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持,使源代碼的發佈和交流極其方便。 

Git 的速度很快,這對於諸如 Linux kernel 這樣的大項目來說自然很重要,Git 最爲出色的是它的合併跟蹤(merge tracing)能力。

實際上內核開發團隊決定開始開發和使用 Git 來作爲內核開發的版本控制系統的時候,世界開源社羣的反對聲音不少,最大的理由是 Git 太艱澀難懂,從 Git 的內部工作機制來說,的確是這樣。但是隨着開發的深入,Git 的正常使用都由一些友好的腳本命令來執行,使 Git 變得非常好用,即使是用來管理我們自己的開發項目,Git 都是一個友好、有力的工具。現在,越來越多的著名項目採用 Git 來管理項目開發,例如:winehiphop-php 等。

Git 作爲開源自由原教旨主義項目,沒有對版本庫的瀏覽和修改做任何的權限限制,但通過其他工具也可以達到有限的權限控制,比如:gitosis、CodeBeamer MR。原本 Git的使用範圍只適用於 Linux / Unix 平臺,但逐步併成熟了在 Windows 平臺下的使用,主要歸功於Cygwin與msysgit環境與TortoiseGit這樣易用的 GUI 工具。其實 Git 的源代碼中已經加入了對 Cygwin 與 MinGW 編譯環境的支持並被逐步完善,對於 Windows 使用者是個福音。

2、 爲什麼選擇Git

流行的軟件版本開源管理軟件,有CVS、SVN、GIT版本管理工具,Git的優勢在哪裏呢?

Git 入門教程,請查看我的百度空間博客:Blog

Git 和 CVS、SVN不同,是一個分佈式的源代碼管理工具,它很強,也很快,Linux內核的代碼就是用Git管理的,它給我們帶來的直接好處有:

1. 初始化,git init, git commit -a, 就完了。對於隨便寫兩行代碼就要放到代碼管理工具裏的人來說,再合適不過。也可以拿git做備份系統,或者同步兩臺機器的文檔,都很方便。

2. 絕大部分操作在本地完成,不用和集中的代碼管理服務器交互,終於可以隨時隨地大膽地check in代碼了。 只有最終完成的版本才需要向一箇中心的集中的代碼管理服務器提交。

3. 每次提交都會對所有代碼創建一個唯一的commit id。不像CVS那樣都是對單個文件分別進行版本的更改。所以你可以一次性將某次提交前的所有代碼check出來,而不用考慮到底提交過那些文件。(其實SVN也可以做到這點)

4. branch管理容易多了,無論是建立新的branch,還是在branch之間切換都一條命令完成,不需要建立多餘的目錄。

5. branch之間merge時,不僅代碼會merge在一起,check in歷史也會保留,這點非常重要。

Git 的優勢主要有:

1、更方便的 Merge

分佈式管理必然導致大量的 Branch 和 Merge 操作。因此分佈式版本控制系統都特別注意這方面。在傳統的 CVS 裏面製作 Branch 和 Merge 簡直就是噩夢,Subversion 作爲一個用於替代 CVS 的系統,專門改進了 Branch 操作。然而似乎人們沒有注意到,Branch 是輕鬆了,可是 Merge 呢?如果不能很方便地 Merge 回來,做 Branch 仍然是噩夢。事實上,我就經歷過在開發團隊裏面由於隊友操作不對而在 Merge 的時候把我的許多代碼都覆蓋掉了。當時正是使用的 subversion 。雖然源代碼仍然在歷史裏面,但是要去一個一個地找出被覆蓋掉的文件並恢復過來確實是一件很難忘的事情。

2、更方便的管理

傳統的版本控制系統使用中央倉庫,一些倉庫相關的管理就只能在倉庫上進行。賦予開發團隊每一個人中央倉庫的管理權限是非常不好的。但是有時候確實會比較不方便的地方。

3、更健壯的系統

分佈式系統一般情況下總是比單服務端的系統要健壯,因爲當服務端一旦掛掉了整個系統就不能運行了。然而分佈式系統通常不會因爲一兩個節點而受到影響。

4、對網絡的依賴性更低

雖然現在網絡非常普及,但是並不是隨時隨地都有高速網絡,甚至有時候根本沒有網絡可以訪問。低速的網絡會讓人心情煩躁,有時候就呆呆地盯着屏幕上的 commit 進度,什麼事情也幹不了。而沒有網絡連接更是致命的:你無法 commit !這表示你進行任何改動以前都必須小心翼翼,否則你可能再也找不會你曾經寫的一些代碼了。

5、更少的“倉庫污染”

有時候你要做一個模塊,它不是太大,所以沒有必要爲它新建一個 branch ,但是它又不是那麼小,不可能一次提交就做好。於是便會提交一些不完整的代碼到倉庫,有時候會導致整個程序無法運行,嚴重影響團隊裏其他人的開發。大多數人在這種情況下的解決辦法都是寫完之後再提交。但是作爲習慣了版本控制的人來說,進行不計後果的大幅修改是經常的事情,到後來突然發現自己先前的代碼沒有提交,就後悔莫及了。如果是分佈式系統的話就不會存在這樣的問題,因爲本地倉庫的修改不會影響到別人的倉庫。當你完成並測試以後,就可以在郵件列表裏面說:我已經把這個模塊做好了。然後感興趣的人就可以從你這裏 pull 你的成果了。

雖然網上各種對Git的譽美之詞決不止於此,但是在Git的主站上,還是儘可能客觀的對Git和Subversion進行了一番比較(GitSvnComparsion)。另外,Subversion目前通過 SVK 也已經提供了一定程度上的源代碼庫分佈式的管理能力,能夠實現源代碼的離線提交等功能。

3、 Git 、CVS、SVN比較

項目源代碼的版本管理工具中,比較常用的主要有:CVS、SVN、Git 和 Mercurial  (其中,關於SVN,請參見我先前的博客:SVN常用命令 和 SVN服務器配置

目前Google Code支持SVN、Git、Mercurial三種方式,例如:我上傳的 linux-kernel-source(Git 方式)、sdk-java(SVN方式),那麼它們各有什麼區別呢?

Git與CVS 的區別 

  • 分支更快、更容易。
  • 支持離線工作;本地提交可以稍後提交到服務器上。
  • Git 提交都是原子的,且是整個項目範圍的,而不像 CVS 中一樣是對每個文件的。
  • Git 中的每個工作樹都包含一個具有完整項目歷史的倉庫。
  • 沒有哪一個 Git 倉庫會天生比其他倉庫更重要。

Git與SVN 的區別

Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS)、工作管理系統等。如果你曾是一個使用過SVN背景的人,那麼你可以很容易的做一定的思想轉換,來適應Git提供的一些概念和特徵。這篇文章的主要目的就是通過介紹Git能做什麼,以及它和SVN在深層次上究竟有什麼不同,通過比較來幫助你更好的認識Git

  1. Git是分佈式的,SVN不是

    這是Git和其它非分佈式的版本控制系統(SVN,CVS)最核心的區別。如果你能理解這個概念,那麼你就已經上手一半了。需要做一點聲明,Git並不是目前第一個或唯一的分佈式版本控制系統。還有一些系統如 BitkeeperMercurial 等也是運行在分佈式模式上的,但Git在這方面做的更好,而且有更多強大的功能特徵。

    Git 跟SVN一樣有自己的集中式版本庫或服務器。但 Git 更傾向於被使用於分佈式模式,也就是每個開發人員從中心版本庫的服務器上chect out代碼後會在自己的機器上克隆一個自己的版本庫。可以這樣說,如果你被困在一個不能連接網絡的地方時,就像在飛機上,地下室,電梯裏等,你仍然能夠提交文件,查看歷史版本記錄,創建項目分支等。對一些人來說,這好像沒多大用處,但當你突然遇到沒有網絡的環境時,這個將解決你的大麻煩。

    同樣,這種分佈式的操作模式對於開源軟件社區的開發來說也是個巨大的恩賜,你不必再像以前那樣做出補丁包,通過email方式發送出去,你只需要創建一個分支,向項目團隊發送一個推請求。這能讓你的代碼保持最新,而且不會在傳輸過程中丟失,一個這樣的優秀案例就是: GitHub.com 

    有些謠言傳出來說subversion將來的版本也會基於分佈式模式。但至少目前還看不出來。

  2. Git 把內容按元數據方式存儲,而SVN是按文件

    所有的資源控制系統都是把文件的元信息隱藏在一個類似.svn、.cvs等的文件夾裏。如果你把 .git 目錄的體積大小跟.svn比較,你會發現它們差距很大。因爲 .git 目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如標籤、分支、版本記錄等。

  3. Git 分支和SVN的分支不同

    分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。如果你想知道是否合併了一個分支,你需要手工運行像這樣的命令svn propget svn:mergeinfo,來確認代碼是否被合併。所以,經常會發生有些分支被遺漏的情況。

    然而,處理Git 的分支卻是相當的簡單和有趣,你可以從同一個工作目錄下快速的在幾個分支間切換。你很容易發現未被合併的分支,你能簡單而快捷的合併這些文件。

  4. Git 沒有一個全局的版本號,而SVN有

    目前爲止這是跟SVN相比GIT缺少的最大的一個特徵。你也知道,SVN的版本號實際是任何一個相應時間的源代碼快照,它是從CVS進化到SVN的最大的一個突破。Git 可以使用SHA-1來唯一的標識一個代碼快照,但這個並不能完全的代替SVN裏容易閱讀的數字版本號。

  5. Git 的內容完整性要優於SVN

    Git 的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。這有一個很好的關於Git 內容完整性的討論。(英文原文參考:diff

CVS-SVN-GIT綜合比較

首先,介紹幾個版本控制軟件相互比較的重要依據:

(1)版本庫模型(Repository model):描述了多個源碼版本庫副本間的關係,有客戶端/服務器和分佈式兩種模式。在客戶端/服務器模式下,每一用戶通過客戶端訪問位於服務器的主版本庫,每一客戶機只需保存它所關注的文件副本,對當前工作副本(working copy)的更改只有在提交到服務器之後,其它用戶才能看到對應文件的修改。而在分佈式模式下,這些源碼版本庫副本間是對等的實體,用戶的機器出了保存他們的工作副本外,還擁有本地版本庫的歷史信息。

(2)併發模式(Concurrency model):描述了當同時對同一工作副本/文件進行更改或編輯時,如何管理這種衝突以避免產生無意義的數據,有排它鎖和合並模式。在排它鎖模式下,只有發出請求並獲得當前文件排它鎖的用戶才能對對該文件進行更改。而在合併模式下,用戶可以隨意編輯或更改文件,但可能隨時會被通知存在衝突(兩個或多個用戶同時編輯同一文件),於是版本控制工具或用戶需要合併更改以解決這種衝突。因此,幾乎所有的分佈式版本控制軟件採用合併方式解決併發衝突。

(3)歷史模式(History model):描述瞭如何在版本庫中存貯文件的更改信息,有快照和改變集兩種模式。在快照模式下,版本庫會分別存儲更改發生前後的工作副本;而在改變集模式下,版本庫除了保存更改發生前的工作副本外,只保存更改發生後的改變信息。

(4)變更範圍(Scope of change):描述了版本編號是針對單個文件還是整個目錄樹。

(5)網絡協議(Network protocols):描述了多個版本庫間進行同步時採用的網絡協議。

(6)原子提交性(Atomic commit):描述了在提交更改時,能否保證所有更改要麼全部提交或合併,要麼不會發生任何改變。

(7)部分克隆(Partial checkout/clone):是否支持只拷貝版本庫中特定的子目錄。

名稱

版本庫模型

併發模式

歷史模式

變更範圍

網絡協議

原子提交性

部分克隆

CVS

Client-server

Merge

Changeset

File

Pserver,ssh

No

Yes

SVN

Client-server

3-way merge, recursive

merge, octopus merge

Changeset and Snapshot

Tree

custom (svn), custom (svn) over ssh,

HTTP and SSL (usingWebDAV)

Yes

Yes

Git

Distributed

Merge or lock

Snapshot

Tree

custom, custom over ssh, rsync,

HTTP/HTTPS, email, bundles

Yes

No


Trunk、Branches、Tags 區別:

Trunk:軟件開發過程中的主線,開發時版本存放的目錄,即在開發階段的代碼都提交到該目錄上,保存了從版本庫建立到當前的信息。 

Branches:軟件開發過程中的分支,發佈版本存放的目錄,即項目上線時發佈的穩定版本存放在該目錄中,保存了從版本庫的某一特定點(不一定是版本庫建立時)到當前的信息。

tags:表示標籤存放的目錄,tags只可讀,不可寫

分支主要用於在不影響Trunk其它用戶情況下進行一些關於新功能的探索性或實驗性的開發,待新功能完善後它也可以合併到Trunk中。

(原文,請參考我在百度空間的博客:Git 命令參數及用法詳解

 

 

4、 Git 在Windows上的使用

Git 是爲Linux而生的,其最初創建人就是Linux的創始人—— Linus Torvalds

Linux環境下,使用Git 與任何Linux中的命令行工具沒有什麼區別,甚至在擊鍵數上還有明顯的優勢。

Windows環境下,使用Git在目前看來只有兩種方法:

1、使用 Cygwin(一個在Windows上運行的Linux環境)

2、使用 msysgit(Windows下提供圖形界面和命令行)

Cygwin和msysgit的使用方法類似,Cygwin具有大量Linux的功能,如果只是想使用Git功能,msysgit還是最簡單和快速的方法。

爲了能夠具備通過互聯網實現與別人協作開發的能力,對於項目需要一個公開的源代碼託管服務。好在,現在已經有不少可以供我們選擇的,尤其是githost,更是一箇中文的源代碼託管服務提供方。從目前看來,在Githost上落戶的項目還很少,貌似是一個新近誕生的服務提供方。如果項目對服務提供的穩定性有比較高的要求的話,還是選擇較老的git源代碼託管服務比較好吧。如果是在局域網內工作的小組,要使用Git做源代碼管理,那就更簡單了,大家安裝好自己的Git,並指定一個人負責對Git版本庫進行管理就好了。

(1) GitHub簡介

GitHub是使用Ruby開發的,具有清爽的界面。

GitHub提供免費的源代碼庫託管,同時也提供付費的託管服務。通過付費私有庫託管服務在財務上支持免費部分的持續運營。

GitHub提供了一套獨特的代碼庫管理界面功能,並提供項目Wiki的能力。

GitHub提供了一系列的指南,官方網址:GitHub

 

(2)Windows系統上安裝Git

首先,下載並安裝msysgit程序:download

接着,安裝下載的 Git-1.7.10-preview20120409.exe,可以選擇最新的Git版本,以取得更好的使用效果。

安裝的過程很簡單,基本上可以使用默認設置。只是在設置路徑的時候要注意一下,爲了避免與Windows路徑導致的意外情況,還是使用“Use Git Bash Only”比較安全。

Msysgit有命令行和圖形UI兩種使用方式,根據你的喜好選擇吧,要說的是,圖形UI可能不能完成所有的工作,因此在某些情況下(例如創建SSH Key),命令行還是必不可少的。Msysgit的Bash命令行對中文的支持不好,所有的中文字符都顯示成了“?”。因此,爲了避免麻煩,最好避免使用中文的文件名、目錄名和用戶名等

Msysgit 圖形界面如下:

(原文,請參考我在百度空間的博客:Git 界面GUI和命令行Command兩種操作方式

(3) 設定GitHub

要使用GitHub,首先需要創建SSH Key,SSH將用來加密本機與遠端服務器之間的通信,同時也是識別你對代碼所做的變更的方法。

SSH Key可以使用Git命令行來產生,如果你已經有一個SSH Key,那麼在這裏也可以直接使用。

要使用Git創建SSH Key 首先需要打開Git Bash 命令行,輸入命令:

ssh-keygen  -C  "[email protected]"  -t  rsa

說明:[email protected] 需要更換成你自己的email地址

程序將提出一些問題,接受文件默認存放位置,當要求輸入pass phrase時,如果本機安全沒有問題,也可以不輸入。找到當時制定的文件存儲位置中id_rsa.pub文件,這就是在GitHub上申請帳戶時需要使用的SSH公鑰文件。

在github.com的register中選擇Free account,在後續的界面中按照要求填入相應的內容即可完成註冊,很簡單的。

5、 Git 服務相關

1、  建立Git遠程服務器:

目前貌似還沒有在Windows上建立Git服務器的,足見Linux在開源社區裏強大的優勢啊!^_^

Hosting Git repositories, The Easy (and Secure) Way :gitosis 

2、  基於Git的源代碼託管

Gitorious

Gitorious is another free hosting site with a custom web interface, supporting multiple repositories per project, local installations and with open source

repo.or.cz
repo.or.cz is the oldest hosting site, accommodating many hundreds of projects, with open-sourced infrastructure and aimed at open source software. It provides full push features as well as simple mirroring mode and gitweb interface with various enhancements. 

GitHub 
GitHub provides both free hosting for smaller projects and paid options for private hosting and large-sized projects. It uses a custom web interface including a wiki hosting and puts emphasis on social networking of project developers

3、  關於Git的有用的聯結:

Git-scm:官方中文文檔

Git Reference:go url

Git - SVN Crash Course:go url

Everyday GIT With 20 Commands Or So:go url

Git User's Manual (for version 1.5.3 or newer) :go url

Getting Started with Git and GitHub on Windows:go url

參考推薦:

Git 命令參數及用法詳解

Git 常用命令(圖表)

SVN 常用命令

SVN 服務器安裝

Git詳解之一:Git起步(系列教程,推薦)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章