在git中能夠爲任意其餘對象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1標識git對象,這是一個40個字符長度的字符串,不方便記憶,那麼可爲git對象添加一個tag便於標識不一樣對象。 git
# git tag tag-name sha-1 $ git tag v1.0 bdc390c2
這樣便爲bdc390c2的對象添加了一個tag,若是不指定sha-1,會爲最近的一個commit對象添加tag 正則表達式
使用git tag命令便能查看全部tag shell
$ git tag
固然能夠篩選 vim
$ git tag -l 'v1.*'
$ git tag -d <tag-name>
重命名tag有兩種方式: 服務器
$ git tag -f <new-tag> <old-tag> $ git tag -d <old-tag>
建議多使用分支來維護項目,便於保證主幹的穩定性。 工具
git中建立分支的方法很是簡單: 測試
#git branch <branch-name> $ git branch dev
這樣便從當前分支建立了一個名爲dev的分支,可讓此分支做爲開發分支。使用checkout <branch-name>能夠很方便地在分支間進行切換: spa
$ git checkout master $ git checkout dev
還能夠直接使用checkout -b命令來建立分支後並切換到新的分支 指針
$ git checkout -b dev
$ git branch -rm <old-branch> <new-branch>
推送本地分支到遠程服務器 日誌
$ git push <remote> <branch-name>[:<remote-branch-name>]
遠程分支名若是省略,則使用本地分支名做爲遠程分支名
$ git push <remote> <branch-name>
# 刪除分支 $ git branch -d <branch-name> # 強制刪除分支 $ git branch -D <branch-name>
刪除遠程分支
$ git push <remote> :<remote-branch-name>
這個命令是否是能夠從推送本地分支到遠程分支的命令中獲得一點靈感?是的,省略本地分支名後,遠程分支即被刪除!
使用git branch命令可查看當前git版本庫中全部分支:
$ git branch
查看分支
當前分支會在分支前加以星號(*)標註。
git branch -v命令將附加顯示最後一次提交相關信息的分支信息
$ git branch -v # 查看已合併的分支 $ git branch --merge # 查看未合併的分支 $ git branch --no-merged
當一個分支完成預期的工做,經過測試後,即可合併到主幹,做爲穩定版本進行後續開發,合併分支的命令很是簡單:merge branch-name
$ git merge dev
若是順利,dev分支將自動地合併到當前分支。固然不少時候會產生衝突,這個時候就須要手動堅定衝突後再進行合併。
在git中如遇衝突,會顯示衝突提示,合併會中斷
conflict
此時你可使用git mergetool命令調用merge工具進行手動合併
$ git mergetool
mergetool在配置項進行配置,如下是使用vimdiff的merge操做界面
mergetool vimdiff
手動解決完衝突後,還須要進行一次提交,便完成了整個手動合併過程。
rebase亦是將分支的修改進行「合併」。但在具體行爲上略有不一樣,使用merge進行合併,更新部分依然會視做是從分支而來;而rebase則 是直接將更新合併到新分支,至關因而在合併分支的直接修改。若是咱們的更新是很是小,不足以做爲一個分支進行合併,而且不想污染版本日誌,那麼即可以使用 rebase來合併更新。
在一個git版本倉庫中,有時候不少文件/目錄並不須要使用git進行版本維護,那麼就能夠將這些文件/目錄加入.gitignore文件中, 在.gitignore文件中可定義要排除在git版本管理以外的文件/目錄,git默認會讀取項目目錄下的.gitignore文件。
.gitignore使用標準的shell glob模式匹配,shell glob你能夠簡單地理解爲一種特特殊化的正則表達式,其實要比正則表達式簡單許多,語法以下:
#.gitignore example .txt .gitignore !readme.txt exclude/*.txt
該.gitignore中定義的屏蔽規則爲:
屏蔽全部的txt文件,可是readme.txt例外;屏蔽全部的.gitignore文件;屏蔽exclude目錄下的全部txt文件(包括readme.txt)。
另外,還能夠在配置項中經過core.excludesfile來指定ignore文件。
$ git config core.excludesfile '_myignore'
git配置文件根據做用域的不一樣分爲三種:
git配置項都經過git config命令寫入,傳入不一樣參數寫入不一樣的配置文件
$ git config --system/--global/
具體的配置項設置參考幫助文檔,$ git config –help
刪除配置使用unset命令
$ git config --global --unset alias.mycommand
git中包含4類對象:
git提交便產生一個commit對象,commit對象中包含一個tree對象,tree對象中又會包含其餘的tree對象或是blob對 象,blob對象是最小的組成單元,即獨立的文件。每一個對象都對應一個惟一的SHA-1值,只有當文件或目錄有修改時這個值纔會從新計算髮生改變。
究竟git是如何工做的?打開.git目錄即可一目瞭然。
HEAD文件中是形如如下代碼的內容:
ref: refs/heads/dev
它指向refs/heads/dev,而dev文件中代碼指向當前分支最近的commit對象
objects目錄中保存有全部git對象,這些對象取sha-1值的前兩個字母爲一個目錄,剩下的38個字符做爲文件名保存,在上一節「git中 對象」中能查看到的全部git對象都保存在這個目錄中,可使用git cat-file <sha-1>來獲取對象內容。
$ git cat-file -p 63a46849
不妨多使用cat-file命名多看看各類對象的內容,有助於理解git對象的結構。
refs目錄中保存了git中使用的全部引用或指針,由於不可能任什麼時候候都是用sha-1值來指代對象,git對象也能夠有「縮略名」。一般refs目錄會包含如下目錄:
逐一地查看這些文件內容,你就什麼都明白了。使用 git update-ref 命令能夠直接新建一個引用。
$ git update-ref refs/heads/test-branch c56dce $ git update-ref refs/tags/test-tag c56dce
執行上述命令,這樣你的git版本庫中就多了一個test-branch分支和一個名爲test-tag的tag。
其餘的好比git還有些底層的命令,我在文中所列舉的,包括以前基礎篇的都是一些高級命令。可使用這些底層命名直接對git庫進行一些操做,有關git底層命名的詳細內容,能夠到網上去找找。