1. 程式人生 > >Git 版本管理工具(一)

Git 版本管理工具(一)

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方式傳送出去,你只需要建立一個分支,向專案團隊傳送一個推請求。這能讓你的程式碼保持最新,而且不會在傳輸過程中丟失,一個這樣的優秀案例

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

  2. Git 把內容按元資料方式儲存,而SVN是按檔案

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

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

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

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

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

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

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

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

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

(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

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

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

Msysgit 圖形介面如下:


(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 is another free hosting site with a custom web interface, supporting multiple repositories per project, local installations and with open source


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 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: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

參考推薦:

相關推薦

Git 版本管理工具

Git 是一個分散式版本控制工具,它的作者 The stupid content tracker(傻瓜式的內容跟蹤器)1、 Git 背景Git 最初由Linus Torvalds編寫,用於 Linux 核心開發的版本控制工具。Git 與常用的版本控制工具 CVS、Subver

Git版本控制工具----git的安裝及建立版本

本文並非原創性文章。 【正文】 一、初識Git: Git是目前世界上最先進的分散式版本控制系統(沒有之一)。它的開發者就是大名鼎鼎的Linux作業系統的作者Linus Torvalds。Git被開發出來的初衷是為了更好的管理Linux核心,而現在卻廣泛應用於各種專案

[系列] 使用 go modules 包管理工具

目錄 概述 初始化 新增依賴包 go mod 命令 小結 原始碼地址 概述 我想實現一個開箱即用的 API 框架的輪子,這個輪子是基於 Gin 基

git版本管理使用-拉取分支程式碼

git系列文章 參考文章 *之前2篇是在github上操作的git版本管理,這篇是在開源中國·碼雲 上面的git版本管理。使用下來都差不多,暫時沒有發現不一樣的內容。 關於分支內程式碼的拉取的問題: 問題詳述:看下圖,我們一般都是

持續整合學習筆記-入門篇7成果管理自動化版本號的管理

經過自動化持續整合工作之後,一般會產生兩類重要成果: 1、提供給使用者使用的軟體產品 2、軟體設計、開發時產生的文件 毋庸置疑,軟體產品本來就是我們工作的目標物。在實際工作中,尤其是在給企業做定製化的MIS系統時,很難說只給使用者一次性提供產品,往往需要不斷升級,從而向客戶

Git | Git入門,成為專案管理大師

大家好,週一我們迎來了一個新的專題——git。 寫這個專題的初衷有兩點,第一點是覺得好像很少有公眾號提到git相關的技術,可能是覺得太基礎了看不上。但實際上git非常重要,在我們實際的開發工作當中使用的頻率也非常非常高。第二點是不少人git用的並不好,連同之前的我在內。而且用得不好也就算了,還意識不到它的重要

布局管理

lin 其中 bottom tom left near frame 屬性 strong 1.LinearLayout(線性布局) 讓所有的組件都成為單一的方向,即垂直的或者水平的(默認)。 android:layout_weight //該屬性控制水平和垂直方向

liuux 文件管理命令

linux文件管理命令 楚天逸 於平 linux Linux 文件管理命令(整理版 一 )1.cat: 用於八檔案串聯接後傳到基本輸出. 使用權限:所有使用者 語法格式: cat [-AbeEnstTuv] [--help] [--

Bug管理工具TCE之缺陷導入與導出

-1 選擇 相關配置 isp 系統 軟件 test left 導入   TestCenter Enterprise(簡稱TCE)是由上海澤眾軟件科技有限公司開發的一款面向測試流程的測試生命周期管理工具,可迅速建立完善的測試體系,規範測試流程,提高測試效率與質量,實現對測試的

java構建學生管理系統

class 管理系統 同時 進步 傳參 databases 什麽 界面 查看 用java搭建學生管理系統,重要還是對數據庫的操作,諸如增刪改查等。 1.基本的功能: 老師完成對學生信息的查看和修改,完成對班級的信息的概覽。 學生可以看自己的成績和對自己信息的修改。 學生和老

Linux下KVM的圖形界面管理工具WebVirtMgrWeb版

查看 sta bsp 創建 ron span rac post tsp WebVirtMgr面板 截圖 介紹 WebVirtMgr是一個基於libvirt的Web界面,用於管理虛擬機。它允許您創建和配置新域,並調整域的資源分

Git學習收獲

基於 系列 ini 控制 strong targe body tin ron 寫在前面:本系列均學習受教於廖雪峰前輩,基於windows系統; https://www.liaoxuefeng.com/   Git是一種先進的分布式版本控制系統。(據說是世界最先進)   版本

react搭建後臺管理系統

管理系 for menu port 文件中 segment 後臺管理 ans create 先準備工具:  yarn安裝:    npm install -g yarn #yarn也是包管理工具,只不過它構建效率更高    官方使用教程:https://yarnpkg.

scim 跨域身份管理介紹

light 場景 特定 for ear iii 全部 AS ID SCIM 全稱 System for Cross-domain Identity Management,主要用於多租戶的雲應用身份管理。 概覽 SCIM 2.0建立在一個對象模型上,所有SCIM對象都繼承Re

jdk命令行工具

too left failed ccsm enter gcc mon 如果 空間大小 1、概述   熟悉java開發的人應該都知道在jdk的bin目錄下有許多的工具,這些工具主要用於監視虛擬機和故障處理。這些故障處理工具被Sun公司稱作為“禮物”附贈給JDK的使用者,並在軟

配置和管理Zabbix

trigge zabbix serve 名稱 net rep accept discover 不同的 四、添加監控客戶端1、監控Linux服務器首先安裝zabbix-agent客戶端CentOS6客戶端: # rpm -ivh http://repo.zabbix.com/

從零搭建java後臺管理系統

pac 阿裏 stat 技術 user 日誌 代碼 最小 mbo 框架搭建 一、初步設想,使用springboot,框架打算用到依賴 spring web,devTools,mysql,Aspect,Redis,Lombok,Freemark,Shiro,Rabbitmq

Git工程開發實踐——Git基礎

其中 it管理 操作系統 linux發行版 ict src conflict 例如 行合並 Git工程開發實踐(一)——Git基礎 一、版本控制系統 1、版本控制系統簡介 版本控制系統(VCS,Version Control Systems)是一種記錄一個或若幹文件內容變化

利用數據庫管理工具Navicat導出數據到Excel表中

管理 分享圖片 navicat com ima inf excel表 bsp alt 如果只是想把數據庫表中數據簡單導出來,可以利用數據庫管理工具中的工具 1、先查詢 2、在查詢出結果中全選 3、導出向導 4、選擇Excel 5、選擇導出地址並命名 利用數據庫管理工

在ArcGIS中建立Python工具

ArcGIS Desktop 自帶有大量的工具,可以執行各種各樣的地理處理任務。通過 python 我們可以靈活地呼叫這些工具,把工具組織成自己的工作流,甚至建立一些新的工具。今天就說說在 ArcGIS 中建立 Python工具這個話題。 在 ArcGIS 中我們可以通過兩種方式來建立py