您现在的位置是:首页 >其他 >git tag网站首页其他
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,想要推送的话有两种方式:
-
git push --tags
这会推送所有本地的 tags
-
git push origin <tag-name>
这会推送对应的 tag