前言

本文适用于使用Git做VCS(版本控制系统)的场景。

用过Git的程序猿,都喜欢其分布式架构带来的commit快感。不用像使用SVN这种集中式版本管理系统,每一次提交代码,都要为代码冲突捏一把冷汗。

频繁commit的背后,带来的结果是一长串密密麻麻的提交记录。

一旦项目出现问题,需要检查某个节点的代码问题,就会有点头疼。

虽然有commit message,但还是有存在查找困难和描述不清的问题。

本文的侧重点,就是通过Git的打标签功能git tag来解决这个问题,并用SemVer(语义化版本控制规范)规范标签的命名。

一、打标签

打标签的作用,就是给项目的开发节点,加上语义化的名字,也即功能版本的别名。

打上标签名的同时,写上附带信息,可以方便项目日后维护过程中的回溯和复查。

另外,也可以通过标签记录,大致了解当前项目的向下兼容性、API的修改和迭代情况。

1.1 打标签命令

一般推荐打带附注信息的标签,这样可以最大限度查看标签版本的修改情况。

  1. // 命令格式
  2. git tag -a 标签名 -m "附注信息"
  3. // 示例
  4. git tag -a v0.1.0 -m "完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!"

1.2 举个栗子

一份文集等待出版,有a、b、c、d四篇。

现在通过Git管理进度。

1.经过两次commit操作,添加a.txtb.txt后,将代码修改push到远程仓库。

仓库图表如下:

  1. master -> * 添加b.txt
  2. |
  3. * 添加a.txt
  4. |
  5. * 初始化

2.给当前文集打个标签,顺便留个心情

  1. // 打标签
  2. git tag -a v0.1.0 -m "完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!"
  3. // push 标签到远程仓库
  4. git push origin v0.1.0

仓库图表如下:

  1. master v0.1.0 -> * 添加b.txt
  2. |
  3. * 添加a.txt
  4. |
  5. * 初始化

3.再经过两次commit操作,添加c.txtd.txt后,将代码修改push到远程仓库。

仓库图表如下:

  1. master -> * 添加d.txt
  2. |
  3. * 添加c.txt
  4. |
  5. v0.1.0 -> * 添加b.txt
  6. |
  7. * 添加a.txt
  8. |
  9. * 初始化

4.文集已经写完,打个完结版的标签

  1. // 打标签
  2. git tag -a v1.0.0 -m "文集完成,共4篇文章,等出版。"
  3. // push 标签到远程仓库
  4. git push origin v1.0.0

仓库图表如下:

  1. master v1.0.0 -> * 添加d.txt
  2. |
  3. * 添加c.txt
  4. |
  5. v0.1.0 -> * 添加b.txt
  6. |
  7. * 添加a.txt
  8. |
  9. * 初始化

5.过了段时间,我想知道文集在v0.1.0版本的情况

  1. // 输出v0.1.0的详情
  2. git show v0.1.0
  3. // 输出结果
  4. tag v0.1.0
  5. Tagger: wall <582104384@qq.com>
  6. Date: Wed May 23 15:57:13 2018 +0800
  7. 完成了文章a和文章b的撰写,耗费时间2h,感觉棒棒的!
  8. commit 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6 (tag: v0.1.0)
  9. Author: wall <582104384@qq.com>
  10. Date: Wed May 23 15:27:10 2018 +0800
  11. 添加b.txt
  12. diff --git a/src/b.txt b/src/b.txt
  13. new file mode 100644
  14. index 0000000..f9ee20e
  15. --- /dev/null
  16. +++ b/src/b.txt

这里,可以清晰地看到当时打标签的内容和附注信息。

还有另外一个方便的点,就是不需要用hash字符串表示的版本号去查看更改。

以下是用版本号查询的结果:

  1. // 用版本号查看
  2. git show 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6
  3. // 输出结果
  4. commit 7107eb8b3f870cd864e3eb5b14f26184d73dd1e6 (tag: v0.1.0)
  5. Author: wall <582104384@qq.com>
  6. Date: Wed May 23 15:27:10 2018 +0800
  7. 添加b.txt
  8. diff --git a/src/b.txt b/src/b.txt
  9. new file mode 100644
  10. index 0000000..f9ee20e
  11. --- /dev/null
  12. +++ b/src/b.txt
  13. @@ -0,0 +1 @@
  14. +This is B.
  15. \ No newline at end of file

1.3 归纳优缺点

  • 版本号hash字符串不友好,不方便记忆
  • 标签语义化,对开发人员友好,方便提取附注的开发信息

二、语义化版本控制规范

像上文的栗子,可以看出使用了v0.1.0v1.0.0打标签。

其实,这里遵循了一套语义化版本控制规范(Semantic Versioning)。

规范的概要如下:

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改,
  2. 次版本号:当你做了向下兼容的功能性新增,
  3. 修订号:当你做了向下兼容的问题修正。

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

为什么要有这套规范,就是为了避免软件管理的领域里存在的,称为“依赖地狱”的死亡之谷。

规范详情,可以在下面的参考链接获取。

三、参考

[1] 语义化版本2.0

Git打标签与版本控制规范的更多相关文章

  1. 规范-Git打标签与版本控制

    Git打标签与版本控制规范 前言 本文适用于使用Git做VCS(版本控制系统)的场景. 用过Git的程序猿,都喜欢其分布式架构带来的commit快感.不用像使用SVN这种集中式版本管理系统,每一次提交 ...

  2. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  3. 在Xcode中使用Git进行源码版本控制

    http://www.cocoachina.com/ios/20140524/8536.html 资讯 论坛 代码 工具 招聘 CVP 外快 博客new 登录| 注册   iOS开发 Swift Ap ...

  4. 【Git】标签管理

    来源:廖雪峰 为什么要标签: 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来. ...

  5. Git commit message和工作流规范

    目的 统一团队Git commit日志标准,便于后续代码review,版本发布以及日志自动化生成等等. 统一团队的Git工作流,包括分支使用.tag规范.issue等 Git commit日志参考案例 ...

  6. 语义化版本控制规范(SemVer)

    摘自: http://semver.org/lang/zh-CN/ 简介 在软件管理的领域里存在着被称作"依赖地狱"的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在未来的某 ...

  7. 在TFS中使用Git Tags(标签或标记),实现代码的版本管理

    一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...

  8. 139.00.006 Git学习-标签管理Tag

    @(139 - Environment Settings | 环境配置) 一.Why 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取 ...

  9. git的使用学习(六)git的标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

随机推荐

  1. ARP 协议抓包分析

    ARP(Address Resolution Protocol)- 地址解析分析 ARP 协议是根据IP地址获取物理地址的一个TCP/IP协议. 当PC1 想与 PC2 进行通信时,需要同时知道PC2 ...

  2. Demo1

    <!DOCTYPE html> <html lang="zh"> <header> <meta charset="utf-8&q ...

  3. Mego(04) - NET简单实现EXCEL导入导出

    前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...

  4. Spring Boot + Jersey发生FileNotFoundException (No such file or directory)

    我在使用Spring Boot + Jersey 项目,解决了上一篇随笔中的FileNotFoundException,然后又报了一个FileNotFoundException,不过报错信息不一样了 ...

  5. Eclipse的优化

    1. 取消系统的自动折叠 Window->Preferences-> Java->Editor->Folding: Enable folding 2. 取消按".&q ...

  6. Netty入门

    一.NIO Netty框架底层是对NIO的高度封装,所以想要更好的学习Netty之前,应先了解下什么是NIO - NIO是non-blocking的简称,在jdk1.4 里提供的新api,他的他的特性 ...

  7. Android Studio集成Lombok Plugin

    Lombok是Android Studio名列前茅的插件,有啥用,看这个:http://www.blogjava.NET/fancydeepin/archive/2012/07/12/lombok.h ...

  8. Linux的动态库与静态库

    1.动态库与静态库简介 在实际的软件开发中,为了方便使用一些被重复调用的公共代码,我们经常将这些公共的函数编译成动态库或静态库.我们知道程序一般要经过预处理.编译.汇编和链接这几个步骤才能变成可执行的 ...

  9. Nginx日志自动按日期存储

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,因它的稳定性.丰富的功能集.示例配置文件和 ...

  10. mybatis源码解读(四)——事务的配置

    上一篇博客我们介绍了mybatis中关于数据源的配置原理,本篇博客介绍mybatis的事务管理. 对于事务,我们是在mybatis-configuration.xml 文件中配置的: 关于解析 < ...