Git 是一個分佈式版本號控制工具。它的做者 Linus Torvalds 是這樣給咱們介紹 Git —— The stupid content tracker(傻瓜式的內容跟蹤器)php
一、 Git 背景html
Git 最初由Linus Torvalds編寫,用於 Linux 內核開發的版本號控制工具。java
Git 與常用的版本號控制工具 CVS、Subversion 等不一樣,它採用了分佈式版本號庫的方式,沒必要server端軟件支持。使源碼的公佈和交流極其方便。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 和 CVS、SVN不一樣。是一個分佈式的源碼管理工具,它很是強,也很是快,Linux內核的代碼就是用Git管理的,它給咱們帶來的直接優勢有:windows
1. 初始化。git init, git commit -a, 就完了。
對於隨便寫兩行代碼就要放到代碼管理工具裏的人來講,再合適只是。
也可以拿git作備份系統,或者同步兩臺機器的文檔,都很是方便。
2. 絕大部分操做在本地完畢,不用和集中的代碼管理server交互,最終可以隨時隨地大膽地check in代碼了。
僅僅有最終完畢的版本號才需要向一箇中心的集中的代碼管理server提交。
3. 每次提交都會對所有代碼建立一個惟一的commit id。不像CVS那樣都是對單個文件分別進行版本號的更改。
因此你可以一次性將某次提交前的所有代碼check出來,而不用考慮究竟提交過那些文件。
(事實上SVN也可以作到這點)
4. branch管理easy多了。無論是創建新的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常用命令 和 SVNserver配置)
眼下Google Code支持SVN、Git、Mercurial三種方式,好比:我上傳的 linux-kernel-source(Git 方式)、sdk-java(SVN方式)。那麼它們各有什麼差異呢?
Git與CVS 的差異
Git與SVN 的差異
Git 不不過個版本號控制系統,它也是個內容管理系統(CMS)、工做管理系統等。
假設你曾是一個使用過SVN背景的人,那麼你可以很是easy的作必定的思想轉換。來適應Git提供的一些概念和特徵。這篇文章的主要目的就是經過介紹Git能作什麼,以及它和SVN在深層次上到底有什麼不一樣。經過比較來幫助你更好的認識Git
這是Git和其餘非分佈式的版本號控制系統(SVN。CVS)最核心的差異。假設你能理解這個概念。那麼你就已經上手一半了。
需要作一點聲明。Git並不是眼下第一個或惟一的分佈式版本號控制系統。另外一些系統如 Bitkeeper, Mercurial 等也是執行在分佈式模式上的,但Git在這方面作的更好,而且有不少其餘強大的功能特徵。
Git 跟SVN同樣有本身的集中式版本號庫或server。
但 Git 更傾向於被使用於分佈式模式,也就是每個開發者從中心版本號庫的server上chect out代碼後會在本身的機器上克隆一個本身的版本號庫。能夠這樣說,假設你被困在一個不能鏈接網絡的地方時,就像在飛機上,地下室,電梯裏等。你仍然能夠提交文件,查看歷史版本號記錄,建立項目分支等。對一些人來講。這好像沒多大用處。但當你忽然遇到沒有網絡的環境時,這個將解決你的大麻煩。
相同,這種分佈式的操做模式對於開源軟件社區的開發來講也是個巨大的恩賜。你沒必要再像曾經那樣作出補丁包。經過email方式發送出去,你僅僅需要建立一個分支。向項目團隊發送一個推請求。這能讓你的代碼保持最新,而且不會在傳輸過程當中丟失。一個這種優秀案例就是: GitHub.com
有些謠言傳出來講subversion未來的版本號也會基於分佈式模式。但至少眼下還看不出來。
所有的資源控制系統都是把文件的元信息隱藏在一個相似.svn、.cvs等的文件夾裏。假設你把 .git 文件夾的體積大小跟.svn比較。你會發現它們差距很是大。因爲 .git 文件夾是處於你的機器上的一個克隆版的版本號庫,它擁有中心版本號庫上所有的東西,好比標籤、分支、版本號記錄等。
分支在SVN中一點不特別,就是版本號庫中的另外的一個文件夾。假設你想知道是否合併了一個分支。你需要手工執行像這種命令svn propget svn:mergeinfo,來確認代碼是否被合併。因此,經常會發生有些分支被遺漏的狀況。
然而,處理Git 的分支倒是至關的簡單和有趣,你可以從同一個工做文件夾下高速的在幾個分支間切換。你很是easy發現未被合併的分支,你能簡單而快捷的合併這些文件。
眼下爲止這是跟SVN相比GIT缺乏的最大的一個特徵。
你也知道,SVN的版本實際是不論什麼一個對應時間的源碼快照,它是從CVS進化到SVN的最大的一個突破。Git 可以使用SHA-1來惟一的標識一個代碼快照,但這個並不能全然的取代SVN裏easy閱讀的數字版本。
Git 的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時減小對版本號庫的破壞。這有一個很是好的關於Git 內容完整性的討論。(英文原文參考:diff)
CVS-SVN-GIT綜合比較
首先,介紹幾個版本號控制軟件相互比較的重要根據:
(1)版本號庫模型(Repository model):描寫敘述了多個源代碼版本號庫副本間的關係,有client/server和分佈式兩種模式。在client/server模式下,每一用戶經過client訪問位於server的主版本號庫,每一客戶機僅僅需保存它所關注的文件副本。對當前工做副本(working copy)的更改僅僅有在提交到server以後,其餘用戶才幹看到相應文件的改動。而在分佈式模式下,這些源代碼版本號庫副本間是對等的實體,用戶的機器出了保存他們的工做副本外。還擁有本地版本號庫的歷史信息。
(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版本號。以取得更好的使用效果。
安裝的過程很是easy,基本上可以使用默認設置。僅僅是在設置路徑的時候要注意一下,爲了不與Windows路徑致使的意外狀況,仍是使用「Use Git Bash Only」比較安全。
Msysgit有命令行和圖形UI兩種使用方式,依據你的喜愛選擇吧,要說的是,圖形UI可能不能完畢所有的工做,所以在某些狀況下(好比建立SSH Key),命令行仍是不可缺乏的。Msysgit的Bash命令行對中文的支持很差。所有的中文字符都顯示成了「?」。
所以,爲了不麻煩,最好避免使用中文的文件名稱、文件夾名和username等
Msysgit 圖形界面例如如下:
(原文。請參考我在百度空間的博客:Git 界面GUI和命令行Command兩種操做方式)
(3) 設定GitHub
要使用GitHub,首先需要建立SSH Key,SSH將用來加密本機與遠端server之間的通訊,同一時候也是識別你對代碼所作的變動的方法。
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,在興許的界面中依照要求填入對應的內容就能夠完畢註冊,很是easy的。
五、 Git 服務相關
一、 創建Git遠程server:
眼下貌似尚未在Windows上創建Gitserver的。足見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