您现在的位置是:首页 >其他 >git tag网站首页其他

git tag

GoldenaArcher 2023-06-16 16:00:02
简介git tag

git tag

tag 现在比较常用的是用来打版本做 release,这块我确实没怎么用过,学习一下。

一般来说一个 tag 会专门对应某一个 commit,可以想成一个 commit 的标签。

关于版本的定义,目前大多数的版本都按照 X.Y.Z 的方式去定义,其中 X 代表 major 更新,即当做了不兼容的 API 修改,Y 代表 minor 更新,即做了向下兼容的功能性新增, Z 代表补丁更新,即做了向下兼容的问题修正。

基本的逻辑是这样的:

  • 0.Y.Z 版本打头的项目应该被视为 beta release,即不稳定的版本
  • 一个版本一旦发布之后,该版本上的代码不应该产生任何变动,每一次有新的功能变化都应该更新版本
  • 修复任何 bug 都应该更新 Z,如果原本的项目版本为 X.Y.10,在更新了 bug 后的下一个版本至少为 X.Y.11
  • 新增一个向下兼容的版本应该更新 Y
  • 新增了一个不向下兼容的版本应该更新 X

其他一些细节的规范可以参考下面的文档,该文档有中文版。

查看并切换 tag

找了一下一些常用的包,最后决定用的案例是 redux,是个前端主流的框架,本身也有八十多个版本,commit 只有三千七百多个,下载下来还挺快的。

➜  redux git:(master) git tag
v0.1.0
v0.1.1
v0.10.0
...

直接使用 git tag 可以查看所有存在的 tags,我这里简单地列举了几个,不过 redux 的版本还是比较稳定的,从 1-5 遵从的格式都是 vX.Y.Z

另一种过滤的方式是使用 -l 这个 flag,如:

➜  redux git:(master) git tag -l "*4.*"
v0.4.0
v3.4.0
v4.0.0
v4.0.0-beta.1
v4.0.0-beta.2
v4.0.0-rc.1
v4.0.1
v4.0.2
v4.0.3
v4.0.4
v4.0.5
v4.1.0
v4.1.0-alpha.0
v4.1.1
v4.1.2
v4.2.0
v4.2.0-alpha.0
v4.2.1
(END)

这样如果知道一些关键词,如 beta, rc, stable, experiemental 等,就可以用这个 flag 进行搜索。

tag 对应的是一个 commit,自然也可以用 checkout、diff 等进行查看和对比,如:

  redux git:(master) git checkout 4.2.0-alpha.0
error: pathspec '4.2.0-alpha.0' did not match any file(s) known to git
➜  redux git:(master) git checkout v4.2.0-alpha.0
Note: switching to 'v4.2.0-alpha.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 1d92031b 4.2.0-alpha.0


➜  redux git:(v4.2.0-alpha.0) git diff v4.2.1
diff --git a/.babelrc.js b/.babelrc.js
index b6aa67e2..a6942cad 100644
--- a/.babelrc.js
+++ b/.babelrc.js
@@ -2,6 +2,7 @@ const { NODE_ENV } = process.env

 module.exports = {
   presets: [
+    '@babel/typescript',
     [
       '@babel/env',
       {
diff --git a/.eslintignore b/.eslintignore
index 7fb555f2..efac9cb6 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,4 +2,5 @@
 **/node_modules/**
 **/server.js
 **/webpack.config*.js
-**/flow-typed/**
+# TODO: figure out a way to lint this using flow instead of typescript
+examples/todos-flow
diff --git a/.eslintrc.js b/.eslintrc.js
index de792fb8..8f8944f9 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,22 +1,36 @@

创建 tag

tag 有两种,lightweight 和 annotated。

lightweight tag

真的很快,语法为 git tag <tagname>

➜  redux git:(master)git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
➜  redux git:(master)git add .
➜  redux git:(master)git commit -m "add text to readme"
[master 11d94c7a] add text to readme
 1 file changed, 2 insertions(+)
➜  redux git:(master) git tag  v5.0.0-alpha.6
➜  redux git:(master) git tag -l "*alpha.6"
v5.0.0-alpha.6
(END)

annotated tag

比起来,annotated tag 会包含更多的 meta 信息,语法为:git tag -a <tagname>,然后会让填写信息。如果信息比较短的话,也可以直接用 -m

➜  redux git:(master)git add .
➜  redux git:(master)git commit -m "add new message"
[master 49d04ce8] add new message
 1 file changed, 3 insertions(+)
➜  redux git:(master) git tag -a v5.0.1

除此之外,annotated tag 还会跳出来让写 commit message:

在这里插入图片描述

查看的方式为 git show <tagname>

➜  redux git:(master) git show v5.0.1
tag v5.0.1
Tagger: XXXXXX
Date:   Tue Apr 25 14:47:49 2023 -0400

This is an annotated tag!

对比 lightweight:

➜  redux git:(master) git show v5.0.0-alpha.6
commit 11d94c7a0fb7ef4fdcefb6e701674c2449804abd (tag: v5.0.0-alpha.6)
Author: XXXXX
Date:   Tue Apr 25 14:42:46 2023 -0400

    add text to readme

tag 之前的 commit

语法为:git tag <tag-name> <commit>

➜  redux git:(master) git tag diff-tag 30635355
➜  redux git:(master) git log --oneline

效果:

在这里插入图片描述

更新 tag

这个一般……不太用,需要用 -f 这个 flag 强制执行。

以上面的截图为例,假设我将 v5.0.0-alpha.6 换个位置,直接使用 tag 就会报错:

➜  redux git:(master) git tag v5.0.0-alpha.6  34308acd
fatal: tag 'v5.0.0-alpha.6' already exists
➜  redux git:(master) git tag v5.0.0-alpha.6  34308acd -f
Updated tag 'v5.0.0-alpha.6' (was 11d94c7a)

在这里插入图片描述

再次查看,tag 的 ref 就会更新。

删除 tag

使用 flag -d

➜  redux git:(master) git tag -d v5.0.1
Deleted tag 'v5.0.1' (was b5834ca2)

在这里插入图片描述

推送 tag

默认情况下,git push 不会推送 tag,想要推送的话有两种方式:

  1. git push --tags

    这会推送所有本地的 tags

  2. git push origin <tag-name>

    这会推送对应的 tag

reference

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。