-
1 # 塵風沐雨Alick
-
2 # 風行科技說
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 checkout 。會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動。
版本master分支檔案覆蓋暫存區和工作區 - git checkout HEAD ,會用 HEAD 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令極具危險性:因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。
至於svn,目前我用的極少,操作比git 簡單,兩者區別:
GIT是分散式的,SVN只有一箇中央版本庫。 GIT把內容按元資料方式儲存,而SVN是按檔案方式。 Git下載下來後,在OffLine狀態下可以看到所有的Log,SVN不可以。 GIT沒有一個全域性的版本號,而SVN有,此點是svn的優點。SVN只能有一個指定中央版本庫。當這個中央版本庫有問題時,所有工作成員會沿襲錯誤。而 Git可以有無限個版本庫。 GIT的內容完整性要優於SVN。GIT的內容儲存使用的是SHA-1雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。
回覆列表
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"
千萬注意,-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
git rm file
分支與合併
分支在本地完成,速度快。要建立一個新的分支,我們使用branch命令。
git branch test
branch命令不會將我們帶入分支,只是建立一個新分支。所以我們使用checkout命令來更改分支。
git checkout test
第一個分支,或主分支,被稱為"master"。
git checkout master
對其他分支的更改不會反映在主分支上。如果想將更改提交到主分支,則需切換回master分支,然後使用合併。
git checkout mastergit merge test
git branch -d test