# Git 中如何操作分支?常用命令有哪些?
9 min read
Table of Contents
Git 中如何操作分支?常用命令有哪些?
Git 分支操作与常用命令详解
【核心定义】
Git 分支本质上是一个指向某个提交对象的可变指针,它允许开发者在独立的开发线上进行工作,而不会影响主线代码。
【关键要点】
- 分支的本质:Git 的分支是轻量级的,仅包含指向特定提交的指针,创建和切换分支几乎瞬间完成。
- 分支的创建与切换:使用
git branch <branch-name>创建分支,git checkout <branch-name>或git switch <branch-name>切换分支。 - 分支的合并:通过
git merge或git rebase将不同分支的修改整合到一起,前者保留完整历史,后者创造线性历史。 - 分支的删除:使用
git branch -d <branch-name>删除已合并的分支,-D强制删除未合并的分支。 - 远程分支操作:通过
git push origin <branch-name>推送本地分支到远程,git fetch获取远程分支信息,git pull拉取并合并远程分支。
【深度推导/细节】
分支的底层数据结构
Git 分支在 .git/refs/heads/ 目录下存储为简单的文本文件,内容为对应提交的 SHA-1 哈希值。HEAD 是一个特殊指针,指向当前所在的分支。
分支合并的三种策略
-
Fast-forward(快进合并):当目标分支是当前分支的直接上游时,Git 只需将指针向前移动。
Terminal window # 当前在 feature 分支,master 是 feature 的直接上游git checkout mastergit merge feature # 执行快进合并 -
Recursive(递归合并):当分支出现分叉时,Git 会创建新的合并提交,保留两个分支的历史。
Terminal window # Git 会自动寻找共同祖先,应用差异,创建合并提交 -
Ours/Theirs(策略合并):在解决冲突时,可以选择完全接受某一方的修改。
Terminal window git merge -s ours branchB # 完全采用当前分支的版本
分支冲突解决流程
当两个分支修改了同一文件的相同区域时,会发生冲突:
# Step 1: 尝试合并git merge feature
# Step 2: 发现冲突,Git 会暂停合并CONFLICT (content): Merge conflict in file.txt
# Step 3: 查看冲突状态git status
# Step 4: 手动编辑文件解决冲突# 文件中的冲突标记:# <<<<<<< HEAD# 当前分支的内容# =======# feature 分支的内容# >>>>>>> feature
# Step 5: 标记冲突已解决git add file.txt
# Step 6: 完成合并git commit【关联/对比】
Git 分支 vs SVN 分支
| 特性 | Git 分支 | SVN 分支 |
|---|---|---|
| 创建速度 | 瞬间完成,仅创建指针 | 需要复制整个目录,较慢 |
| 存储方式 | 本地存储,不依赖网络 | 服务器端存储,需要网络 |
| 合并难度 | 智能合并算法,冲突较少 | 合并相对复杂,冲突较多 |
| 工作流程 | 鼓励频繁创建和合并分支 | 分支使用相对保守 |
Merge vs Rebase
| 方面 | Merge | Rebase |
|---|---|---|
| 历史记录 | 保留完整分支历史,形成网状结构 | 创造线性历史,更整洁 |
| 适用场景 | 公共分支合并,需要保留完整历史 | 本地分支整理,准备合并到主线 |
| 风险程度 | 安全,不会重写历史 | 危险,重写历史可能影响他人 |
| 命令示例 | git merge feature | git rebase master |
『面试官追问』
1. 什么情况下应该使用 rebase 而不是 merge?
回答要点:
- 当你在本地特性分支上开发,想要同步主分支最新修改时,使用 rebase 可以保持历史线性
- 永远不要对已经推送到远程仓库的提交进行 rebase,这会重写公共历史
- 在准备将特性分支合并到主分支前,使用 rebase 整理提交历史
- 示例场景:
Terminal window # 在 feature 分支上git fetch origingit rebase origin/master # 将 master 的最新修改应用到 feature 分支底部
2. Git 分支的命名有什么最佳实践?
回答要点:
- 使用有意义的名称:
feature/user-authentication、bugfix/login-error - 遵循团队约定:如
feat/、fix/、hotfix/前缀 - 避免使用特殊字符和空格
- 长期分支:
master/main、develop、release/* - 短期分支:特性完成后应立即删除
3. 如何恢复误删的分支?
回答要点:
# 方法1:使用 reflog 查找分支最后的提交git reflog # 查看所有操作历史git checkout -b <branch-name> <commit-hash> # 从特定提交恢复分支
# 方法2:如果分支已推送到远程git fetch origingit checkout -b <branch-name> origin/<branch-name>4. Git Flow 工作流中的分支策略是什么?
回答要点:
- master/main:生产环境代码,只能通过 release 分支或 hotfix 分支合并
- develop:开发主线,集成所有特性
- feature/:从 develop 分支创建,完成特定功能
- release/:从 develop 分支创建,准备发布版本
- hotfix/:从 master 分支创建,紧急修复生产环境问题
【常用命令速查】
基础分支操作
# 查看所有分支git branch # 本地分支git branch -a # 所有分支(包括远程)git branch -v # 查看分支及其最后提交
# 创建分支git branch <new-branch> # 基于当前提交创建git branch <new-branch> <commit> # 基于特定提交创建git checkout -b <new-branch> # 创建并切换到新分支
# 切换分支git checkout <branch-name>git switch <branch-name> # Git 2.23+ 推荐
# 删除分支git branch -d <branch-name> # 安全删除(已合并)git branch -D <branch-name> # 强制删除(未合并)合并与变基
# 合并分支git merge <branch-name> # 将指定分支合并到当前分支git merge --no-ff <branch-name> # 禁用快进,总是创建合并提交
# 变基操作git rebase <base-branch> # 将当前分支变基到指定分支git rebase -i <commit> # 交互式变基,可以修改提交历史
# 中止操作git merge --abort # 中止合并git rebase --abort # 中止变基远程分支操作
# 推送分支git push origin <branch-name> # 推送本地分支到远程git push -u origin <branch-name> # 推送并设置上游分支
# 获取远程分支git fetch origin # 获取所有远程分支信息git checkout -b <local-branch> origin/<remote-branch> # 创建本地分支跟踪远程分支
# 删除远程分支git push origin --delete <branch-name>git push origin :<branch-name> # 旧语法高级分支管理
# 重命名分支git branch -m <old-name> <new-name> # 重命名当前分支git branch -m <new-name> # 重命名当前分支
# 查看分支关系图git log --oneline --graph --all
# 清理已合并的分支git branch --merged | grep -v "\*" | xargs -n 1 git branch -d【最佳实践建议】
- 分支策略:采用适合团队的工作流(Git Flow、GitHub Flow、GitLab Flow)
- 提交频率:小步快跑,频繁提交,每个提交解决一个明确的问题
- 代码审查:通过 Pull Request/Merge Request 进行代码审查
- 分支清理:及时删除已合并的特性分支,保持仓库整洁
- 备份重要分支:重要的长期分支应推送到远程仓库备份
通过掌握这些分支操作和命令,你可以在团队协作中高效地管理代码开发流程,充分利用 Git 强大的分支功能。