GIT不只僅是個版本控制系統,它也是個內容管理系統(CMS),工做管理系統等。
一、GIT是分佈式的,SVN不是:這是GIT和其它非分佈式的版本控制系統,例如SVN,CVS等,最核心的區別。
二、GIT把內容按元數據方式存儲,而SVN是按文件:全部的資源控制系統都是把文件的元信息隱藏在一個相似.svn,.cvs等的文件夾裏。
三、GIT分支和SVN的分支不一樣:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。
四、GIT沒有一個全局的版本號,而SVN有:目前爲止這是跟SVN相比GIT缺乏的最大的一個特徵。
五、GIT的內容完整性要優於SVN:GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時下降對版本庫的破壞。git
[root@localhost ~]# yum list |grep git git.x86_64 1.7.1-4.el6_7.1 centos6.7 git-all.noarch 1.7.1-4.el6_7.1 centos6.7 獲取其餘Git工具的元軟件包 git-cvs.noarch 1.7.1-4.el6_7.1 centos6.7 導入CVS庫的Git工具 git-daemon.x86_64 1.7.1-4.el6_7.1 centos6.7 共享你的版本庫,接受匿名下載請求 git-email.noarch 1.7.1-4.el6_7.1 centos6.7 經過電子郵件發送Git補丁 git-gui.noarch 1.7.1-4.el6_7.1 centos6.7 基於Tcl/Tk的圖形界面 git-svn.noarch 1.7.1-4.el6_7.1 centos6.7 導入SVN庫的Git工具 gitk.noarch 1.7.1-4.el6_7.1 centos6.7 更側重於項目歷史可視化的Git瀏覽器 gitweb.noarch 1.7.1-4.el6_7.1 centos6.7 在瀏覽器裏顯示Git版本庫 [root@localhost ~]# yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel [root@localhost ~]# yum -y install git-core [root@localhost ~]# git --version git version 1.7.1
Git 提供了一個叫作 git config 的工具,專門用來配置或讀取相應的工做環境變量。
這些環境變量,決定了 Git 在各個環節的具體工做方式和行爲。這些變量能夠存放在如下三個不一樣的地方:web
(1)用戶信息
配置我的的用戶名稱和電子郵件地址:算法
[root@localhost ~]# git config --global user.name "tong" [root@localhost ~]# git config --global user.email tong@test.com
若是用了 --global 選項,那麼更改的配置文件就是位於你用戶主目錄下的那個,之後你全部的項目都會默認使用這裏配置的用戶信息。
若是要在某個特定的項目中使用其餘名字或者電郵,只要去掉 --global 選項從新配置便可,新的設定保存在當前項目的 .git/config 文件裏。vim
(2)文本編輯器
設置Git默認使用的文本編輯器, 通常可能會是 Vi 或者 Vim。若是你有其餘偏好,好比 Emacs 的話,能夠從新設置:centos
[root@localhost ~]# git config --global core.editor vim
(3)差別分析工具
還有一個比較經常使用的是,在解決合併衝突時使用哪一種差別分析工具。好比要改用 vimdiff 的話:瀏覽器
[root@localhost ~]# git config --global merge.tool vimdiff
(4)查看配置信息服務器
[root@localhost ~]# git config --list user.name=tong user.email=tongxiaoda@anzhi.com core.editor=vim merge.tool=vimdiff
有時候會看到重複的變量名,那就說明它們來自不一樣的配置文件(好比 /etc/gitconfig 和 ~/.gitconfig),不過最終 Git 實際採用的是最後一個。網絡
[root@localhost ~]# cat .gitconfig [user] name = tong email = tongxiaoda@anzhi.com [core] editor = vim [merge] tool = vimdiff
[root@localhost ~]# git config user.name tong
(1)工做流程
架構
通常工做流程以下:curl
(2)基本概念
版本庫中的暫存區和版本庫之間的關係:
圖中左側爲工做區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區(stage, index),標記爲 "master" 的是 master 分支所表明的目錄樹。
圖中咱們能夠看出此時 "HEAD" 實際是指向 master 分支的一個"遊標"。因此圖示的命令中出現 HEAD 的地方能夠用 master 來替換。
圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 ".git/objects" 目錄下,裏面包含了建立的各類對象及內容。
當對工做區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
當執行 "git rm --cached
當執行 "git checkout ." 或者 "git checkout --
當執行 "git checkout HEAD ." 或者 "git checkout HEAD
(3)架構
從通常開發者的角度來看,git有如下功能:
一、從遠程服務器上克隆clone完整的git倉庫(包括代碼和版本信息)到本身的機器(單機)上。
二、在本身的機器上根據不一樣的開發目的,建立分支,修改代碼。
三、在單機上本身建立的分支上提交代碼。
四、在單機上合併分支。
五、把遠程服務器上最新版的代碼fetch下來,而後跟本身的主分支合併。
六、生成補丁(patch),把補丁發送給主開發者。
七、看主開發者的反饋,若是主開發者發現兩個通常開發者之間有衝突(他們之間能夠合做解決的衝突),就會要求他們先解決衝突,而後再由其中一我的提交。若是主開發者能夠本身解決,或者沒有衝突,就經過。
八、通常開發者之間解決衝突的方法,開發者之間可使用pull命令解決衝突,解決完衝突以後再向主開發者提交補丁。
從主開發者的角度看,git有如下功能: 一、查看郵件或者經過其它方式查看通常開發者的提交狀態。 二、打上補丁,解決衝突(能夠本身解決,也能夠要求開發者之間解決之後再從新提交,若是是開源項目,還要決定哪些補丁有用,哪些不用)。 三、向遠程服務器(公共的)提交結果,而後通知全部開發人員。