返回知识库

版本协作 · 版本协作

分支Branch

指向某个提交的可移动指针;切换它会挪动 HEAD 和工作区。

先创建一个 feature 分支,盯着指针和 HEAD 怎么挪

一台分支实验台:创建分支只在提交上加一个名字、点分支名切换会挪 HEAD 和工作区、提交让当前分支指针向前、切回 main 后能快进合并、已合并分支可安全删除。结果都长在提交图、工作区和分支清单上,不只是底部一行 status。

分支实验台 · 可移动指针

第 0 步,等价命令:git switch -c <名字> 创建并切换、git switch <名字> 切换、git commit -m 在当前分支前进、 切回 main 后 git merge <名字> 快进、git branch -d <名字> 删已合并分支。 下面创建一个 feature 分支,盯着提交图上的 指针HEAD 怎么挪,工作区跟着怎么变。

提交图点分支名 = git switch,挪 HEAD
3f0a1c2init repo
9d2e8a4add login form
b7c2091show login error
工作区 / working treeshow login error
@ b7c2091HEAD → main
  • README.md
  • src/auth/login.ts
  • src/auth/login-error.ts

切换分支后这里会变:工作区被换成 HEAD 那份提交的快照——这就是「切换挪动 HEAD + 工作区」。

提示:main 受保护,「提交」暂不可用——先点「创建分支并切换」开一个 feature。

分支指向状态 / 操作
mainb7c2091
当前 · HEAD

在 main 上:受保护,不能直接提交。下一步:创建 feature 分支再开工。

从刚才的实验里提炼

盯这些字段,它们都在你刚操作过的提交图、工作区和分支清单上看得见。

  • 分支是指针,不是文件副本:「创建分支」只在当前提交上贴一个新名字——图上多出一个 chip,工作区文件没多没少。所以创建分支是瞬时的、便宜的。
  • 切换 = 挪 HEAD + 换工作区:点别的分支名,HEAD chip 跳过去,工作区的 hash、说明和文件列表也跟着换成那份提交的快照——这就是「切分支文件会变」。
  • 提交让当前指针向前,主线不动:在 feature 上提交,新节点接在当前提交后面,只有当前分支的 chip 往前挪;main 仍在原处,两条线从这里分开。
  • main 受保护,feature 短命:在 main 上「提交」被禁用——直接改主线会让发布跟着半成品跑。合并前都要走 feature:开分支 → 提交 → 合并 → 删除。
  • 合并是快进,删除是摘指针:切回 main 合并一个领先的 feature,main 指针直接挪到 feature 的位置,提交本身一个没动;删已合并分支只摘 chip,提交仍在历史里。

什么时候开分支

从「这条改动能不能单独说清、单独回滚」判断。

  • 用:开始一个可独立完成的功能、修复或文档——立刻 git switch -c feat/<主题>
  • 用:实验性改动、refactor 或依赖升级,单独开分支把风险隔离开主线。
  • 不用:在 main 上直接提交半成品;main 应保持「任何时候都可发布」。
  • 不用:一个分支塞多件不相关的事——合并、回滚和冲突都会失控,拆成多个 feature。

怎么用:从创建到删除已合并分支的最短路径

命名达意、范围单一、合并后清理;全程不让半成品进 main。

  1. git switch main && git pull 把主线更新到最新,再 git switch -c feat/login-error 在当前提交上贴新指针。
  2. 在 feature 上分多次提交,每次一个意图;推送 git push -u origin feat/login-error 并开 PR 让 review 和 CI 跑一遍。
  3. 落后主线时 git rebase main(或 merge)同步并解决冲突;CI 绿后切回 main:git switch main && git pull
  4. git merge feat/login-error 快进或合并提交;随后 git branch -d feat/login-error 删本地、删远程分支,保留发布 tag 和 CI 记录。

正反例:同一个登录修复,只改分支策略

围绕同一个登录错误态,只改变「在不在 main 上、分支范围是否单一」,看可发布性和可回滚性如何不同。

正例从最新 main 拉 feat/login-error,只做登录错误态

git switch main && git pullgit switch -c feat/login-error——只是给当前提交贴个新指针。 在上面分两次提交「清空密码」「补测试」,合并前 git rebase main 同步、CI 转绿,再切回 main 执行git merge feat/login-error 快进,最后删掉已合并的远程分支。main 全程可发布,feature 短命。

feat/login-error
反例直接在 main 上改,或一个分支塞三件事

在 main 直接提交,任何人在它上面拉取、发布都跟着你的半成品跑,出问题要回滚整条主线。若再开一个分支把登录修复、 依赖升级和大重构混做一坨,合并时冲突频发、git revert 牵连无关改动,feature 也永远合不完。

main 上乱改

快速自测

你刚切到 feat/login-error 做了一半,同事让你紧急修一个 main 上的线上 bug,应该怎么开分支?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。