Git打标签与版本控制规范
前言
本文适用于使用Git做VCS(版本控制系统)的场景。
用过Git的程序猿,都喜欢其分布式架构带来的commit
快感。不用像使用SVN这种集中式版本管理系统,每一次提交代码,都要为代码冲突捏一把冷汗。
频繁commit
的背后,带来的结果是一长串密密麻麻的提交记录。
一旦项目出现问题,需要检查某个节点的代码问题,就会有点头疼。
虽然有commit message
,但还是有存在查找困难和描述不清的问题。
本文的侧重点,就是通过Git的打标签功能git tag
来解决这个问题,并用SemVer(语义化版本控制规范)规范标签的命名。
一、打标签
打标签的作用,就是给项目的开发节点,加上语义化的名字,也即功能版本的别名。
打上标签名的同时,写上附带信息,可以方便项目日后维护过程中的回溯和复查。
另外,也可以通过标签记录,大致了解当前项目的向下兼容性、API的修改和迭代情况。
1.1 打标签命令
一般推荐打带附注信息的标签,这样可以最大限度查看标签版本的修改情况。
// 命令格式
git tag -a 标签名 -m "附注信息"
// 示例
git tag -a v0.1.0 -m "完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!"
1.2 举个栗子
一份文集等待出版,有
a、b、c、d
四篇。
现在通过Git管理进度。
1.经过两次commit
操作,添加a.txt
和b.txt
后,将代码修改push到远程仓库。
仓库图表如下:
master -> * 添加b.txt
|
* 添加a.txt
|
* 初始化
2.给当前文集打个标签,顺便留个心情
// 打标签
git tag -a v0.1.0 -m "完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!"
// push 标签到远程仓库
git push origin v0.1.0
仓库图表如下:
master v0.1.0 -> * 添加b.txt
|
* 添加a.txt
|
* 初始化
3.再经过两次commit
操作,添加c.txt
和d.txt
后,将代码修改push到远程仓库。
仓库图表如下:
master -> * 添加d.txt
|
* 添加c.txt
|
v0.1.0 -> * 添加b.txt
|
* 添加a.txt
|
* 初始化
4.文集已经写完,打个完结版的标签
// 打标签
git tag -a v1.0.0 -m "文集完成,共4篇文章,等出版。"
// push 标签到远程仓库
git push origin v1.0.0
仓库图表如下:
master v1.0.0 -> * 添加d.txt
|
* 添加c.txt
|
v0.1.0 -> * 添加b.txt
|
* 添加a.txt
|
* 初始化
5.过了段时间,我想知道文集在v0.1.0
版本的情况
// 输出v0.1.0的详情
git show v0.1.0
// 输出结果
tag v0.1.0
Tagger: wall <582104384@qq.com>
Date: Wed May 23 15:57:13 2018 +0800
完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!
commit 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6 (tag: v0.1.0)
Author: wall <582104384@qq.com>
Date: Wed May 23 15:27:10 2018 +0800
添加b.txt
diff --git a/src/b.txt b/src/b.txt
new file mode 100644
index 0000000..f9ee20e
--- /dev/null
+++ b/src/b.txt
这里,可以清晰地看到当时打标签的内容和附注信息。
还有另外一个方便的点,就是不需要用hash字符串表示的版本号去查看更改。
以下是用版本号查询的结果:
// 用版本号查看
git show 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6
// 输出结果
commit 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6 (tag: v0.1.0)
Author: wall <582104384@qq.com>
Date: Wed May 23 15:27:10 2018 +0800
添加b.txt
diff --git a/src/b.txt b/src/b.txt
new file mode 100644
index 0000000..f9ee20e
--- /dev/null
+++ b/src/b.txt
@@ -0,0 +1 @@
+This is B.
\ No newline at end of file
1.3 归纳优缺点
- 版本号hash字符串不友好,不方便记忆
- 标签语义化,对开发人员友好,方便提取附注的开发信息
二、语义化版本控制规范
像上文的栗子,可以看出使用了v0.1.0
和v1.0.0
打标签。
其实,这里遵循了一套语义化版本控制规范(Semantic Versioning)。
规范的概要如下:
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
- 主版本号:当你做了不兼容的 API 修改,
- 次版本号:当你做了向下兼容的功能性新增,
- 修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
为什么要有这套规范,就是为了避免软件管理的领域里存在的,称为“依赖地狱”的死亡之谷。
规范详情,可以在下面的参考链接获取。
三、参考
[1] 语义化版本2.0
Git打标签与版本控制规范的更多相关文章
- 规范-Git打标签与版本控制
Git打标签与版本控制规范 前言 本文适用于使用Git做VCS(版本控制系统)的场景. 用过Git的程序猿,都喜欢其分布式架构带来的commit快感.不用像使用SVN这种集中式版本管理系统,每一次提交 ...
- 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0
版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...
- 在Xcode中使用Git进行源码版本控制
http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册 iOS开发 Swift Ap ...
- 【Git】标签管理
来源:廖雪峰 为什么要标签: 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来. ...
- Git commit message和工作流规范
目的 统一团队Git commit日志标准,便于后续代码review,版本发布以及日志自动化生成等等. 统一团队的Git工作流,包括分支使用.tag规范.issue等 Git commit日志参考案例 ...
- 语义化版本控制规范(SemVer)
摘自: http://semver.org/lang/zh-CN/ 简介 在软件管理的领域里存在着被称作"依赖地狱"的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在未来的某 ...
- 在TFS中使用Git Tags(标签或标记),实现代码的版本管理
一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...
- 139.00.006 Git学习-标签管理Tag
@(139 - Environment Settings | 环境配置) 一.Why 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取 ...
- git的使用学习(六)git的标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...
随机推荐
- mybatis中autoCommit自动提交事务
今天学习了下mybatis, 对其中的autoCommit自动提交事务比较好奇, 研究了下,把配置和代码都放上 mapper.xml如下: <?xml version="1.0&quo ...
- 自定义UICollectionViewLayout 布局实现瀑布流
自定义 UICollectionViewLayout 布局,实现瀑布流:UICollectionView和UICollectionViewCell 另行创建,这只是布局文件, 外界控制器只要遵守协议并 ...
- Oracle100w数据大表割接
[现网问题] 最近在给咪咕做视频后台管理,移动那边希望页面上,码流字段可以支持1位小数,如8.0.自己查看数据库,发现码流字段是Number整型,也就是要换类型,打算直接换成varchar2.因为自己 ...
- Mysql系列-数据库
一 .数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组 ...
- Mysql分页查询性能分析
[PS:原文手打,转载说明出处,博客园] 前言 看过一堆的百度,最终还是自己做了一次实验,本文基于Mysql5.7.17版本,Mysql引擎为InnoDB,编码为utf8,排序规则为utf8_gene ...
- es6(一):es6介绍以及let,const
es是js的规范,而js是具体实现 将es6转化为es5代码工具:运用的多的是babel 在线转换地址:babel,traceur(属于谷歌) 1.let申明变量:let其实可以完全取代var,并 ...
- Heap
#include using namespace std; int heap[100010],cnt=0; void put(int x) { cnt++; heap[cnt]=x; int now= ...
- 在UltraEdit中如何像NotePad++一样实现双击单词在全文中高亮
NotePad++中有个功能特别好用,就是双击某个单词,这个单词就会在全文档中高亮,如下图 我经常用UltraEdit,结果是UE中没有这个功能,这么实用的功能居然没有? 没关系,在UE中shift+ ...
- Spring中IOC和AOP的理解
IOC和AOP是Spring的核心 IOC:控制反转:将创建对象以及维护对象之间的关系由代码交给了spring容器进行管理,也就是创建对象的方式反转了,交由spring容器进行管理. DI:依赖注入: ...
- FastDFS单机版安装
FastDFS 分布式文件系统 1 目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传 ...