# Git 中如何操作分支?常用命令有哪些?

9 min read
Table of Contents

Git 中如何操作分支?常用命令有哪些?

Git 分支操作与常用命令详解

【核心定义】

Git 分支本质上是一个指向某个提交对象的可变指针,它允许开发者在独立的开发线上进行工作,而不会影响主线代码。

【关键要点】

  1. 分支的本质:Git 的分支是轻量级的,仅包含指向特定提交的指针,创建和切换分支几乎瞬间完成。
  2. 分支的创建与切换:使用 git branch <branch-name> 创建分支,git checkout <branch-name> 或 git switch <branch-name> 切换分支。
  3. 分支的合并:通过 git merge 或 git rebase 将不同分支的修改整合到一起,前者保留完整历史,后者创造线性历史。
  4. 分支的删除:使用 git branch -d <branch-name> 删除已合并的分支,-D 强制删除未合并的分支。
  5. 远程分支操作:通过 git push origin <branch-name> 推送本地分支到远程,git fetch 获取远程分支信息,git pull 拉取并合并远程分支。

【深度推导/细节】

分支的底层数据结构

Git 分支在 .git/refs/heads/ 目录下存储为简单的文本文件,内容为对应提交的 SHA-1 哈希值。HEAD 是一个特殊指针,指向当前所在的分支。

分支合并的三种策略

  1. Fast-forward(快进合并):当目标分支是当前分支的直接上游时,Git 只需将指针向前移动。

    Terminal window
    # 当前在 feature 分支,master 是 feature 的直接上游
    git checkout master
    git merge feature # 执行快进合并
  2. Recursive(递归合并):当分支出现分叉时,Git 会创建新的合并提交,保留两个分支的历史。

    Terminal window
    # Git 会自动寻找共同祖先,应用差异,创建合并提交
  3. Ours/Theirs(策略合并):在解决冲突时,可以选择完全接受某一方的修改。

    Terminal window
    git merge -s ours branchB # 完全采用当前分支的版本

分支冲突解决流程

当两个分支修改了同一文件的相同区域时,会发生冲突:

Terminal window
# 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

方面MergeRebase
历史记录保留完整分支历史,形成网状结构创造线性历史,更整洁
适用场景公共分支合并,需要保留完整历史本地分支整理,准备合并到主线
风险程度安全,不会重写历史危险,重写历史可能影响他人
命令示例git merge featuregit rebase master

『面试官追问』

1. 什么情况下应该使用 rebase 而不是 merge?

回答要点:

  • 当你在本地特性分支上开发,想要同步主分支最新修改时,使用 rebase 可以保持历史线性
  • 永远不要对已经推送到远程仓库的提交进行 rebase,这会重写公共历史
  • 在准备将特性分支合并到主分支前,使用 rebase 整理提交历史
  • 示例场景:
    Terminal window
    # 在 feature 分支上
    git fetch origin
    git rebase origin/master # 将 master 的最新修改应用到 feature 分支底部

2. Git 分支的命名有什么最佳实践?

回答要点:

  • 使用有意义的名称:feature/user-authentication、bugfix/login-error
  • 遵循团队约定:如 feat/、fix/、hotfix/ 前缀
  • 避免使用特殊字符和空格
  • 长期分支:master/main、develop、release/*
  • 短期分支:特性完成后应立即删除

3. 如何恢复误删的分支?

回答要点:

Terminal window
# 方法1:使用 reflog 查找分支最后的提交
git reflog # 查看所有操作历史
git checkout -b <branch-name> <commit-hash> # 从特定提交恢复分支
# 方法2:如果分支已推送到远程
git fetch origin
git checkout -b <branch-name> origin/<branch-name>

4. Git Flow 工作流中的分支策略是什么?

回答要点:

  • master/main:生产环境代码,只能通过 release 分支或 hotfix 分支合并
  • develop:开发主线,集成所有特性
  • feature/:从 develop 分支创建,完成特定功能
  • release/:从 develop 分支创建,准备发布版本
  • hotfix/:从 master 分支创建,紧急修复生产环境问题

【常用命令速查】

基础分支操作

Terminal window
# 查看所有分支
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> # 强制删除(未合并)

合并与变基

Terminal window
# 合并分支
git merge <branch-name> # 将指定分支合并到当前分支
git merge --no-ff <branch-name> # 禁用快进,总是创建合并提交
# 变基操作
git rebase <base-branch> # 将当前分支变基到指定分支
git rebase -i <commit> # 交互式变基,可以修改提交历史
# 中止操作
git merge --abort # 中止合并
git rebase --abort # 中止变基

远程分支操作

Terminal window
# 推送分支
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> # 旧语法

高级分支管理

Terminal window
# 重命名分支
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

【最佳实践建议】

  1. 分支策略:采用适合团队的工作流(Git Flow、GitHub Flow、GitLab Flow)
  2. 提交频率:小步快跑,频繁提交,每个提交解决一个明确的问题
  3. 代码审查:通过 Pull Request/Merge Request 进行代码审查
  4. 分支清理:及时删除已合并的特性分支,保持仓库整洁
  5. 备份重要分支:重要的长期分支应推送到远程仓库备份

通过掌握这些分支操作和命令,你可以在团队协作中高效地管理代码开发流程,充分利用 Git 强大的分支功能。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

# Git 中的文件有哪些状态?

4 min read

【核心定义】Git 中的文件状态是指文件在工作区、暂存区(索引区)和版本库之间的流转关系,核心分为未跟踪、已修改、已暂存、未修改四种基本状态。

Read

Comments