一句话:听说有老哥分不清Git branch和tag?今天我们就好好叨叨这两货!

类比
-
Git Branch (分支) :就像一本正在书写中的书 的书签 。你随时会把书签移动到最新写完的那一页。它会移动 ,代表着一个正在发展的开发线。
-
Git Tag (标签) :就像一本已经出版的书 的版本号 (例如 v1.0, v2.1-release)。一旦出版,这个版本号就永久指向那个特定版本的内容,永远不会改变 。它代表的是一个历史瞬间的快照。
Git Branch
git branch
的主要作用是创建、列出、重命名和删除【开发线】。这条开发线让你能在不同的任务(比如新功能、Bug 修复、实验)之间进行隔离和切换,而不会互相干扰。
你可以把它想象成游戏中的存档点 或平行宇宙:
- 你在主宇宙(
main
分支)里有一个稳定的游戏存档。 - 你想尝试一个高风险的选择,又怕搞砸主存档,于是你创建了一个平行宇宙(新分支)。
- 你在平行宇宙里随便折腾,无论成功失败,都不会影响主宇宙。
- 如果尝试成功了,你可以把平行宇宙的成果合并回主宇宙;如果失败了,直接删除这个平行宇宙即可,主宇宙安然无恙。
为什么需要分支?
在没有分支的版本控制系统中:
- 如果你想开发一个新功能,你必须直接在主代码上修改。
- 如果功能开发到一半,有一个紧急 Bug 需要修复,你会非常头疼:提交未完成的功能代码会破坏主线,不提交又无法修复 Bug。
分支完美地解决了这个问题:每个任务都可以在独立的分支上完成,互不干扰。
Git Tag
Tag 的主要作用是标记项目历史中的特定点,通常用于发布版本。
-
版本发布 (最主要用途): 当你发布一个重要的版本(如 v1.0.0, v2.1.0)时,你会在那个提交上打一个标签。这样,任何时候你都可以轻松地获取那个特定版本的代码。
bashgit tag -a v1.0.0 -m "Release version 1.0.0"
-
创建稳定点的引用 : 方便测试、部署或回滚。运维人员可以准确地部署打了
v1.0.0
标签的代码,而不必担心分支已经有了新的、可能不稳定的提交。 -
替代难记的提交哈希值 : 相比使用
git checkout a1b2c3d4
,使用git checkout v1.0.0
要直观和容易得多。
标签有两种类型:
-
轻量标签 (Lightweight):只是一个指向特定提交的指针,就像一个不会移动的分支。
bashgit tag v1.0.0-lightweight
-
附注标签 (Annotated) :是 Git 数据库中的一个完整对象。它们包含打标签者的名字、邮箱、日期、标签信息(message),并且可以被签名和验证。推荐始终使用附注标签来发布版本。
bashgit tag -a v1.0.0 -m "This is the version 1.0.0 release"
区别比较
下面这个表格清晰地展示了两者的核心差异:
特性 | Git Branch (分支) | Git Tag (标签) |
---|---|---|
目的 | 支持新的开发,用于隔离特性开发或修复 Bug。 | 标记重要的历史节点,通常用于版本发布。 |
是否会移动 | 是(是"移动的指针")。当你在此分支上提交新代码时,分支指针会自动向前移动。 | 否 (是"固定的指针")。一旦创建,它就永久地指向那个特定的提交,永不改变。 |
生命周期 | 临时性的。特性开发完成并合并后,分支通常会被删除。 | 永久性的。一旦创建,通常会永久保留在仓库中,以供未来参考。 |
内容 | 指向一个提交,没有额外信息。 | 附注标签包含丰富的元数据:创建者、日期、标签信息等。 |
常用操作 | git checkout <branch> , git merge <branch> , git branch -d <branch> |
git tag <tagname> , git push --tags , git checkout <tagname> |
类比 | 书签:标记你读到哪了,会随着阅读而移动。 | 版本号:标记一本出版的书籍的特定版次,永不改变。 |
工作流示例
假设你有以下提交历史:
css
A --- B --- C --- D (main)
-
使用 Branch (分支):
-
你在提交
B
处创建了一个新分支feature/login
:git branch feature/login B
-
你在新分支上工作,提交了
E
和F
。 -
现在历史变了,
feature/login
分支指针移动到了F
:css`A --- B --- C --- D (main) \ E --- F (feature/login)`
-
分支指针移动了。
-
-
使用 Tag (标签):
-
你认为提交
D
是一个可以发布的稳定版本。 -
你在提交
D
上打一个标签:git tag -a v1.0.0 D -m "First release"
-
之后,你在
main
分支上继续开发,提交了G
和H
。 -
现在历史看起来是这样:
cssA --- B --- C --- D (v1.0.0) --- G --- H (main)
-
无论未来
main
分支如何发展,标签v1.0.0
永远坚定地指向提交D
。
-
总结
-
什么时候用
branch
? 当你要开发新功能、修复bug ,需要一条独立的、会不断演进的开发线时。例如:git checkout -b feature/new-header
-
什么时候用
tag
? 当你完成一个开发阶段(如测试完毕)、准备发布一个版本 (如 v1.0, v2.1)时,为你当前稳定可靠的代码拍一张"快照"并标记下来。例如:git tag -a v2.1.0 -m "Stable release"
简单记:分支用于"前进",标签用于"纪念"。你在一系列提交上"前进"(分支),然后在你值得纪念的地方"立碑"(标签)。
往期文章推荐