Skip to content

好的,我把我们的对话整理成你的一份学习笔记,包含:学习过程、你的疑问、对应的解答。


你的 Git 分支与版本管理学习记录

第 1 步:如何为一个新项目开启第一个开发分支?

学习过程
你想知道:在一个 Git 仓库中,准备开始第一个版本的开发,应该怎么做才是最佳实践。

你的疑问(隐含)

  • 应该从哪个分支切出来?
  • 分支怎么命名?
  • 推送到远程要注意什么?

解答

  • main(或 master)切出开发分支,如 developfeature/v1-dev
  • 推荐命令:
    bash
    git checkout main
    git pull origin main
    git checkout -b develop
    git push -u origin develop
  • 保护 main,日常开发在 develop 上,稳定后合并回 main 并打 tag。

第 2 步:针对 1‑2 人(数学建模练习平台)的分支策略简化

学习过程
你说明项目规模小(1‑2 人,多数单人),是一个对标 LeetCode 的数学建模练习平台,希望得到更贴合实际的分支建议。

你的疑问(隐含)

  • 企业级 Git Flow 太重,单人怎么简化?
  • 是否还需要 developfeatreleasehotfix 全部保留?

解答

  • 推荐 简化版 GitHub Flow:只保留 main + dev + 短命的 feat/xxx
  • 大多数时候直接在 dev 上开发,完成里程碑后合并到 main 并打 tag。
  • 给出了三种场景(纯单人、明确迭代、两人协作)的不同做法。
  • 强调:tag 比分支更重要,用来记录版本。

第 3 步:明确要使用 4 种分支(feat / release / dev / hotfix),如何管理?

学习过程
你提出希望同时拥有 featreleasedevhotfix 四类分支,要求给出完整的管理方案。

你的疑问

  • 每个分支的职责是什么?
  • 它们之间如何流转?
  • 什么时候创建、合并、删除?

解答

  • 定义四种分支的用途:
    • dev:长期存在,日常集散地。
    • feat/*:单个功能开发,完成后合并回 dev 并删除。
    • release/*:版本发布前的准备(修改版本号、文档、测试),完成后合并到 maindev,然后删除。
    • hotfix/*:紧急修复线上 bug,从 main 切出,修完后合并到 maindev,然后删除。
  • 给出了三个场景的详细命令流(日常功能、版本发布、紧急修复)。
  • 强调:releasehotfix 都是临时分支,用完必须删除

第 4 步:对 release 流程中“合并回 dev 确保版本号变更”产生疑问

学习过程
你仔细阅读了第 3 步中 release 流程的步骤 4(合并回 dev),提出疑问。

你的疑问

  1. 版本号不是打在 release 分支上吗?
  2. 将 release 合并到 main 后,tag 会转移到 main 上吗?
  3. dev 合并 release 后,dev 也会有 tag 的版本号?
  4. release 分支合并后不会被自动删除吗?

解答

  • 澄清版本号 vs tag
    • 版本号是写在文件里(如 package.json 中的 "version": "1.2.0")。
    • tag 是 Git 的标记(如 git tag v1.2.0),附着在某个 commit 上。
  • tag 不会“转移”:在 release 分支上打 tag,tag 只留在那个 commit 上;合并到 main 后,main 得到相同的代码,但 tag 需要在 main 上重新打
  • dev 获得版本号文件:因为 release 分支修改了版本号文件,合并回 dev 后,dev 也会拥有那个版本号(但 dev 上的 tag 与 main 无关)。
  • release 不会自动删除:必须手动执行 git branch -d release/xxxgit push origin --delete release/xxx
  • 给出修正后的正确流程:release 合并到 main → 在 main 上打 tag → 再合并回 dev。

第 5 步:main 分支上一般要进行哪些操作?

学习过程
你想明确 main 分支的职责边界,避免误操作。

你的疑问

  • main 上允许做什么?
  • 绝对不能做什么?
  • 与 dev 的分工是什么?

解答

  • 允许的 4 类操作
    1. 合并 release/* 分支(常规发布)
    2. 合并 hotfix/* 分支(紧急修复)
    3. 打 tag(标记版本)
    4. 只读操作(log、diff、tag 列表)
  • 禁止的操作:直接 commit、直接 push 新代码、合并 dev 到 main、修改已发布 tag、在 main 上解决冲突、删除 main 分支。
  • main 是“成品仓库”,只应通过合并改变内容,永远不直接写代码。
  • 给出保护 main 的远程仓库设置建议(禁止直接 push、禁止 force push)。

第 6 步:如何规范地进行版本号管理?

学习过程
你希望有一套完整的版本号管理规范,与你的分支模型配合。

你的疑问

  • 版本号格式怎么定?
  • 什么情况升 major、minor、patch?
  • 版本号存在哪里?
  • 如何在 release/hotfix 流程中更新版本号?
  • 如何避免 tag 和文件版本号不一致?

解答

  • 采用 语义化版本 v{major}.{minor}.{patch}
    • major:不兼容的重大变更(如重构架构)。
    • minor:新增功能(向下兼容)。
    • patch:bug 修复。
  • 版本号存储在两个地方
    1. 代码文件(package.json / version.py 等) – 程序运行时读取。
    2. Git tag – 标记发布点。
  • 核心流程
    • release/v1.2.0 分支上修改文件版本号 → 合并到 main → 在 main 上打相同版本的 tag → 合并回 dev
    • hotfix/v1.2.1 分支上修改 patch 版本 → 合并到 main → 打 tag → 合并回 dev
  • 原则:
    • 版本号只在 release/hotfix 分支上修改。
    • 文件版本号必须与 tag 严格一致。
    • tag 一旦推送,不可修改(只能打新版本)。
  • 提供了可选的自动化脚本(bump-version.sh)和一页纸速查表。

总结:你的学习成果

  • 掌握了针对小团队/单人项目的 精简 Git Flow(main + dev + feat + release + hotfix)。
  • 理解了每个分支的职责和生命周期。
  • 澄清了版本号文件与 Git tag 的区别,以及 release/hotfix 的正确合并顺序。
  • 明确了 main 分支上允许和禁止的操作。
  • 学会了语义化版本号的规则与实践操作步骤。

现在你可以自信地为自己的数学建模练习平台管理分支和版本了。

记录学习,分享技术