1. 程式人生 > >分散式版本控制系統GIT的使用

分散式版本控制系統GIT的使用

一、什麼是Git

  Git是一個分散式版本控制系統,Git 和其他版本控制系統的主要差別在於,Git 只關心檔案資料的整體是否發生變化,而大多數其他系統則只關心檔案內容的具體差異(如CVS、Subversion等)。而Git並不儲存這些前後變化的差異資料。Git更像是把變化的檔案作快照後記錄在一個微型的檔案系統中。每次提交更新時,它會縱覽一遍所有檔案的指紋資訊並對檔案作一快照,然後儲存一個指向這次快照的索引。若檔案沒有變化,Git不會再次儲存,而只對上傳儲存的快照做一次連線,即若檔案未變化則指向上一次提交。

  所謂Git的指紋資訊,是指檔案在儲存到Git之前,所有資料都要進行內容的checksum計算,並將此結果作為資料的唯一標識和索引。也就是說Git會立即察覺到資料的變化。

  受Git控制的檔案一般有三種狀態:已提交狀態(Commited)、已修改狀態(Modified)、已暫存狀態(Staged)。每一次提交實際上是儲存樹狀態和路徑狀態。

●已提交:表示該檔案已經被安全的儲存在本地資料庫了;

●已修改:表示修改了某個檔案但是還沒有提交儲存;

●已暫存:也可稱為索引(index),表示把已修改的檔案放在下次提交時要儲存的清單中。

  我們在用Git管理專案的時候,檔案流轉的三個區域:Git的本地資料目錄、工作目錄、暫存區域。每個專案都有一個git目錄,它是 Git 用來儲存元資料和物件資料庫的地方。該目錄非常重要,每次克隆映象倉庫的時候,實際拷貝的就是這個目錄裡面的資料。從專案中取出某個版本的所有檔案和目錄,用以開始後續工作的叫做工作目錄。這些檔案實際上都是從 git 目錄中的壓縮物件資料庫中提取出來的,接下來就可以在工作目錄中對這些檔案進行編輯。

  所謂的暫存區域只不過是個簡單的檔案,一般都放在 git 目錄中。有時候人們會把這個檔案叫做索引檔案,不過標準說法還是叫暫存區域。
  基本的 Git 工作流程如下所示:
1. 在工作目錄中修改某些檔案。
2. 對這些修改了的檔案作快照,並儲存到暫存區域。
3. 提交更新,將儲存在暫存區域的檔案快照轉儲到 git 目錄中。
所以,我們可以從檔案所處的位置來判斷狀態:
如果是 git 目錄中儲存著的特定版本檔案,就屬於已提交狀態;如果作了修改並已放入暫存區域,就屬於已暫存狀態;如果自上次取出後,作了修改但還沒有放到暫存區域,就是已修改狀態。

1.安裝Git

  Git目前已經屬於基礎工具了,在yum的base倉庫中直接安裝即可:

~]# yum install -y git

  可以用命令去獲取一個Git倉庫或專案,也可從從零建立一個Git專案目錄:

~]# git init
Initialized empty Git repository in /root/.git/ #預設在當前使用者家目錄下建立一個.git的目錄

  Git的物件型別: 儲存在.git/objects目錄下
1.塊(blob)物件:檔案的每個版本表現為一個塊(blob);
2.樹(tree)物件:一個目錄代表一層目錄資訊;
3.提交(commit)物件:用於儲存版本庫一次變化的元資料,包括作者、郵箱、提交日期、日誌;每個提交物件都指定一個目錄樹物件;
4.標籤(tag)物件:用於給一個特定物件一個易讀的名稱;

  .git目錄的結構:

~]# ls .git/   
branches  description  hooks  objects
config    HEAD         info   refs
~]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

  建立或者得到一個git後的大致結構:

  下面通過建立一個專案(檔案)來演示這些邏輯:

在家目錄下建立一個某專案工作目錄:

1 ~]# mkdir -p ./testobj
2 ~]# cd testobj/
3 ~]# git init
4 ~]# cp /etc/passwd ./
5 ~]# vim README
6 test

此時在專案的工作區就有了檔案 passwd 和 README ,若想要git跟蹤這兩個檔案(即放入暫存區)可使用命令 git add :

2.暫存

~]# git add passwd README #將passwd和README放至暫存區。

然後可看到.git目錄下自動生成了一個 index 目錄:

而 .git/objects 目錄下生成了兩個新目錄,並在目錄下生成了一串hash值的檔案:

現在修改工作目錄中的README檔案看看會發生什麼情況:

~]# vim ../../README #在檔案中隨便加一行內容。
~]# pwd
/root/testobj
~]# git add README #再次推入暫存區
~]# cd .git/objects
~]# tree

  這裡可以看到比之前多出了一個目錄和檔案,這是因為每一次暫存都會在objects目錄下建立一個物件,不能是空目錄,Git是無法追蹤空目錄的。

可用 git status 檢視當前git的狀態:

~]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   README
#       new file:   passwd
#

  當檔案放至暫存區後,要刪除檔案需要用 git rm --cached <file>... 命令從暫存區域刪除。

  若要檢視暫存區中的內容可以用 git cat-file -p <file> ,這裡的<file>為暫存區中檔名為hash格式的檔案,用cat命令無法檢視。

3.提交

  若想提交檔案則可用 git commit 命令,檢視提交日誌可用 git log 。在生產環境中若是提交至git伺服器,必須要求先配置真實的個人資訊,以便於程式碼追蹤管理。配置個人資訊可用 git config 命令來實現。例如要加個人資訊可用:

git config --global user.name ready
git config --global user.email 123@.com

  配置個人資訊後會在家目錄下自動生成 .gitconfig 檔案,裡面存放著配置的個人資訊。

  檔案提交後,當我們把 .git 目錄複製到其他目錄時,我們就可以用 git checkout -- <file> 命令將檔案重構出來。

mkdir -p ~/myobj
cp ~/testobj/.git ~/myobj

  這時新目錄中是沒有passwd和README檔案的,用 git checkout 命令後:

~]# git checkout -- README passwd
~]# ls
README passwd

  可以看到檔案都被恢復了,並且內容是和之前一樣的,但要注意,提交什麼才能恢復什麼。

4.Git中的檔案分類

已追蹤的(tracked):已經在版本庫中,或者已經使用git add命令新增至索引中的檔案;
被忽略的(Igored):在版本庫中通過“忽略檔案列表”明確宣告為被忽略的檔案;
未追蹤的(untracked):上述兩類之外的其它檔案;

5.設定標籤tag

  在生產環境中可以為每次提交建立標籤(tag),便於版本管理。命令為 git tag <tagname> <commit hash> 

6.建立分支

  在開發過程中常做分支是很有必要的。

  建立分支可使用 git checkout -b 或 git branch ,使用 git checkout 來切換分支,每一次切換都會根據分支的具體資料改變工作目錄的檔案。

 1 myobj]# git branch brh
 2 myobj]# git branch --list
 3 * (detached from V1)
 4   brh
 5   master
 6 myobj]# git checkout brh
 7 Switched to branch 'brh'
 8 myobj]# git branch --list
 9 * brh #星號表示當前所在的分支
10   master

  合併分支則用 git merge 命令

 7.撤銷提交

  撤銷提交可以用 git reset 命令,該命令有三個重要的引數:

1. --soft :將HEAD指向上一次提交,不會改變工作目錄,也不會影響暫存區。

2. --mixed :將HEAD指向上一次提交,並回退暫存區,但不會改變工作目錄。

3. --hard :改變HEAD並且刪除暫存區資料,並修改工作目錄。

8.差異比較

   git diff 命令可以用來比較兩次提交的不同。