文章出處

前面的話

  前面我們介紹了版本管理,當前最流行的版本控制系統當屬Git。Git是一個免費開源的分布式版本控制系統(DVCS)。從本文開始,將詳細介紹Git的相關內容。本文是Git系列第一篇——Git基礎

 

歷史

  Git誕生于一個極富紛爭大舉創新的年代。Linux內核開源項目有著為數眾廣的參與者。絕大多數的Linux內核維護工作都花在了提交補丁和保存歸檔的繁瑣事務上(1991-2002年間)。到2002年,整個項目組開始啟用分布式版本控制系統BitKeeper來管理和維護代碼

  到了2005年,開發BitKeeper的商業公司同Linux內核開源社區的合作關系結束,他們收回了免費使用BitKeeper的權力。這就迫使Linux開源社區(特別是Linux的締造者Linus Torvalds)不得不吸取教訓,只有開發一套屬于自己的版本控制系統才不至于重蹈覆轍

  自誕生于2005年以來,Git日臻成熟完善,在高度易用的同時,仍然保留著初期設定的目標。它的速度飛快,極其適合管理大項目,它還有著令人難以置信的非線性分支管理系統,可以應付各種復雜的項目開發需求

 

優勢

  Git有如下優勢

  1、速度

  2、設計簡單

  3、輕量級的分支操作,允許上千個并行開發的分支,對非線性開發模式的強力支持

  4、有能力高效管理類似Linux內核一樣的超大規模項目

  5、Git已經成為事實上的標準,幾乎所有優秀的前端項目都通過Git來進行版本控制

  6、社區成熟活躍,git的流行離不開github的貢獻

 

基礎

  接下來,介紹Git的基礎內容

直接記錄快照,而非差異比較

  Git和其他版本控制系統的主要差別在于,Git只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異。這類系統(CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容

  Git并不保存這些前后變化的差異數據。實際上,Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git不會再次保存,而只對上次保存的快照作一鏈接。Git工作方式如下所示

  這是Git同其他系統的重要區別。它完全顛覆了傳統版本控制的套路,并對各個環節的實現方式作了新的設計。Git更像是個小型的文件系統,但它同時還提供了許多以此為基礎的超強工具,而不只是一個簡單的VCS

近乎所有操作都是本地執行

  在Git中的絕大多數操作都只需要訪問本地文件和資源,不用連網。但如果用CVCS的話,差不多所有操作都需要連接網絡。因為Git在本地磁盤上就保存著所有當前項目的歷史更新,所以處理起來速度飛快。

  舉個例子,如果要瀏覽項目的歷史更新摘要,Git不用跑到外面的服務器上去取數據回來,而直接從本地數據庫讀取。所以任何時候都可以馬上翻閱,無需等待。如果想要看當前版本的文件和一個月前的版本之間有何差異,Git會取出一個月前的快照和當前文件作一次差異運算,而不用請求遠程服務器來做這件事,或是把老版本的文件拉到本地來作比較

  用CVCS的話,沒有網絡或者斷開VPN你就無法做任何事情。但用Git的話,就算在飛機或者火車上,都可以非常愉快地頻繁提交更新,等到了有網絡的時候再上傳到遠程倉庫。同樣,在回家的路上,不用連接VPN也可以繼續工作。換作其他版本控制系統,這么做幾乎不可能,抑或非常麻煩。比如Perforce,如果不連到服務器,幾乎什么都做不了;如果是Subversion或CVS,雖然可以編輯文件,但無法提交更新,因為數據庫在網絡上。看上去好像這些都不是什么大問題,但實際體驗過之后,這其實是會帶來很大不同的

時刻保持數據完整性

  在保存到Git之前,所有數據都要進行內容的校驗和(checksum)計算,并將此結果作為數據的唯一標識和索引。換句話說,不可能在修改了文件或目錄之后,Git一無所知。這項特性作為Git的設計哲學,建在整體架構的最底層。所以如果文件在傳輸時變得不完整,或者磁盤損壞導致文件數據缺失,Git都能立即察覺

  Git使用SHA-1算法計算數據的校驗和,通過對文件的內容或目錄的結構計算出一個SHA-1哈希值,作為指紋字符串。該字串由40個十六進制字符(0-9及a-f)組成,看起來就像是:

24b9da6552252987aa493b52f8696cd6d3b00373

  Git的工作完全依賴于這類指紋字串,所以會經常看到這樣的哈希值。實際上,所有保存在Git數據庫中的東西都是用此哈希值來作索引的,而不是靠文件名

多數操作僅添加數據

  常用的Git操作大多僅僅是把數據添加到數據庫。因為任何一種不可逆的操作,比如刪除數據,都會使回退或重現歷史版本變得困難重重。在別的VCS中,若還未提交更新,就有可能丟失或者混淆一些修改的內容,但在Git里,一旦提交快照之后就完全不用擔心丟失數據,特別是養成定期推送到其他倉庫的習慣的話

  這種高可靠性令我們的開發工作安心不少,盡管去做各種試驗性的嘗試好了,再怎樣也不會弄丟數據

文件的三種狀態

  對于任何一個文件,在Git內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經被安全地保存在本地數據庫中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中

  由此我們看到Git管理項目時,文件流轉的三個工作區域:Git的工作目錄,暫存區域,以及本地倉庫

  每個項目都有一個Git目錄(如果git clone出來的話,就是其中.git的目錄;如果git clone --bare的話,新建的目錄本身就是Git目錄),它是Git用來保存元數據和對象數據庫的地方。該目錄非常重要,每次克隆鏡像倉庫的時候,實際拷貝的就是這個目錄里面的數據

  從項目中取出某個版本的所有文件和目錄,用以開始后續工作的叫做工作目錄。這些文件實際上都是從Git目錄中的壓縮對象數據庫中提取出來的,接下來就可以在工作目錄中對這些文件進行編輯

  所謂的暫存區域只不過是個簡單的文件,一般都放在Git目錄中。有時候人們會把這個文件叫做索引文件,不過標準說法還是叫暫存區域

  基本的Git工作流程如下:

  1、在工作目錄中修改某些文件

  2、對修改后的文件進行快照,然后保存到暫存區域

  3、提交更新,將保存在暫存區域的文件快照永久轉儲到Git目錄中

  所以,我們可以從文件所處的位置來判斷狀態:如果是Git目錄中保存著的特定版本文件,就屬于已提交狀態;如果作了修改并已放入暫存區域,就屬于已暫存狀態;如果自上次取出后,作了修改但還沒有放到暫存區域,就是已修改狀態

 

安裝

  Git主要有兩種安裝方式:一種是通過編譯源代碼來安裝;另一種是使用為特定平臺預編譯好的安裝包

從源代碼安裝

  若是條件允許,從源代碼安裝有很多好處,至少可以安裝最新的版本。Git的每個版本都在不斷嘗試改進用戶體驗,所以能通過源代碼自己編譯安裝最新版本就再好不過了

  Git的工作需要調用curl,zlib,openssl,expat,libiconv等庫的代碼,所以需要先安裝這些依賴工具。在有yum的系統上(比如Fedora)或者有apt-get的系統上(比如Debian體系),可以用下面的命令安裝:

$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

  之后,從下面的Git官方站點下載最新版本源代碼:

http://git-scm.com/download

  然后編譯并安裝:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

  現在已經可以用git命令了,用git把Git項目倉庫克隆到本地,以便日后隨時更新:

$ git clone git://git.kernel.org/pub/scm/git/git.git

在Linux上安裝

  如果在Linux上安裝預編譯好的Git二進制安裝包,可直接用系統提供的包管理工具。在Fedora上用yum安裝

$ yum install git-core

  在Ubuntu這類Debian體系的系統上,可以用apt-get安裝:

$ apt-get install git

在Mac上安裝

  在Mac上安裝Git有兩種方式。最容易的當屬使用圖形化的Git安裝工具

http://sourceforge.net/projects/git-osx-installer/

  另一種是通過MacPorts(http://www.macports.org)安裝。如果已經裝好了MacPorts,用下面的命令安裝Git:

$ sudo port install git-core +svn +doc +bash_completion +gitweb

  這種方式就不需要再自己安裝依賴庫了,Macports會幫你搞定這些麻煩事。一般上面列出的安裝選項已經夠用,要是想用Git連接Subversion的代碼倉庫,還可以加上+svn選項

在Windows上安裝

  在Windows上安裝Git同樣輕松,有個叫做msysGit的項目提供了安裝包,從https://git-for-windows.github.io下載(網速慢的同學請移步國內鏡像),然后按默認選項安裝即可

  安裝完成后,在開始菜單里找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功!

  [注意]如果在Windows命令行中使用Git時,在參數中間有空格的時候,必須使用雙引號將參數括起來(在Linux中是單引號);另外,如果揚抑符(^)作為參數的結尾,并且作為這一行的最后一個字符,則這個參數也需要用雙引號括起來。因為揚抑符在Windows命令行中表示續行(即下一行為這一行命令的繼續) 

 

配置

  一般在新的系統上,我們都需要先配置下自己的Git工作環境。配置工作只需一次,以后升級時還會沿用現在的配置。當然,如果需要,你隨時可以用相同的命令修改已有的配置

【用戶信息】

  第一個要配置的是個人的用戶名稱和電子郵件地址。這兩條配置很重要,每次Git提交時都會引用這兩條信息,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記錄:

Administrator@bai MINGW64 ~
$ git config --global user.name "match"

Administrator@bai MINGW64 ~
$ git config --global user.email "121631835@qq.com"

  如果用了--global選項,那么更改的配置文件就是位于用戶主目錄下的那個,以后所有的項目都會默認使用這里配置的用戶信息。如果要在某個特定的項目中使用其他名字或者電郵,只要去掉--global選項重新配置即可,新的設定保存在當前項目的.git/config文件里

【配置級別】

  git共有三個配置級別

  --local【默認,高優先級】:只影響本倉庫,文件為.git/config

  --global【中優先級】:影響到所有當前用戶的git倉庫,文件為~/.gitconfig

  --system【低優先級】:影響到全系統的git倉庫,文件為/etc/gitconfig

【配置文本編輯器】

  Git需要輸入一些額外消息的時候,會自動調用一個外部文本編輯器。默認會使用操作系統指定的默認編輯器。如果有其他偏好,比如 EmEditor 的話,可以重新設置

$ git config --global core.editor D:/soft/EmEditor/EmEditor.exe

【配置別名】

  Git并不會推斷你輸入的幾個字符將會是哪條命令,不過如果想偷懶,少敲幾個命令的字符,可以用 git config 為命令設置別名  

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

  現在,如果要輸入git commit只需鍵入git ci即可

  使用這種技術還可以創造出新的命令,比方說取消暫存文件時的輸入比較繁瑣,可以自己設置一下

$ git config --global alias.unstage 'reset HEAD --'

  這樣一來,下面的兩條命令完全等同

$ git unstage fileA
$ git reset HEAD fileA

【查看配置信息】

  要檢查已有的配置信息,可以使用git config --list命令

Administrator@bai MINGW64 ~
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
http.sslcainfo=D:/Git/mingw64/ssl/certs/ca-bundle.crt
diff.astextplain.textconv=astextplain
rebase.autosquash=true
credential.helper=manager
user.name=match
user.email=121631835@qq.com
filter.lfs.clean=git-lfs clean %f
filter.lfs.smudge=git-lfs smudge %f
filter.lfs.required=true

  也可以直接查閱某個環境變量的設定,只要把特定的名字跟在后面即可,像這樣:

Administrator@bai MINGW64 ~
$ git config user.name
match

【獲取幫助】

  想了解Git的各式工具該怎么用,可以使用命令$ git help

Administrator@bai MINGW64 ~
$ git help
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.

  比如,要學習 config 命令可以怎么用,運行:

$ git help config

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()