Git 核心概念:Tag 与 Branch 的本质区别

📅 发布时间:2026/7/8 18:19:00 👁️ 浏览次数:
Git 核心概念:Tag 与 Branch 的本质区别
核心概念一句话总结Branch分支可移动的指针用于开发Tag标签固定的书签用于标记版本形象比喻Branch 像导航路标想象你在修路开发项目 起点 ──→ 路段A ──→ 路段B ──→ 路段C ↑ 路标main分支 修新路段D后路标会往前移 起点 ──→ 路段A ──→ 路段B ──→ 路段C ──→ 路段D ↑ 路标自动前进Tag 像里程碑想象公路上的里程碑 起点 ──→ 100km ──→ 200km ──→ 300km ↑ ↑ ↑ 里程碑1 里程碑2 里程碑3 即使继续修路里程碑的位置永远不变 起点 ──→ 100km ──→ 200km ──→ 300km ──→ 400km ↑ ↑ ↑ v1.0.0 v2.0.0 v3.0.0固定不变深入理解 BranchBranch 的工作原理初始状态 A ← B ← C ↑ main分支指针 提交新 commit D A ← B ← C ← D ↑ main自动移动 再提交 commit E A ← B ← C ← D ← E ↑ main继续移动Branch 的特点✅可移动性# 每次提交分支指针都会自动前进gitcommit -m新功能# main分支自动移到新commit✅可以同时存在多个D ← E ← feature分支 ↗ A ← B ← C ← F ← G ← main分支✅可以合并gitmerge feature# 把feature分支合并到main✅可以删除gitbranch -d feature# 删除分支commit不会删除Branch 的本质Branch 只是一个指向 commit 的指针# 查看分支指向哪个commit$gitlog main -1 commit abc1234...(main)# 本质上分支存储在这里.git/refs/heads/main# 文件内容就是commit的hash深入理解 TagTag 的工作原理发布版本历史 A ← B ← C ← D ← E ← F ← G ↑ ↑ ↑ v1.0.0 v2.0.0 v3.0.0永远固定 继续开发 A ← B ← C ← D ← E ← F ← G ← H ← I ↑ ↑ ↑ v1.0.0 v2.0.0 v3.0.0位置不变Tag 的特点不可移动性# Tag创建后就固定了gittag v1.0.0# 创建taggitcommit -m新提交# tag位置不变只能删除不能移动# 如果打错了tag只能删除重建gittag -d v1.0.0# 删除旧taggittag v1.0.0 abc123# 在正确的commit上重建通常用于标记发布版本gittag -a v4.0.3 -mRelease version 4.0.3Tag 的本质Tag 是一个永久指向特定 commit 的引用# Tag存储在这里.git/refs/tags/v4.0.3# 永远指向同一个commit# 查看tag信息$gitshow v4.0.3 tag v4.0.3 Tagger: Jesse Vincentjessefsck.comDate: Thu Jan232026Release v4.0.3: Strengthen using-superpowers关键区别对比直观对比表特性Branch分支Tag标签作用开发、追踪进度标记版本、存档移动性✅ 自动移动❌ 固定不动可修改✅ 可以提交新内容❌ 只读技术上可以删除重建生命周期可以删除通常永久保留使用场景日常开发版本发布checkout后正常状态Detached HEAD状态命名约定功能描述feature/xxx版本号v1.0.0技术层面对比1. 存储位置不同# 分支.git/refs/heads/main .git/refs/heads/develop# 标签.git/refs/tags/v1.0.0 .git/refs/tags/v2.0.02. checkout 行为不同# checkout 分支 → 正常状态$gitcheckout main Switched to branchmainYour branch is up todatewithorigin/main.# checkout tag → Detached HEAD$gitcheckout v4.0.3 Note: switching tov4.0.3.You areindetached HEADstate... HEAD is now at b9e1649 Release v4.0.33. 提交行为不同# 在分支上提交$gitcheckout main $gitcommit -m新功能[main abc1234]新功能# ✅ 分支自动前进# 在tag上提交实际上不推荐$gitcheckout v4.0.3 $gitcommit -m修改[detached HEAD xyz5678]修改# ⚠️ commit游离容易丢失实际应用场景Branch 的使用场景场景1功能开发# 创建功能分支gitcheckout -b feature/user-login# 开发过程中多次提交gitcommit -m添加登录表单gitcommit -m实现登录逻辑gitcommit -m添加错误处理# 合并回主分支gitcheckout maingitmerge feature/user-login场景2Bug 修复# 创建修复分支gitcheckout -b fix/login-error# 修复并提交gitcommit -m修复登录超时问题# 合并gitcheckout maingitmerge fix/login-error场景3并行开发# 团队成员各自开发gitcheckout -b feature/payment# 张三开发支付gitcheckout -b feature/admin# 李四开发后台gitcheckout -b feature/mobile# 王五开发移动端# 各自完成后合并到mainTag 的使用场景场景1版本发布# 开发完成准备发布v1.0.0gitcheckout maingittag -a v1.0.0 -m首次正式发布gitpush origin v1.0.0# 用户下载gitclone https://github.com/xxx/project.gitcdprojectgitcheckout v1.0.0# 获取1.0.0版本场景2Bug 回溯# 用户报告v2.3.1有bug# 开发者立即检出那个版本gitcheckout v2.3.1# 复现bug找到问题所在场景3版本对比# 对比两个发布版本的差异gitdiffv1.0.0 v2.0.0# 查看某个版本的代码gitshow v1.5.0:src/main.js 重点总结核心原则开发用 Branch发布用 TagBranch是活的movableTag是死的immutableBranch 可以改Tag 不能改Branch可以随意提交、合并、删除Tag创建后就固定只能删除重建Checkout 行为不同git checkout branch→ 正常工作模式git checkout tag→ Detached HEAD模式只读记忆口诀分支动标签静 开发用分支发布打标签 分支可移动标签不能变 切换分支正常切换标签警告最佳实践✅DO推荐用分支进行日常开发发布版本时打tagTag命名遵循语义化版本v1.2.3重要版本永久保留tag❌DON’T不推荐不要在tag上直接开发不要随意删除已发布的tag不要用分支来标记版本不要在detached HEAD状态下长期工作