假設一個HTML項目,使用Git來記錄和跟蹤這個項目,包括如下內容:
1)建立版本庫。
2)添加與修改文件。
3)建立新分支。
4)打標籤並整理版本庫。
5)克隆版本庫。html
1.建立版本庫 Creating a Repository
在Git中,版本庫(.git目錄)是與工做目錄樹並排放在同一個目錄中的。
本例中,要建立一個HTML頁面,給這個項目取名爲mysite。
首先建立一個同名目錄「mysite」,並進入到這個目錄,而後輸入命令git init。
[root@master-node ~]# mkdir mysite
[root@master-node ~]# cd mysite
[root@master-node mysite]# git init
Initialized empty Git repository in /root/mysite/.git/
建立完成。node
2.代碼修改
往空版本庫裏面添加文件:
建立一個名爲index.html的文件,並添加文本:
[root@master-node mysite]# vim index.htmlgit
<html> <body> <h1>Hello World</h1> <p>My first paragraph.</p> </body> </html>
建立了一個簡單的HTML文件後(把它放在mysite路徑下),就能夠開始跟蹤版本了。vim
要想讓Git跟蹤這個文件,須先讓它知道這個文件,要分兩步走:
1)首先使用git add命令把該文件添加到版本庫的索引(index);
2)而後使用git commit命令提交。bash
文件或文件列表能夠做爲git add命令的參數。
[root@master-node mysite]# git add index.html編輯器
git commit命令建立一個提交記錄。
提交記錄是存儲在版本中的歷史記錄,每提交一次建立一個記錄,並標記出代碼的演進。
Git把提交者的姓名和郵件地址,以及提交留言,都添加到提交記錄中。
參數-m,告訴Git本次提交的留言爲"add in hello world HTML"。
commit提交前要進行global全局設置,設置郵箱和用戶名地址,否則提交會失敗
[root@master-node mysite]# git config --global user.email "wangshibo@huanqiu.cn"
[root@master-node mysite]# git config --global user.name "wangshibo"
[root@master-node mysite]# git commit -m "add in hello world HTML"測試
運行命令git log能夠看到這個提交相關的信息:
輸出的第一行顯示提交名稱,是Git自動產生的SHA-1碼。Git經過它來跟蹤提交,使用該哈希碼能夠保證每一個提交的名稱都是獨一無二的。
[root@master-node mysite]# git log
commit 6881e1772267debce7bc29ee90cc5acf448ab24a
Author: wangshibo <wangshibo@xqshijie.cn>
Date: Tue Dec 20 17:16:20 2016 +0800spa
add in hello world HTMLorm
3.項目後續開發中,修改HTML文件以下:
[root@master-node mysite]# vim index.htmlhtm
<html> <head> <title>Hello World in Git</title> </head> <body> <h1>Hello World</h1> <p>My first paragraph.</p> </body> </html>
修改完畢,Git能夠檢測到文件被修改。
命令git status會顯示工做目錄樹的狀態,即當前的視圖狀態。
[root@master-node mysite]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
no changes added to commit (use "git add" and/or "git commit -a")
上面的結果代表Git監測到了修改,但還不知道如何處理它們。
若是要提交,須要暫存(stage)修改,以準備把修改提交到版本庫。
Git有三個地方能夠存放代碼:
1)第一個地方是工做目錄樹,編輯文件時能夠直接在這裏操做;
2)第二個是索引(index),也就是暫存區(staging area)。暫存區是工做目錄樹和版本庫之間的緩衝區。
3)第三個,也就是最終的一個,是版本庫。
命令git add,能夠暫存對文件剛作的修改。它跟前面添加一個新文件時使用的是同一個命令,只不過,此次它告訴Git要跟蹤的是一個新的修改而非新的文件。
[root@master-node mysite]# git add index.html
[root@master-node mysite]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
暫存修改過的index.html以後,執行命令git status能夠看到,信息變爲了Changes to be commited,index.html這行由紅色變爲了綠色。
使用命令git commit時,不要忘記使用帶-m的參數,並在參數後面加上提交留言,以解釋修改的緣由,以下:
git log能夠快速瀏覽提交留言:
[root@master-node mysite]# git log
commit 6881e1772267debce7bc29ee90cc5acf448ab24a
Author: wangshibo <wangshibo@xqshijie.cn>
Date: Tue Dec 20 17:16:20 2016 +0800
add in hello world HTML
[root@master-node mysite]# git log -1
commit 6881e1772267debce7bc29ee90cc5acf448ab24a
Author: wangshibo <wangshibo@xqshijie.cn>
Date: Tue Dec 20 17:16:20 2016 +0800
add in hello world HTML
命令中加入參數:-1能夠限制命令輸出的提交條目的個數。
4.分支理解和使用
好比mysite項目的代碼如今幾乎能夠發佈了,可是還須要進行測試等工做,直到確認它達到了預期的功能和質量,而與此同時,藉助分支,能夠開始下一個版本的新功能的開發了。
建立分支的命令是git branch,該命令須要兩個參數:新分支名稱和父分支名稱。
新建立的分支基於已經存在的父分支。
[root@master-node mysite]# git branch RB_1.0 master
該命令從主分支(master branch)上建立一個叫RB_1.0的分支。
主分支master是Git的默認分支。分支名稱中的RB表明發佈分支(release branch)。該前綴可讓人快速分辨出哪些分支是發佈分支。
如今來作一些新的改動。這些改動不影響準備發佈的代碼。
在</body>以前增長以下代碼:
[root@master-node mysite]# vim index.html
<html> <head> <title>Hello World in Git</title> </head> <body> <h1>Hello World</h1> <p>My first paragraph.</p> <ul> <li><a href="bio.html">Biography</a></li> </ul> </body> </html>
用以下命令提交這些修改:
[root@master-node mysite]# git commit -am "edit index.html"
Aborting commit due to empty commit message.
參數-a告訴Git提交所有修改過的文件。
如今主分支上有最新的修改,而發佈分支上仍是原來的代碼。
請切換到發佈分支,作發佈前的最後修改。切換分支的命令是git checkout。
[root@master-node mysite]# git checkout RB_1.0
M index.html
Switched to branch 'RB_1.0'
轉換分支後,所使用的打開文件的編輯器會提醒文件已經被修改,從新載入文件,會發現剛纔在主分支上作過的修改消失了。
能夠用git status命令來查看本身在哪個分支上:
[root@master-node mysite]# git status
# On branch RB_1.0
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
作發佈前的最後修改:在<head>標記塊中添加一些描述性的元標籤:
[root@master-node mysite]# vim index.html
<html> <head> <title>Hello World in Git</title> <meta name="description" content="hello world in Git"/> </head> <body> <h1>Hello World</h1> <p>My first paragraph.</p> <ul> <li><a href="bio.html">Biography</a></li> </ul> </body> </html>
保存並修改該提交:
[root@master-node mysite]# git commit -am "edit indes.html-2"
Aborting commit due to empty commit message.
5.處理髮布
(1)添加標籤
如今是發佈的時候了,要給版本打個標籤。
給Git中的代碼打標籤,意味着在版本庫的歷史中標記出特定的點,這樣未來就容易找到相應版本的代碼。
[root@master-node mysite]# git tag 1.0 RB_1.0
以上命令中的兩個參數分別指明瞭標籤的名稱(1.0)和但願打標籤的點(RB_1.0分支的末梢(所對應的版本或者說所對應的提交))。
用不帶參數的命令git tag能夠查看版本庫中的標籤列表:
[root@master-node mysite]# git tag
1.0
(2)變基
想把RB_1.0分支上所作的修改合併到主分支上來,變基命令git rebase能夠完成這項工做。
變基是把一條分支上的修改在另外一條分支的末梢重現。
先回到主分支:
[root@master-node mysite]# git checkout master
M index.html
Switched to branch 'master'
接着運行命令git rebase,後面跟一個參數:但願變基到哪條分支的末梢,就使用哪條分支名稱作參數。
[root@master-node mysite]# git rebase RB_1.0
Current branch master is up to date.
變基前和變基後的版本庫以下面兩個圖:
(3)刪除分支
做爲整理工做的一部分,刪除發佈分支RB_1.0。
只要標籤還在,從標籤到版本樹起點的一連串提交記錄就都在。
這時候刪除分支只是刪除了分支的名字,並不會刪除分支上的任何實際內容。
[root@master-node mysite]# git branch -d RB_1.0
Deleted branch RB_1.0 (was 6881e17).
[root@master-node mysite]# git tag
1.0
[root@master-node mysite]# git branch -d RB_1.0
error: branch 'RB_1.0' not found.
(4)打補丁
若是沒有了發佈分支,如何給1.0.x分支打補丁呢?很簡單,只須要在打標籤的地方再建立一條分支便可。
前面建立分支的時候,命令的最後一個參數是新分支的父分支名稱,如今只須把父分支名稱改爲發佈標籤名便可。命令以下:
[root@master-node mysite]# git branch RB_1.0.1 1.0
[root@master-node mysite]# git checkout RB_1.0.1
Switched to branch 'RB_1.0.1'
運行命令git log快速查看歷史記錄:
[root@master-node mysite]# git log --pretty=oneline
6881e1772267debce7bc29ee90cc5acf448ab24a add in hello world HTML
(5)爲代碼發佈建立歸檔文件
沒有必要老是把歷史記錄(也就是Git版本庫)一塊兒發佈,一般狀況下,將標籤對應的版本內容打包成一個tar包或者zip包就足夠了。
Git提供了git archive命令來作歸檔處理。
[root@master-node mysite]# git archive --format=tar --prefix=mysite-1.0/ 1.0 |gzip > mysite-1.0.tar.gz
該命令中有三個參數:
--format指明要產生tar格式的輸出。
--prefix指明包中全部東西都放到mysite-1.0/目錄下。
1.0指明要歸檔的標籤的名稱。
最後一段命令把git archive產生的tar文件用管道輸出的方法傳遞給命令gzip進行壓縮,而壓縮結果則重定向到mysite-1.0.tar.gz壓縮包裏。
建立zip文件:
生成zip格式和tar格式的命令參數幾乎同樣,只是改變了傳遞給--format的參數,並且無需經過命令gzip管道輸出,直接把歸檔內容保存到歸檔文件中。
[root@master-node mysite]# git archive --format=zip --prefix=mysite-1.0/ 1.0 >mysite-1.0.zip
[root@master-node mysite]# ls
index.html mysite-1.0.tar.gz mysite-1.0.zip
(6)克隆遠程版本庫
git clone帶有兩個參數:
1)遠程版本庫的位置
2)存放該版本庫的本地目錄。
其中,第二個參數是可選的,不加可不加。
例如,克隆遠程倉庫到本機的當前目錄下
[root@master-node mysite]# git clone http://******:8081/weixin/weixin.git
Cloning into 'weixin'...
remote: Counting objects: 356, done.
remote: Compressing objects: 100% (180/180), done.
remote: Total 356 (delta 185), reused 289 (delta 159)
Receiving objects: 100% (356/356), 4.08 MiB | 0 bytes/s, done.
Resolving deltas: 100% (185/185), done.
[root@master-node mysite]# lsindex.html mysite-1.0.tar.gz mysite-1.0.zip weixin