Git 是一個分佈式版本控制工具,它的做者 Linus Torvalds 是這樣給咱們介紹 Git —— The stupid content tracker(傻瓜式的內容跟蹤器)php
一、 Git 背景html
Git 最初由Linus Torvalds編寫,用於 Linux 內核開發的版本控制工具。java
Git 與經常使用的版本控制工具 CVS、Subversion 等不一樣,它採用了分佈式版本庫的方式,沒必要服務器端軟件支持,使源代碼的發佈和交流極其方便。 linux
Git 的速度很快,這對於諸如 Linux kernel 這樣的大項目來講天然很重要,Git 最爲出色的是它的合併跟蹤(merge tracing)能力。git
實 際上內核開發團隊決定開始開發和使用 Git 來做爲內核開發的版本控制系統的時候,世界開源社羣的反對聲音很多,最大的理由是 Git 太艱澀難懂,從 Git 的內部工做機制來講,的確是這樣。可是隨着開發的深刻,Git 的正常使用都由一些友好的腳本命令來執行,使 Git 變得很是好用,即便是用來管理咱們本身的開發項目,Git 都是一個友好、有力的工具。如今,愈來愈多的著名項目採用 Git 來管理項目開發,例如:wine、hiphop-php 等。github
Git 做 爲開源自由原教旨主義項目,沒有對版本庫的瀏覽和修改作任何的權限限制,但經過其餘工具也能夠達到有限的權限控制,好比:gitosis、 CodeBeamer MR。本來 Git的使用範圍只適用於 Linux / Unix 平臺,但逐步併成熟了在 Windows 平臺下的使用,主要歸功於Cygwin與msysgit環境與TortoiseGit這樣易用的 GUI 工具。其實 Git 的源代碼中已經加入了對 Cygwin 與 MinGW 編譯環境的支持並被逐步完善,對於 Windows 使用者是個福音。web
二、 爲何選擇Git算法
流行的軟件版本開源管理軟件,有CVS、SVN、GIT版本管理工具,Git的優點在哪裏呢?apache
Git 入門教程,請查看個人百度空間博客:Blogwindows
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 的優點主要有:
一、更方便的 Merge
分 布式管理必然致使大量的 Branch 和 Merge 操做。所以分佈式版本控制系統都特別注意這方面。在傳統的 CVS 裏面制 做 Branch 和 Merge 簡直就是噩夢,Subversion 做爲一個用於替代 CVS 的系統,專門改進了 Branch 操做。然而彷佛 人們沒有注意到,Branch 是輕鬆了,但是 Merge 呢?若是不能很方便地 Merge 回來,作 Branch 仍然是噩夢。事實上,我就經歷 過在開發團隊裏面因爲隊友操做不對而在 Merge 的時候把個人許多代碼都覆蓋掉了。當時正是使用的 subversion 。雖然源代碼仍然在歷史裏 面,可是要去一個一個地找出被覆蓋掉的文件並恢復過來確實是一件很難忘的事情。
二、更方便的管理
傳統的版本控制系統使用中央倉庫,一些倉庫相關的管理就只能在倉庫上進行。賦予開發團隊每個人中央倉庫的管理權限是很是很差的。可是有時候確實會比較不方便的地方。
三、更健壯的系統
分佈式系統通常狀況下老是比單服務端的系統要健壯,由於當服務端一旦掛掉了整個系統就不能運行了。然而分佈式系統一般不會由於一兩個節點而受到影響。
四、對網絡的依賴性更低
雖 然如今網絡很是普及,可是並非隨時隨地都有高速網絡,甚至有時候根本沒有網絡能夠訪問。低速的網絡會讓人心情煩躁,有時候就呆呆地盯着屏幕上 的 commit 進度,什麼事情也幹不了。而沒有網絡鏈接更是致命的:你沒法 commit !這表示你進行任何改動之前都必須當心翼翼,不然你可能再 也找不會你曾經寫的一些代碼了。
五、更少的「倉庫污染」
有 時候你要作一個模塊,它不是太大,因此沒有必要爲它新建一個 branch ,可是它又不是那麼小,不可能一次提交就作好。因而便會提交一些不完整的代碼 到倉庫,有時候會致使整個程序沒法運行,嚴重影響團隊裏其餘人的開發。大多數人在這種狀況下的解決辦法都是寫完以後再提交。可是做爲習慣了版本控制的人來 說,進行不計後果的大幅修改是常常的事情,到後來忽然發現本身先前的代碼沒有提交,就後悔莫及了。若是是分佈式系統的話就不會存在這樣的問題,由於本地倉 庫的修改不會影響到別人的倉庫。當你完成並測試之後,就能夠在郵件列表裏面說:我已經把這個模塊作好了。而後感興趣的人就能夠從你這裏 pull 你的成 果了。
雖然網上各類對Git的譽美之詞決不止於此,可是在Git的主站上,仍是儘量客觀的對Git和Subversion進行了一番比較(GitSvnComparsion)。另外,Subversion目前經過 SVK 也已經提供了必定程度上的源代碼庫分佈式的管理能力,可以實現源代碼的離線提交等功能。
三、 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與SVN 的區別
Git 不只僅是個版本控制系統,它也是個內容管理系統(CMS)、工做管理系統等。若是你曾是一個使用過SVN背景的人,那麼你能夠很容易的作必定的思想轉換,來適應Git提供的一些概念和特徵。這篇文章的主要目的就是經過介紹Git能作什麼,以及它和SVN在深層次上究竟有什麼不一樣,經過比較來幫助你更好的認識Git
這是Git和其它非分佈式的版本控制系統(SVN,CVS)最核心的區別。若是你能理解這個概念,那麼你就已經上手一半了。須要作一點聲明,Git並非目前第一個或惟一的分佈式版本控制系統。還有一些系統如 Bitkeeper, Mercurial 等也是運行在分佈式模式上的,但Git在這方面作的更好,並且有更多強大的功能特徵。
Git 跟SVN同樣有本身的集中式版本庫或服務器。但 Git 更傾向於被使用於分佈式模式,也就是每一個開發人員從中心版本庫的服務器上chect out代碼後會在本身的機器上克隆一個本身的版本庫。能夠這樣說,若是你被困在一個不能鏈接網絡的地方時,就像在飛機上,地下室,電梯裏等,你仍然可以提交文件,查看歷史版本記錄,建立項目分支等。對一些人來講,這好像沒多大用處,但當你忽然遇到沒有網絡的環境時,這個將解決你的大麻煩。
一樣,這種分佈式的操做模式對於開源軟件社區的開發來講也是個巨大的恩賜,你沒必要再像之前那樣作出補丁包,經過email方式發送出去,你只須要建立一個分支,向項目團隊發送一個推請求。這能讓你的代碼保持最新,並且不會在傳輸過程當中丟失,一個這樣的優秀案例就是: GitHub.com
有些謠言傳出來講subversion未來的版本也會基於分佈式模式。但至少目前還看不出來。
所 有的資源控制系統都是把文件的元信息隱藏在一個相似.svn、.cvs等的文件夾裏。若是你把 .git 目錄的體積大小跟.svn比較,你會發現它們差距很大。由於 .git 目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上全部的東西,例如標籤、分支、版本記錄等。
分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。若是你想知道是否合併了一個分支,你須要手工運行像這樣的命令svn propget svn:mergeinfo,來確認代碼是否被合併。因此,常常會發生有些分支被遺漏的狀況。
然而,處理Git 的分支倒是至關的簡單和有趣,你能夠從同一個工做目錄下快速的在幾個分支間切換。你很容易發現未被合併的分支,你能簡單而快捷的合併這些文件。
目前爲止這是跟SVN相比GIT缺乏的最大的一個特徵。你也知道,SVN的版本號實際是任何一個相應時間的源代碼快照,它是從CVS進化到SVN的最大的一個突破。Git 可使用SHA-1來惟一的標識一個代碼快照,但這個並不能徹底的代替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 命令參數及用法詳解)
四、 Git 在Windows上的使用
Git 是爲Linux而生的,其最初建立人就是Linux的創始人—— Linus Torvalds
Linux環境下,使用Git 與任何Linux中的命令行工具沒有什麼區別,甚至在擊鍵數上還有明顯的優點。
Windows環境下,使用Git在目前看來只有兩種方法:
一、使用 Cygwin(一個在Windows上運行的Linux環境)
二、使用 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 "username@email.com" -t rsa
說明:username@email.com 須要更換成你本身的email地址
程序將提出一些問題,接受文件默認存放位置,當要求輸入pass phrase時,若是本機安全沒有問題,也能夠不輸入。找到當時制定的文件存儲位置中id_rsa.pub文件,這就是在GitHub上申請賬戶時須要使用的SSH公鑰文件。
在github.com的register中選擇Free account,在後續的界面中按照要求填入相應的內容便可完成註冊,很簡單的。
五、 Git 服務相關
一、 創建Git遠程服務器:
目前貌似尚未在Windows上創建Git服務器的,足見Linux在開源社區裏強大的優點啊!^_^
Hosting Git repositories, The Easy (and Secure) Way :gitosis
二、 基於Git的源代碼託管
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
三、 關於Git的有用的聯結:
Git-scm:go url
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
注:本文原文,請見我在百度空間的博客 Windows環境中使用版本管理工具Git
參考推薦:
Git 經常使用命令(圖表)
Git詳解之一:Git起步(系列教程,推薦)