branch 可移动,代表持续演进的开发路径;tag 不可变,是永久锚定某次 commit 的快照。branch 指针随提交自动前移,支持切换、合并与远程同步;tag 仅标记历史点,不可直接提交,需新建分支操作,且默认不推送。

branch 和 tag 都是指向某个 commit 的指针,但一个会动,一个死钉在那儿——这是最核心、最不能绕开的区别。
branch 是可移动的开发线,不是快照
每次你在 branch 上执行 git commit,这个分支指针就自动前移,指向新提交。它本质是一条「提交链」的游标,代表一条持续演进的开发路径。
- 你可以在
main上改代码、提交,main就往前走;切到feature/login提交,那个分支也往前走 -
git checkout或git switch切换分支时,工作区和HEAD一起跟着动,但分支本身只负责“记住最新位置” - 删除未合并的分支,Git 会阻止(
git branch -d报错),因为怕丢提交;强制删用-D - 远程分支(如
origin/main)是本地对远程状态的缓存,git fetch后才更新,不是实时同步
tag 是不可变的提交锚点,不是分支
tag 创建后永远绑定到某次 commit 的哈希值,哪怕后续再怎么提交、删分支、重写历史,只要那个 commit 还在,tag 就不动。
-
git tag v1.0.0是轻量标签,只存 commit ID;git tag -a v1.0.1 -m "hotfix"是附注标签,还带签名和消息,推荐用于正式发布 -
git checkout v1.0.0会进入“分离 HEAD”状态——你不能直接在 tag 上提交,否则新提交没分支指向,容易丢失 - 远程默认不推送 tag:
git push origin v1.0.0推单个,git push origin --tags推全部,漏推是常见发布事故源头 - 误删远程 tag?
git push origin :refs/tags/v1.0.0(注意冒号前空格)或git push origin --delete v1.0.0
检出 tag 后想改代码,必须另起分支
直接 git checkout v1.0.0 后改代码、git commit,会产生一个孤立提交:没有分支引用它,下次 git gc 可能清理掉。
- 正确做法:
git checkout -b hotfix-v1.0.0 v1.0.0—— 基于 tag 新建分支,再提交 - 如果只是临时看代码,
git show v1.0.0:src/main.js比 checkout 更安全,不切换环境 - CI/CD 脚本里用
git describe --tags获取最近 tag,比硬编码版本号更可靠


















