第 5 课:分支管理(Git 的灵魂)

如果说 Git 最伟大的设计是什么,那么答案几乎一定是「分支(Branch)」。

学完这一课,你将理解:

  • 分支到底是什么
  • 为什么团队开发必须使用分支
  • 如何创建、切换、删除分支
  • 如何合并分支
  • 什么是 Fast Forward
  • 什么是三路合并(Three-Way Merge)
  • 为什么会产生冲突
  • 企业项目中的分支管理思想

5.1 为什么需要分支?

假设你正在开发一个博客项目。

当前主分支:

main

代码运行正常。


现在老板说:

新增用户登录功能

如果直接在 main 上开发:

main
 ├── 登录开发一半
 ├── Bug
 ├── 页面报错
 └── 无法上线

风险非常大。


正确做法:

main
 └── feature/login

登录功能在新分支开发。

即使写崩了:

main

仍然稳定。


所以:

分支 = 独立开发空间

5.2 Git 分支的本质

很多人以为:

创建分支
=
复制整个项目

实际上不是。


Git 底层:

分支只是一个指针

例如:

A → B → C
         ↑
       main

创建:

dev

后:

A → B → C
         ↑
      main
         ↑
       dev

几乎不占空间。

创建速度:

毫秒级

这也是 Git 分支强大的原因。


5.3 查看分支

查看本地分支:

git branch

输出:

* main

含义:

*

表示当前所在分支。


5.4 创建分支

创建:

git branch dev

查看:

git branch

输出:

* main

  dev

说明:

dev 创建成功

但当前仍在:

main

5.5 切换分支

切换:

git checkout dev

或者新版 Git:

git switch dev

输出:

Switched to branch 'dev'

查看:

git branch

输出:

main

* dev

5.6 创建并切换分支

最常用命令:

git checkout -b dev

或者:

git switch -c dev

等价于:

git branch dev

git switch dev

开发中最常见:

git checkout -b feature/login

5.7 分支开发演示

当前:

main

创建:

git checkout -b feature/login

创建文件:

login.html

提交:

git add .

git commit -m "完成登录页面"

查看提交图:

A → B → C
          ↑
        main

              D
              ↑
      feature/login

此时:

main

完全没受到影响。


5.8 合并分支

登录功能开发完成。

需要合并:

feature/login

到:

main

第一步:

切回主分支

git switch main

第二步:

执行合并

git merge feature/login

结果:

A → B → C → D
              ↑
            main

登录功能进入主分支。


5.9 Fast Forward 合并

最常见情况:

A → B → C
         ↑
       main
         ↑
     feature

feature 开发:

A → B → C → D → E
                 ↑
              feature

main 没有变化。

此时:

git merge feature

Git 直接把:

main

移动到:

E

这叫:

Fast Forward

简称:

FF 合并

5.10 三路合并(Three-Way Merge)

如果:

main

和:

feature

都发生变化。


例如:

A → B → C
         ↑
      分叉点

main:

A → B → C → D
              ↑
            main

feature:

A → B → C → E
              ↑
          feature

此时:

git merge feature

Git 自动生成:

A → B → C → D
       \      \
        \      M
         \    /
          E

新的:

M

叫:

Merge Commit

这就是:

Three-Way Merge

5.11 查看提交图

非常实用:

git log --oneline --graph --all

效果:

*   9a8b7c Merge branch feature/login

|\
| * 4f3e2d 完成登录功能
|
* 1a2b3c 更新首页

帮助理解:

分支结构

5.12 删除分支

功能开发完成:

git branch -d feature/login

输出:

Deleted branch feature/login

说明:

安全删除

5.13 强制删除分支

如果:

未合并

Git 会阻止删除。


强制删除:

git branch -D feature/login

⚠️ 慎用:

可能导致代码丢失

5.14 查看所有分支

本地:

git branch

远程:

git branch -r

全部:

git branch -a

5.15 推送分支到远程

创建:

git checkout -b feature/login

推送:

git push -u origin feature/login

结果:

本地分支
      ↓
远程分支

建立关联。


以后:

git push

即可。


5.16 删除远程分支

删除:

git push origin --delete feature/login

远程:

feature/login

被删除。


5.17 为什么会产生冲突?

最经典场景:


张三:

String name = "Tom";

修改为:

String name = "Jerry";

李四:

String name = "Tom";

修改为:

String name = "Mike";

Git 不知道保留谁。

于是:

Merge Conflict

冲突产生。


5.18 冲突长什么样?

文件内容:

<<<<<<< HEAD

String name = "Jerry";

=======

String name = "Mike";

>>>>>>> feature/login

含义:

HEAD
=
当前分支代码

=======

分隔线。


>>>>>>>

对方分支代码。


5.19 解决冲突

手动修改:

String name = "Jerry";

或者:

String name = "Mike";

或者:

String name = "Jerry-Mike";

删除:

<<<<<<<
=======
>>>>>>>

标记。


保存。


提交:

git add .

git commit -m "解决登录模块合并冲突"

冲突解决完成。


5.20 企业开发中的分支模型

最常见:

main

生产环境。


dev

开发环境。


feature/*

功能开发。


bugfix/*

线上修复。


结构:

main
 │
 └── dev
      │
      ├── feature/login
      │
      ├── feature/order
      │
      └── bugfix/password

开发流程:

main
 ↓

dev
 ↓

feature
 ↓

dev
 ↓

main

本课总结

掌握以下命令:


查看分支

git branch

创建分支

git branch dev

切换分支

git switch dev

创建并切换

git switch -c dev

合并分支

git merge feature/login

删除分支

git branch -d feature/login

强制删除

git branch -D feature/login

推送分支

git push -u origin feature/login

删除远程分支

git push origin --delete feature/login

牢记企业开发核心思想:

main 永远稳定

功能开发不碰 main

每个功能一个分支

开发完成再合并

至此,你已经掌握了 Git 最核心的能力——分支管理。

下一课《第 6 课:Git 冲突解决与团队协作实战》将进入真实项目场景:

  • 两个人同时开发
  • Pull Request(PR)
  • Code Review
  • 冲突定位
  • 冲突解决技巧
  • Rebase 介绍
  • 企业 Git Flow 工作流

学完这一课,你就已经达到绝大多数初级开发者的 Git 水平。