Git筆記-進階

tag

在git中能夠爲任意其餘對象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1標識git對象,這是一個40個字符長度的字符串,不方便記憶,那麼可爲git對象添加一個tag便於標識不一樣對象。 git

添加tag

# git tag tag-name sha-1
$ git tag v1.0 bdc390c2

這樣便爲bdc390c2的對象添加了一個tag,若是不指定sha-1,會爲最近的一個commit對象添加tag 正則表達式

查看tag

使用git tag命令便能查看全部tag shell

$ git tag

固然能夠篩選 vim

$ git tag -l 'v1.*'

刪除tag

$ git tag -d <tag-name>

重命名tag

重命名tag有兩種方式: 服務器

  1. 刪除原tag,從新添加
  2. git tag -f 強制替換已存在的tag後,再刪除原tag
$ git tag -f <new-tag> <old-tag>
$ git tag -d <old-tag>

tag的分類

  1. 輕量型標籤 輕量型標籤直接使用 $ git tag <tag-name> <git-object> 便可建立
  2. 標註型(annotated)標籤 標註型標籤可記錄更多的信息,使用 $ git tag -a <tag-name> <git-object> -m ‘tag message’便可創意一個標註性標籤

分支

建議多使用分支來維護項目,便於保證主幹的穩定性。 工具

建立分支

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

conflict

此時你可使用git mergetool命令調用merge工具進行手動合併

$ git mergetool

mergetool在配置項進行配置,如下是使用vimdiff的merge操做界面

mergetool vimdiff

mergetool vimdiff

手動解決完衝突後,還須要進行一次提交,便完成了整個手動合併過程。

rebase

rebase亦是將分支的修改進行「合併」。但在具體行爲上略有不一樣,使用merge進行合併,更新部分依然會視做是從分支而來;而rebase則 是直接將更新合併到新分支,至關因而在合併分支的直接修改。若是咱們的更新是很是小,不足以做爲一個分支進行合併,而且不想污染版本日誌,那麼即可以使用 rebase來合併更新。

ignore

在一個git版本倉庫中,有時候不少文件/目錄並不須要使用git進行版本維護,那麼就能夠將這些文件/目錄加入.gitignore文件中, 在.gitignore文件中可定義要排除在git版本管理以外的文件/目錄,git默認會讀取項目目錄下的.gitignore文件。

.gitignore使用標準的shell glob模式匹配,shell glob你能夠簡單地理解爲一種特特殊化的正則表達式,其實要比正則表達式簡單許多,語法以下:

  •  容許使用空行,沒有實際語法做用
  • # 開頭的行視做註釋
  • ! 開頭的模式會覆蓋以前的定義,將匹配的對象從新加入跟蹤列表
  • 以/結尾的模式,git會屏蔽掉該目錄及其全部子目錄及文件(只屏蔽目錄)
  • 不以/結尾的模式,git屏蔽同名的文件名及目錄(屏蔽目錄和同名文件)
  • 以/開頭的模式,git只會屏蔽項目根目錄下的匹配對象
示例:
#.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安裝目錄/gitconfig)
  • 用戶配置文件(用戶主目錄/.gitconfig)
  • 項目配置文件(.git/config)

git配置項都經過git config命令寫入,傳入不一樣參數寫入不一樣的配置文件

$ git config --system/--global/
  • git config –system 寫入系統配置
  • git config –global 寫入用戶配置
  • git config 寫入項目配置

具體的配置項設置參考幫助文檔,$ git config –help

刪除配置使用unset命令

$ git config --global --unset alias.mycommand

git中的對象

git對象

git對象

git中包含4類對象:

  • commit 提交對象
  • tree 目錄
  • blob 文件
  • tag 標記

git提交便產生一個commit對象,commit對象中包含一個tree對象,tree對象中又會包含其餘的tree對象或是blob對 象,blob對象是最小的組成單元,即獨立的文件。每一個對象都對應一個惟一的SHA-1值,只有當文件或目錄有修改時這個值纔會從新計算髮生改變。

  • $ git log 能夠查看全部commit對象
  • $ git ls-tree <commit> 查看commit對象中的tree對象
  • $ git show <blob> 查看blob的具體內容

git原理

究竟git是如何工做的?打開.git目錄即可一目瞭然。

  • HEAD 指向當前分支
  • config 項目配置文件
  • description 供GitWeb程序使用
  • hooks/ 客戶端與服務端鉤子腳本
  • info/ 忽略模式
  • index 暫存區域信息
  • objects/ 全部數據內容
  • refs/ 指向全部commit的指針

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目錄會包含如下目錄:

  • heads 保存全部分支的HEAD指針
  • remotes 保存遠程倉庫信息
  • tags 保存全部tag指針

逐一地查看這些文件內容,你就什麼都明白了。使用 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底層命名的詳細內容,能夠到網上去找找。

相關文章
相關標籤/搜索