03.05 如Git、SVN這類版本控制工具的原理是什麼,以及如何操作?

Figo筆記


Git是Linus之父 Torvalds 為了管理 Linux 內核代碼設計而開發的一個開源的版本控制系統。



Linux核心的開發迭代是由眾多分散的程序員完成。當時大家常用的代碼管理工具BitKeeper,因為不開源,引起我們的linux大佬強烈的不滿,但又讚許BitKeeper的優於其他工具的分佈式架構,索性Torvalds自己開發了代碼管理工具,就是GIT。聽說從無到實戰部署只花了10天時間。



而GIT與Svn最核心的區別就是GIT是分佈式架構平臺。而相對於Svn只是一個單純的文件版本管理系統而言,GIT更是一個內容管理平臺,版本控制甚至只是一個次屬功能。

我們瞭解GIT的結構就大致知道其工作原理。git分3個數據存儲區:

工作區:存放項目文件。

暫存區:臨時存放的改動數據,即將提交到倉庫。

git倉庫:最後存放文件版本的倉庫。

工作原理及主要操作命令:

對工作區修改(或新增)- git add 。暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到一個新對象,而該對象的ID被記錄在暫存區的文件索引中。

執行提交操作 - git commit。暫存區的目錄樹寫到版本庫中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。

重置暫存區 - git reset HEAD。暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

刪除暫存區 - git rm --cached 。會直接從暫存區刪除文件,工作區則不做出改變。

暫存區文件覆蓋工作區 - git checkout 。會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。

版本master分支文件覆蓋暫存區和工作區 - git checkout HEAD ,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令極具危險性:因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。



至於svn,目前我用的極少,操作比git 簡單,兩者區別:

  1. GIT是分佈式的,SVN只有一箇中央版本庫。
  2. GIT把內容按元數據方式存儲,而SVN是按文件方式。
  3. Git下載下來後,在OffLine狀態下可以看到所有的Log,SVN不可以。
  4. GIT沒有一個全局的版本號,而SVN有,此點是svn的優點。
  5. SVN只能有一個指定中央版本庫。當這個中央版本庫有問題時,所有工作成員會沿襲錯誤。而 Git可以有無限個版本庫。
  6. GIT的內容完整性要優於SVN。GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

iFrees


Git 和svn的最大區別以及Git原理介紹

Git是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持。

一、Git 與 SVN 區別

GIT不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等。

如果你是一個具有使用SVN背景的人,你需要做一定的思想轉換,來適應GIT提供的一些概念和特徵。

Git 與 SVN 區別點:

1、GIT是分佈式的,SVN不是:這是GIT和其它非分佈式的版本控制系統,例如SVN,CVS等,最核心的區別。

2、GIT把內容按元數據方式存儲,而SVN是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似.svn,.cvs等的文件夾裡。

3、GIT分支和SVN的分支不同:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。

4、GIT沒有一個全局的版本號,而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個特徵。

5、GIT的內容完整性要優於SVN:GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

二、Git原理:Git 工作區、暫存區和版本庫

基本概念

我們先來理解下Git 工作區、暫存區和版本庫概念

工作區:就是你在電腦裡能看到的目錄。

暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。

版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

三、Git常用操作指南

使用Git前,需要先建立一個倉庫(repository)。您可以使用一個已經存在的目錄作為Git倉庫或創建一個空目錄。

使用您當前目錄作為Git倉庫,我們只需使它初始化。

git init

使用我們指定目錄作為Git倉庫。

git init newrepo

從現在開始,我們將假設您在Git倉庫根目錄下,除非另有說明。

添加新文件

我們有一個倉庫,但什麼也沒有,可以使用add命令添加文件。

git add filename

可以使用add... 繼續添加任務文件。

提交版本

現在我們已經添加了這些文件,我們希望它們能夠真正被保存在Git倉庫。

為此,我們將它們提交到倉庫。

git commit -m "Adding files"

如果您不使用-m,會出現編輯器來讓你寫自己的註釋信息。

當我們修改了很多文件,而不想每一個都add,想commit自動來提交本地修改,我們可以使用-a標識。

git commit -a -m "Changed some files"

git commit 命令的-a選項可將所有被修改或者已刪除的且已經被git管理的文檔提交到倉庫中。

千萬注意,-a不會造成新文件被提交,只能修改。

發佈版本

我們先從服務器克隆一個庫並上傳。

git clone ssh://example.com/~/www/project.git

現在我們修改之後可以進行推送到服務器。

git push ssh://example.com/~/www/project.git

取回更新

如果您已經按上面的進行push,下面命令表示,當前分支自動與唯一一個追蹤分支進行合併。

git pull

從非默認位置更新到指定的url。

git pull http://git.example.com/project.git

刪除

如何你想從資源庫中刪除文件,我們使用rm。

git rm file

分支與合併

分支在本地完成,速度快。要創建一個新的分支,我們使用branch命令。

git branch test

branch命令不會將我們帶入分支,只是創建一個新分支。所以我們使用checkout命令來更改分支。

git checkout test

第一個分支,或主分支,被稱為"master"。

git checkout master

對其他分支的更改不會反映在主分支上。如果想將更改提交到主分支,則需切換回master分支,然後使用合併。

git checkout mastergit merge test

如果您想刪除分支,我們使用-d標識。

git branch -d test


塵風沐雨


還不如實際去用用


分享到:


相關文章: