tag
在git中可以為任意其他對(duì)象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1標(biāo)識(shí)git對(duì)象,這是一個(gè)40個(gè)字符長(zhǎng)度的字符串,不方便記憶,那么可為git對(duì)象添加一個(gè)tag便于標(biāo)識(shí)不同對(duì)象。
添加tag
# git tag tag-name sha-1 $ git tag v1.0 bdc390c2
這樣便為bdc390c2的對(duì)象添加了一個(gè)tag,如果不指定sha-1,會(huì)為最近的一個(gè)commit對(duì)象添加tag
查看tag
使用git tag命令便能查看所有tag
$ git tag
當(dāng)然可以篩選
$ git tag -l 'v1.*'
刪除tag
$ git tag -d <tag-name>
重命名tag
重命名tag有兩種方式:
- 刪除原tag,重新添加
- git tag -f 強(qiáng)制替換已存在的tag后,再刪除原tag
$ git tag -f <new-tag> <old-tag> $ git tag -d <old-tag>
tag的分類
- 輕量型標(biāo)簽 輕量型標(biāo)簽直接使用 $ git tag <tag-name> <git-object> 即可創(chuàng)建
- 標(biāo)注型(annotated)標(biāo)簽 標(biāo)注型標(biāo)簽可記錄更多的信息,使用 $ git tag -a <tag-name> <git-object> -m ‘tag message’即可創(chuàng)意一個(gè)標(biāo)注性標(biāo)簽
分支
建議多使用分支來(lái)維護(hù)項(xiàng)目,便于保證主干的穩(wěn)定性。
創(chuàng)建分支
git中創(chuàng)建分支的方法非常簡(jiǎn)單:
#git branch <branch-name> $ git branch dev
這樣便從當(dāng)前分支創(chuàng)建了一個(gè)名為dev的分支,可以讓此分支作為開發(fā)分支。使用checkout <branch-name>可以很方便地在分支間進(jìn)行切換:
$ git checkout master $ git checkout dev
還可以直接使用checkout -b命令來(lái)創(chuàng)建分支后并切換到新的分支
$ git checkout -b dev
重命名分支
$ git branch -rm <old-branch> <new-branch>
遠(yuǎn)程分支
推送本地分支到遠(yuǎn)程服務(wù)器
$ git push <remote> <branch-name>[:<remote-branch-name>]
遠(yuǎn)程分支名如果省略,則使用本地分支名作為遠(yuǎn)程分支名
$ git push <remote> <branch-name>
刪除分支
# 刪除分支 $ git branch -d <branch-name> # 強(qiáng)制刪除分支 $ git branch -D <branch-name>
刪除遠(yuǎn)程分支
$ git push <remote> :<remote-branch-name>
這個(gè)命令是不是可以從推送本地分支到遠(yuǎn)程分支的命令中得到一點(diǎn)靈感?是的,省略本地分支名后,遠(yuǎn)程分支即被刪除!
查看分支
使用git branch命令可查看當(dāng)前git版本庫(kù)中所有分支:
$ git branch
![查看分支 查看分支](http://image49.360doc.com/DownloadImg/2012/02/1614/21557513_1.jpg)
查看分支
當(dāng)前分支會(huì)在分支前加以星號(hào)(*)標(biāo)注。
git branch -v命令將附加顯示最后一次提交相關(guān)信息的分支信息
$ git branch -v # 查看已合并的分支 $ git branch --merge # 查看未合并的分支 $ git branch --no-merged
分支合并
當(dāng)一個(gè)分支完成預(yù)期的工作,通過測(cè)試后,便可合并到主干,作為穩(wěn)定版本進(jìn)行后續(xù)開發(fā),合并分支的命令非常簡(jiǎn)單:merge branch-name
$ git merge dev
如果順利,dev分支將自動(dòng)地合并到當(dāng)前分支。當(dāng)然很多時(shí)候會(huì)產(chǎn)生沖突,這個(gè)時(shí)候就需要手動(dòng)堅(jiān)決沖突后再進(jìn)行合并。
在git中如遇沖突,會(huì)顯示沖突提示,合并會(huì)中斷
![conflict conflict](http://image49.360doc.com/DownloadImg/2012/02/1614/21557513_2.jpg)
conflict
此時(shí)你可以使用git mergetool命令調(diào)用merge工具進(jìn)行手動(dòng)合并
$ git mergetool
mergetool在配置項(xiàng)進(jìn)行配置,以下是使用vimdiff的merge操作界面
![mergetool vimdiff mergetool vimdiff](http://image49.360doc.com/DownloadImg/2012/02/1614/21557513_3.jpg)
mergetool vimdiff
手動(dòng)解決完沖突后,還需要進(jìn)行一次提交,便完成了整個(gè)手動(dòng)合并過程。
rebase
rebase亦是將分支的修改進(jìn)行“合并”。但在具體行為上略有不同,使用merge進(jìn)行合并,更新部分依然會(huì)視作是從分支而來(lái);而rebase則是直接將更新合并到新分支,相當(dāng)于是在合并分支的直接修改。如果我們的更新是非常小,不足以作為一個(gè)分支進(jìn)行合并,并且不想污染版本日志,那么便可以使用rebase來(lái)合并更新。
ignore
在一個(gè)git版本倉(cāng)庫(kù)中,有時(shí)候很多文件/目錄并不需要使用git進(jìn)行版本維護(hù),那么就可以將這些文件/目錄加入.gitignore文件中,在.gitignore文件中可定義要排除在git版本管理之外的文件/目錄,git默認(rèn)會(huì)讀取項(xiàng)目目錄下的.gitignore文件。
.gitignore使用標(biāo)準(zhǔn)的shell glob模式匹配,shell glob你可以簡(jiǎn)單地理解為一種特特殊化的正則表達(dá)式,其實(shí)要比正則表達(dá)式簡(jiǎn)單許多,語(yǔ)法如下:
- 允許使用空行,沒有實(shí)際語(yǔ)法作用
- # 開頭的行視作注釋
- ! 開頭的模式會(huì)覆蓋之前的定義,將匹配的對(duì)象重新加入跟蹤列表
- 以/結(jié)尾的模式,git會(huì)屏蔽掉該目錄及其所有子目錄及文件(只屏蔽目錄)
- 不以/結(jié)尾的模式,git屏蔽同名的文件名及目錄(屏蔽目錄和同名文件)
- 以/開頭的模式,git只會(huì)屏蔽項(xiàng)目根目錄下的匹配對(duì)象
#.gitignore example .txt .gitignore !readme.txt exclude/*.txt
該.gitignore中定義的屏蔽規(guī)則為:
屏蔽所有的txt文件,但是readme.txt例外;屏蔽所有的.gitignore文件;屏蔽exclude目錄下的所有txt文件(包括readme.txt)。
另外,還可以在配置項(xiàng)中通過core.excludesfile來(lái)指定ignore文件。
$ git config core.excludesfile '_myignore'
git配置
git配置文件根據(jù)作用域的不同分為三種:
- 系統(tǒng)配置文件(git安裝目錄/gitconfig)
- 用戶配置文件(用戶主目錄/.gitconfig)
- 項(xiàng)目配置文件(.git/config)
git配置項(xiàng)都通過git config命令寫入,傳入不同參數(shù)寫入不同的配置文件
$ git config --system/--global/
- git config –system 寫入系統(tǒng)配置
- git config –global 寫入用戶配置
- git config 寫入項(xiàng)目配置
具體的配置項(xiàng)設(shè)置參考幫助文檔,$ git config –help
git中的對(duì)象
git中包含4類對(duì)象:
- commit 提交對(duì)象
- tree 目錄
- blob 文件
- tag 標(biāo)記
git提交便產(chǎn)生一個(gè)commit對(duì)象,commit對(duì)象中包含一個(gè)tree對(duì)象,tree對(duì)象中又會(huì)包含其他的tree對(duì)象或是blob對(duì)象,blob對(duì)象是最小的組成單元,即獨(dú)立的文件。每個(gè)對(duì)象都對(duì)應(yīng)一個(gè)唯一的SHA-1值,只有當(dāng)文件或目錄有修改時(shí)這個(gè)值才會(huì)重新計(jì)算發(fā)生改變。
- $ git log 可以查看所有commit對(duì)象
- $ git ls-tree <commit> 查看commit對(duì)象中的tree對(duì)象
- $ git show <blob> 查看blob的具體內(nèi)容
git原理
究竟git是如何工作的?打開.git目錄便可一目了然。
- HEAD 指向當(dāng)前分支
- config 項(xiàng)目配置文件
- description 供GitWeb程序使用
- hooks/ 客戶端與服務(wù)端鉤子腳本
- info/ 忽略模式
- index 暫存區(qū)域信息
- objects/ 所有數(shù)據(jù)內(nèi)容
- refs/ 指向所有commit的指針
HEAD文件中是形如以下代碼的內(nèi)容:
ref: refs/heads/dev
它指向refs/heads/dev,而dev文件中代碼指向當(dāng)前分支最近的commit對(duì)象
objects目錄中保存有所有g(shù)it對(duì)象,這些對(duì)象取sha-1值的前兩個(gè)字母為一個(gè)目錄,剩下的38個(gè)字符作為文件名保存,在上一節(jié)“git中對(duì)象”中能查看到的所有g(shù)it對(duì)象都保存在這個(gè)目錄中,可以使用git cat-file <sha-1>來(lái)獲取對(duì)象內(nèi)容。
$ git cat-file -p 63a46849
不妨多使用cat-file命名多看看各種對(duì)象的內(nèi)容,有助于理解git對(duì)象的結(jié)構(gòu)。
refs目錄中保存了git中使用的所有引用或指針,因?yàn)椴豢赡苋魏螘r(shí)候都是用sha-1值來(lái)指代對(duì)象,git對(duì)象也可以有“縮略名”。通常refs目錄會(huì)包含以下目錄:
- heads 保存所有分支的HEAD指針
- remotes 保存遠(yuǎn)程倉(cāng)庫(kù)信息
- tags 保存所有tag指針
逐一地查看這些文件內(nèi)容,你就什么都明白了。使用 git update-ref 命令可以直接新建一個(gè)引用。
$ git update-ref refs/heads/test-branch c56dce $ git update-ref refs/tags/test-tag c56dce
執(zhí)行上述命令,這樣你的git版本庫(kù)中就多了一個(gè)test-branch分支和一個(gè)名為test-tag的tag。
其他的比如git還有些底層的命令,我在文中所列舉的,包括之前基礎(chǔ)篇的都是一些高級(jí)命令??梢允褂眠@些底層命名直接對(duì)git庫(kù)進(jìn)行一些操作,有關(guān)git底層命名的詳細(xì)內(nèi)容,可以到網(wǎng)上去找找。