Appearance
分支基础
概述
分支是 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分支指向提交 Cfeature分支指向提交 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
doneHEAD 指针
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-workHEAD 引用
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 的高级操作
下一步
学习完分支基础后,建议继续学习:
