听说有老哥分不清Git branch和tag?这不看看嘛

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

类比

  • Git Branch (分支) :就像一本正在书写中的书书签 。你随时会把书签移动到最新写完的那一页。它会移动 ,代表着一个正在发展的开发线

  • Git Tag (标签) :就像一本已经出版的书版本号 (例如 v1.0, v2.1-release)。一旦出版,这个版本号就永久指向那个特定版本的内容,永远不会改变 。它代表的是一个历史瞬间的快照

Git Branch

git branch 的主要作用是创建、列出、重命名和删除【开发线】。这条开发线让你能在不同的任务(比如新功能、Bug 修复、实验)之间进行隔离和切换,而不会互相干扰。

你可以把它想象成游戏中的存档点平行宇宙

  • 你在主宇宙(main 分支)里有一个稳定的游戏存档。
  • 你想尝试一个高风险的选择,又怕搞砸主存档,于是你创建了一个平行宇宙(新分支)。
  • 你在平行宇宙里随便折腾,无论成功失败,都不会影响主宇宙。
  • 如果尝试成功了,你可以把平行宇宙的成果合并回主宇宙;如果失败了,直接删除这个平行宇宙即可,主宇宙安然无恙。

为什么需要分支?

在没有分支的版本控制系统中:

  • 如果你想开发一个新功能,你必须直接在主代码上修改。
  • 如果功能开发到一半,有一个紧急 Bug 需要修复,你会非常头疼:提交未完成的功能代码会破坏主线,不提交又无法修复 Bug。

分支完美地解决了这个问题:每个任务都可以在独立的分支上完成,互不干扰。

Git Tag

Tag 的主要作用是标记项目历史中的特定点,通常用于发布版本

  1. 版本发布 (最主要用途): 当你发布一个重要的版本(如 v1.0.0, v2.1.0)时,你会在那个提交上打一个标签。这样,任何时候你都可以轻松地获取那个特定版本的代码。

    bash 复制代码
    git tag -a v1.0.0 -m "Release version 1.0.0"
  2. 创建稳定点的引用 : 方便测试、部署或回滚。运维人员可以准确地部署打了 v1.0.0 标签的代码,而不必担心分支已经有了新的、可能不稳定的提交。

  3. 替代难记的提交哈希值 : 相比使用 git checkout a1b2c3d4,使用 git checkout v1.0.0 要直观和容易得多。

标签有两种类型:

  • 轻量标签 (Lightweight):只是一个指向特定提交的指针,就像一个不会移动的分支。

    bash 复制代码
    git tag v1.0.0-lightweight
  • 附注标签 (Annotated) :是 Git 数据库中的一个完整对象。它们包含打标签者的名字、邮箱、日期、标签信息(message),并且可以被签名和验证。推荐始终使用附注标签来发布版本

    bash 复制代码
    git 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)
  1. 使用 Branch (分支)

    • 你在提交 B 处创建了一个新分支 feature/logingit branch feature/login B

    • 你在新分支上工作,提交了 EF

    • 现在历史变了,feature/login 分支指针移动到了 F

      css 复制代码
      `A --- B --- C --- D (main)
               \
                E --- F (feature/login)`
    • 分支指针移动了

  2. 使用 Tag (标签)

    • 你认为提交 D 是一个可以发布的稳定版本。

    • 你在提交 D 上打一个标签: git tag -a v1.0.0 D -m "First release"

    • 之后,你在 main 分支上继续开发,提交了 GH

    • 现在历史看起来是这样:

      css 复制代码
      A --- 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"

简单记:分支用于"前进",标签用于"纪念"。你在一系列提交上"前进"(分支),然后在你值得纪念的地方"立碑"(标签)。


往期文章推荐

相关推荐
SimonKing2 小时前
数据库又慢了?你需要一个像样的慢SQL报警系统
java·后端·程序员
听风同学2 小时前
向量数据库---Chroma数据库入门到进阶教程
后端·架构
法欧特斯卡雷特2 小时前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·前端·后端
Reboot2 小时前
寒武纪显卡命令
后端
码事漫谈2 小时前
为什么C++多态必须使用指针或引用?——从内存布局和对象身份的角度深入解析
后端
风一样的树懒2 小时前
如何建高可用系统:接口限流
后端
Reboot2 小时前
内网IDEA集成离线版DeepSeek指南
后端
惜鸟2 小时前
Python中@classmethod与@staticmethod区别
后端
hayson2 小时前
深入CSP:从设计哲学看Go并发的本质
后端·go