歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Git 版本管理工具

Git 版本管理工具

日期:2017/2/28 14:27:44   编辑:Linux教程

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

1、 Git 背景

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

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

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

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

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

2、 為什麼選擇Git

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

Git 入門教程,請查看 http://www.linuxidc.com/Linux/2014-09/107300.htm

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歷史也會保留,這點非常重要。

Linux git命令參數及用法詳解 http://www.linuxidc.com/Linux/2012-01/51205.htm

Fedora通過Http Proxy下載Git http://www.linuxidc.com/Linux/2009-12/23170.htm

在Ubuntu Server上安裝Git http://www.linuxidc.com/Linux/2009-06/20421.htm

服務器端Git倉庫的創建(Ubuntu) http://www.linuxidc.com/Linux/2011-02/32542.htm

Linux下Git簡單使用教程(以Android為例) http://www.linuxidc.com/Linux/2010-11/29883.htm

Git權威指南 PDF高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm

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。

目前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並不是目前第一個或唯一的分���式版本控制系統。還有一些系統如 Bitkeeper, Mercurial 等也是運行在分布式模式上的,但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)

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-09/107299p2.htm

Copyright © Linux教程網 All Rights Reserved