GIT 存储
经常使用Git,有时候就会有个疑问冒出来:Git是如何保存我提交的这些内容的呢?今天总算花点时间搜索了一番,有了个基本的概念,写下来保存。
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看下图。
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像下图所示。
这么作的优点就是,Git的几乎所有操作都是本地操作,你可以即使不联网,你依然可以查看历史,比较变更,提交修改,等到有网络时一次性传上去,而这点对其它VCS是不可能的。
GIT tag
标签可以针对某一时间点的版本做标记,常用于版本发布(标记之后,自动发布),这恰恰是我所需要的功能,将本地标签推送到Github上即发布了一个Release版本,下载和查看非常方便。
git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象,建议使用附注标签,日后还可以查看标签信息。
创建标签
创建轻量标签
$ git tag v0.2.0 -light
解释:创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签
$ git tag -a v0.1.0 -m "release 0.1.0 version"
解释:创建附注标签时,参数-a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。
列出当前仓库的所有标签
$ git tag
列出符合模式的标签
$ git tag -l 'v0.1.*'
查看标签版本信息
$ git show v0.1.0
切换标签与切换分支命令相同
$ git checkout [tagname]
解释:切换标签后处于一个空的分支上,即”You are in ‘detached HEAD’ state.”
删除本地标签
$ git tag -d v0.1.2
删除远程标签
$ git push origin --delete tag 标签名(删除服务器的tag标签,删除本地标签后 用git push origin --tags 不会将删除的标签发到服务器)
解释:参数-d即delete的缩写,意为删除其后指定的标签。
给指定的commit打标签
$ git tag -a v0.1.0 49e0cd22f6bd9510fe65084e023d9c4316b446a6
解释:打标签不必要在HEAD之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和,通过git log命令获取。
将v0.1.0标签提交到git服务器
$ git push origin v0.1.0
解释:通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作。
将本地所有标签一次性提交到git服务器
$ git push origin -–tags