听说有老哥分不清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"

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


往期文章推荐

相关推荐
一 乐43 分钟前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
码事漫谈2 小时前
Protocol Buffers 编码原理深度解析
后端
码事漫谈2 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
踏浪无痕3 小时前
AI 时代架构师如何有效成长?
人工智能·后端·架构
程序员小假4 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
武子康5 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
maozexijr5 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn08955 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
德彪稳坐倒骑驴5 小时前
Git常用命令
git
独断万古他化5 小时前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee