Skip to content

分支基础

概述

分支是 Git 最强大的特性之一,它允许你在不影响其他工作线的情况下进行独立的开发工作。理解分支的本质对于掌握 Git 至关重要。

什么是分支

分支本质上是一个指向某个提交的可移动指针。每次提交时,当前分支指针就会向前移动,指向新的提交。

分支的作用

  • 并行开发:允许同时进行多个功能或特性的开发
  • 隔离变更:不同分支的修改互不影响
  • 实验性开发:可以创建分支进行实验,失败后直接删除
  • 版本管理:维护不同的产品版本

分支的优势

bash
# 传统版本控制系统
# 需要复制整个项目目录
project-v1/
project-v2/
project-feature-x/

# Git 分支
# 轻量级,瞬间创建
git branch feature-x

分支的本质

Git 的分支实际上仅仅是一个包含 41 个字符的文件,存储着所指提交的 SHA-1 校验和。

指针概念

# 分支指针示意图

    A --- B --- C  (main)
           \
            D --- E  (feature)
  • main 分支指向提交 C
  • feature 分支指向提交 E
  • 提交 D 和 E 的父提交是 B

分支文件位置

bash
# 分支信息存储在 .git/refs/heads/ 目录
.git/
└── refs/
    └── heads/
        ├── main      # main 分支文件
        └── feature   # feature 分支文件

# 查看分支文件内容
cat .git/refs/heads/main
# 输出:a1b2c3d4e5f6... (提交的 SHA-1 值)

轻量级特性

bash
# 创建分支只是创建一个 41 字节的文件
# 几乎不消耗资源,可以创建任意数量的分支

# 创建 100 个分支也只需要几毫秒
for i in {1..100}; do
  git branch test-branch-$i
done

HEAD 指针

HEAD 是一个特殊指针,指向当前所在的分支。

HEAD 的作用

# HEAD 指向当前分支

      A --- B --- C  (main)
             \
              D --- E  (feature)
                       ^
                     (HEAD)

HEAD 文件位置

bash
# HEAD 文件位于 .git/HEAD
cat .git/HEAD
# 输出:ref: refs/heads/main

# 切换分支后
git checkout feature
cat .git/HEAD
# 输出:ref: refs/heads/feature

分离的 HEAD 状态

当 HEAD 直接指向某个提交而不是分支时,称为分离的 HEAD 状态。

bash
# 检出特定提交
git checkout a1b2c3d

# 此时 HEAD 直接指向提交
cat .git/HEAD
# 输出:a1b2c3d4e5f6...

# 在此状态下提交,提交可能丢失
# 应该先创建分支
git checkout -b save-my-work

HEAD 引用

bash
# HEAD 表示当前提交
git show HEAD

# HEAD~1 或 HEAD^ 表示父提交
git show HEAD~1

# HEAD~2 表示祖父提交
git show HEAD~2

# HEAD~2~1 或 HEAD~2^1
git show HEAD~2^1

默认分支

传统默认分支:master

在 Git 早期版本中,默认分支名为 master

新的默认分支:main

从 2020 年开始,Git 和 GitHub 等平台将默认分支改为 main

bash
# Git 2.28+ 可以配置默认分支名
git config --global init.defaultBranch main

# 初始化仓库时指定分支名
git init -b main

修改默认分支

bash
# 重命名分支
git branch -m master main

# 推送新分支到远程
git push origin -u main

# 删除远程旧分支
git push origin --delete master

# 更新远程仓库的默认分支设置
# 需要在 GitHub/GitLab 等平台设置

首次提交前的分支

bash
# 初始化仓库后,还没有任何提交
git init
git branch
# 输出:(无内容,因为没有提交)

# 创建首次提交后,分支才会出现
git commit --allow-empty -m "Initial commit"
git branch
# 输出:* main

分支相关命令

查看分支

bash
# 查看本地分支
git branch

# 查看所有分支(包括远程)
git branch -a

# 查看分支及其最后一次提交
git branch -v

# 查看分支及其上游分支
git branch -vv

# 查看已合并到当前分支的分支
git branch --merged

# 查看未合并到当前分支的分支
git branch --no-merged

分支命名规范

bash
# 好的分支命名
feature/user-authentication
bugfix/login-error
hotfix/security-patch
release/v1.2.0

# 避免的命名
test              # 太模糊
my-branch         # 不描述目的
feature1          # 使用数字而非描述

总结

  • 分支是指向提交的轻量级指针
  • 创建分支几乎不消耗资源
  • HEAD 指针指向当前分支
  • 现代默认分支名为 main
  • 理解分支本质有助于掌握 Git 的高级操作

下一步

学习完分支基础后,建议继续学习: