#### Git學習7:Git中的里程碑
* * * * *
#### 認識里程碑
> 里程碑就是Git中的tag,tag是與某個具體的提交(commit)關聯的,使用里程碑的好處在于可以直觀的看到版本的演變歷史,而不是簡單生硬的commit id。里程碑所關聯的commit是具有一定意義的,通常是在完成某個feature或者bug修復的時候使用,這也是稱之為里程碑的原因。
>
> 里程碑的命令是git tag,可以創建、刪除和查看里程碑。
在Git中還有一個`git stash`命令,用于保存當前的工作進度,相比之下,`git stash`可以在任何操作之后使用該命令,當需要處理其他操作的時候再接著上次的進度繼續操作。
以下創建里程碑的命令實例仍然基于上一篇文章使用的倉庫進行。在正式開始之前,在user1和user2下的project目錄執行git pull。
#### 創建里程碑
git tag創建里程碑的常用命令如下:
~~~
//創建輕量級里程碑
git tag <tagname> [<commit>]
//創建帶說明的里程碑
git tag -m <message> <tagname> [<commit>]
//創建帶GnuPG簽名的里程碑
git tag -s -m <message> <tagname> [<commit>]
~~~
##### 輕量級里程碑
所謂輕量級里程碑是指在創建里程碑的時候無須輸入描述信息。
在user2目錄創建一個輕量級里程碑執行如下命令:
~~~
//創建一個空提交
git commit --allow-empty -m "blank commit."
//創建輕量級里程碑
git tag mytag
//查看創建的里程碑
git tag -l my*(也可以直接使用命令 git tag顯示所有創建的里程碑)
~~~
在創建輕量級里程碑的時候會在版本庫的.git/refs/tags目錄下創建一個新文件mytag,該文件就是剛才創建的輕量級里程碑mytag。該里程碑的信息可以使用如下命令查看:
~~~
//查看.git/refs/tags下的文件
ls -l
//查看這個文件引用的內容
cat .git/refs/tags/mytag
~~~
得到的結果是:
~~~
mytag
abb48d53ec4096f82e1014aa72e015610fa21415
~~~
可以發現是一個SHA-1的哈希值,那么該哈希值也就是該里程碑對應的什么類型的對象呢?使用如下命令:
~~~
//加上-t可以顯示引用對應的類型
git cat-file -t mytag
~~~
輸出結果為:
commit
發現剛才創建的mytag里程碑是一個commit,再繼續查看該commit的內容。使用如下命令:
~~~
//加上-p參數表示查看的是內容
git cat-file -p mytag
~~~
~~~
tree 026ce5f7b29dcd6e8760c1fd72fbd85536c98a49
parent 1e5c65640c4154866c87f20aa4fb78756cc49833
author rhwayfun rhwayfun@163.com 1461832874 +0800
committer rhwayfun rhwayfun@163.com 1461832874 +0800
blank commit.
~~~
顯示了該commit對應的tree對象是026ce5f,父提交是1e5c656,還有提交的作者信息。
然而,在使用git tag創建里程碑的時候不推薦創建輕量級里程碑,因為輕量級里程碑無法知道是誰創建的里程碑(上面顯示了提交的作者信息,那是我配置過的原因),何時創建的。
還有一點就是在使用git describe命令(該命令可以顯示生成的版本描述字符串)無法得到里程碑生成的字符串,而在創建里程碑時添加描述字符串的好處是對版本的開發流程一目了然,commit是無法做到這一點的。
##### 帶說明的里程碑
為了克服輕量級里程碑的缺點,在項目開發中使用較多的還是帶說明的里程碑和帶GnuPG簽名的里程碑。帶說明的里程碑就是在創建里程碑的時候提供一個關于該里程碑的說明。具體演示如下:
~~~
//創建一個空白提交
git commit --allow-empty -m "blank commit for annotated tag test."
//創建帶說明的里程碑
git tag -m "My first annotated tag." mytag2
//查看創建的里程碑,-n<num>表示輸出<num>行帶說明的里程碑,是指將里程碑的說明在<num>行之內的顯示出來,并不是指輸出的里程碑本身的行數
git tag -l -n1
//顯示里程碑的描述字符串
git describe
~~~
執行`git tag -l -n1`后輸出的結果如下:
~~~
mytag blank commit.
mytag2 My first annotated tag.
~~~
這樣就成功創建一個名為mytag2的帶說明的里程碑。要注意的是帶說明的里程碑除了在創建里程碑的時候附帶了說明字符串,而且mytag2不是一個commit了,而是一個tag對象。使用如下命令可以看到:
~~~
//查看mytag2的類型
cat .git/refs/tags/mytag2
//查看mytag2的內容
git cat-file -p mytag2
~~~
依次輸出:
~~~
tag
~~~
表明mytag2是一個tag類型的對象
~~~
object 6d095e6112f25444729ee8cddf8912c626dceca1
type commit
tag mytag2
tagger rhwayfun rhwayfun@163.com 1461833122 +0800
My first annotated tag.
~~~
由此可見,在創建帶說明的里程碑的時候會在版本庫中生成一個tag對象,這個對象記錄了創建該里程碑的相關信息,這些信息包括創建的時間、作者和描述字符串。
#### 帶GnuPG簽名的里程碑
該里程碑與帶說明的里程碑本質是一樣的,只不過在創建里程碑的時候還額外添加了GnuPG簽名。具體創建帶GnuPG簽名的里程碑操作如下:
~~~
//推送最新修改到遠程倉庫,該操作并不會將創建的里程碑也推送到遠程倉庫。這樣設計是為了盡可能保持各自本地倉庫的獨立性,而需要也把里程碑推送到遠程倉庫則需要手動添加
git push
//手動添加創建的里程碑到遠程倉庫
git push origin refs/tags/*
//如果只是添加某一個里程碑則使用如下命令
git push origin mytag
~~~
執行以上的操作后就把本地所創建的里程碑推送到了遠程倉庫,而如果需要查看遠端倉庫的里程碑,可以執行如下命令:
~~~
//顯示遠端倉庫以my開頭的里程碑
git ls-remote origin my*
~~~
顯示結果如下:
~~~
abb48d53ec4096f82e1014aa72e015610fa21415 refs/tags/mytag
ec3edf736cd6e37431546b36d2623659995e005e refs/tags/mytag2
6d095e6112f25444729ee8cddf8912c626dceca1 refs/tags/mytag2^{}
~~~
可以看到,之前創建的兩個里程碑mytag和mytag2都推送到了遠端倉庫。
下面開始創建帶GnuPG簽名的里程碑:
~~~
//仍然創建一個空提交
git commit --allow-empty -m "blank commit for GnuPG-signed tag test."
//開始創建里程碑
git tag -s -m "My first GPG-signed tag." mytag3
~~~
執行失敗,信息如下:
~~~
gpg: directory /home/rhwayfun/.gnupg' created
gpg: new configuration file/home/rhwayfun/.gnupg/gpg.conf’ created
gpg: WARNING: options in /home/rhwayfun/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring/home/rhwayfun/.gnupg/secring.gpg’ created
gpg: keyring `/home/rhwayfun/.gnupg/pubring.gpg’ created
gpg: skipped “rhwayfun rhwayfun@163.com”: secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag
~~~
以上信息告訴我們找不到rhwayfun rhwayfun@163.com簽名可用的公鑰和私鑰對,所以需要首先創建公鑰。
~~~
//查看可用的公鑰,需要首先安裝gnupg
gpg --list-keys
//生成key
gpg --gen-key
~~~
生成key之后再次執行`gpg --list-keys`就可以看到如下的輸出:
~~~
/home/rhwayfun/.gnupg/pubring.gpg
———————————
pub 2048R/24694C17 2016-04-28 [expires: 2016-04-29]
uid user2 user2@163.com
sub 2048R/235AE980 2016-04-28 [expires: 2016-04-29]
~~~
這樣就說明成功創建了公鑰/私鑰對。重新創建里程碑:
~~~
git tag -s -m "My first GPG-signed tag." mytag3
//查看創建的里程碑
git tag -l my* -n1
~~~
輸出如下:
~~~
mytag blank commit.
mytag2 user2 update this annotated tag.
mytag3 My first GPG-signed tag.
~~~
這樣就成功創建了帶簽名的里程碑。
#### 刪除里程碑
刪除本地倉庫的里程碑非常之簡單,只需要執行如下命令就可以刪除。
~~~
git tag -d mytag2
~~~
如果發現刪除錯誤,可以使用如下命令進行補救:
~~~
//ec3edf7該tag指向的commit
git tag mytag2 ec3edf7
~~~
而如果需要刪除遠端倉庫的里程碑則需要使用如下的命令:
~~~
git push <remote_url> :<tagname>
~~~
比如在user1工作區下,需要刪除遠端的mytag2里程碑,那么只需要執行如下命令:
~~~
git push origin :mytag2
~~~
這樣,就完成了遠端里程碑的刪除。
#### 小結
通過實際操作的方式演示了如何創建三種不同類型的里程碑,以及如何刪除本地以及遠程倉庫的里程碑。不過雖然可以對里程碑進行刪除更新等操作,但是里程碑不要應該隨意修改,因為里程碑從概念上講是對歷史提交的一個標記,是具有一定意義的。而且,隨意修改里程碑可能會造成里程碑管理的混亂。在實際的項目開發中只能允許部分人員具有推送遠程里程碑的權限。
* * * * *
版權聲明:本文為博主原創文章,轉載請注明出處。 http://blog.csdn.net/u011116672/article/details/51277341
- 目錄
- 撤銷
- Git reset
- Git revert
- Git reset 命令
- Git的撤消操作 - 重置, 簽出和撤消
- 沖突
- 解決Git合并分支發生的沖突
- BASH
- 復制黏貼
- 教程
- 合并
- 合并提交
- 分支
- Gitee(碼云)
- Github
- 免費私有庫
- 本地倉庫推送到github倉庫
- 工具
- SourceTree
- 添加git-bash.exe到環境變量
- Git
- 安裝
- 配置
- 命令行
- 10個技巧讓開發者的Git水平迅速提升
- 3.2 Git 分支 - 分支的新建與合并
- 遠程分支
- Git幫助
- Git幫助
- 顯示命令幫助
- Git 命令
- 參數配置
- 還原至上次提交
- Git 操作命令
- Git tag
- Git 分支管理
- 認識分支
- 賣主分支
- 分支操作
- 本地倉庫遠程提交
- Git 分區
- 認識里程碑
- 忽略文件
- 已有項目
- 《Git權威指南》