Git | 分支管理操作

基本概念

概念
  • 分支指针 ------ 指向某个具体的提交,表示该分支的最新状态 (如 masterdev
    • 可移动:每次在分支提交代码,分支指针会自动向前移动
  • HEAD 指针 ------ 指向当前位置所在分支的最新提交,表示"正在哪个分支上工作 "
    • 临时性:HEAD 值随 git switchgit checkout 切换分支而改变
原理
初始状态
  • 一开始,master 分支是一条线,GitHEAD 指向 master ,用 master 指向最新的提交,确定当前分支 master 以及提交点
  • 每次提交,master 分支指针向前移动随着不断提交,master分支线越来越长
创建分支
  • 创建新分支 dev 时,Git 新建指针 dev,指向 master 相同提交,确定当前分支 dev 以及提交点
  • 每次 dev 分支提交,dev 指针向前移动,master 指针不变
快速合并 fast-forward
  • 情况dev 分支有新提交 ,而 master 主分支无新提交,提交结构是一条线
  • 操作 :直接让 master 指向 dev 的当前提交,HEAD 指针指向 master ,完成合并
非快速合并 not-fast-forward
  • 情况feature 分支、master 主分支各自有新的提交,提交结构不是一条线
  • 操作Git无法执行快速合并,只能试图把各自的修改合并起来
  • 冲突解决 :合并时如果两个分支对同一个文件都有修改,可能产生冲突,需打开冲突文件解决冲突

指令介绍

分支创建\查看\删除\重命名 git branch
  • 语法

    sh 复制代码
    git branch [<options>] <branch-name>  [--merged] [--no-merged]
    选项 功能
    -a / --all 显示所有分支,包括远程跟踪分支
    -d / --delete 删除已合并的分支(需已合并到当前分支)
    -D 强制删除分支(即使未合并)
    -m / --move 重命名当前分支
    -r / --remote 仅列出远程分支
    -v / --verbose 显示分支的详细信息(包括最后一次提交和跟踪关系)
    -vv 显示分支的详细跟踪信息
    --no-merged 显示未合并的分支
    --merged 显示已合并的分支
  • 具体示例

    • 查看分支情况

      sh 复制代码
      $ git branch		# 查看本地分支
      $ git branch -a	# 查看本地、远程的所有分支
    • 创建分支

      sh 复制代码
      $ git branch feature/login
    • 删除分支

      sh 复制代码
      $ git branch -d feature/login		# 删除已合并的分支
      $ git branch -D feature/login		# 强制删除未合并的分支
分支切换\创建\合并 git checkout
  • 语法

    sh 复制代码
    git checkout [<options>] [<branch>]
    参数 功能
    -b / --branch 创建新分支并切换(分支存在时报错)
    -B / --force-branch 强制创建/重置分支并切换(覆盖现有分支)
    -m / --merge 执行三方合并到新分支,保留未提交的更改
    -f / --force 强制切换,丢弃本地修改 (危险:会丢失未提交的更改)
    -2 / --ours 合并冲突时检出我方版本解决冲突
    -3 / --theirs 合并冲突时检出对方版本解决冲突
  • 具体示例

    • 切换分支

      sh 复制代码
      git checkout main			# 切换到已存在的分支
      git checkout -f feature		# 强制切换(丢弃工作区修改)
    • 创建分支

      sh 复制代码
      git checkout -b feature					# 从当前分支最新提交创建新分支
      git checkout -b feature abc123			# 从当前分支指定提交创建分支(分支不存在时报错)
      git checkout -B feature        			# 强制创建/重置分支(分支存在则重置)
    • 解决合并冲突

      sh 复制代码
      git checkout --ours conflicted-file.js		# 保留当前分支的版本(--ours)
      git checkout --theirs conflicted-file.js	# 保留合并分支的版本(--theirs)
专用分支切换 git switch

专门用于切换分支,由 Git 2.23 引入,替代 git checkout 的分支操作相关功能,在功能上等价

  • 语法

    sh 复制代码
    git switch [<options>] [<branch>]
    参数 功能
    -c / --create 创建新分支并切换(分支存在时报错)
    -C / --force-create 强制创建/重置分支并切换(覆盖现有分支)
    -m / --merge 执行三方合并切换到新分支
    -f / --force 强制切换,丢弃本地修改 (危险:会丢失未提交的更改)
  • 具体示例

    • 切换分支

      sh 复制代码
      git switch main			# 切换到已存在的分支
      git switch -f feature		# 强制切换(丢弃工作区修改)
    • 创建分支

      sh 复制代码
      git switch -c feature				# 从当前分支最新提交创建新分支
      git switch -c feature abc123			# 从当前分支指定提交创建分支(分支不存在时报错)
      git switch -C feature        			# 强制创建/重置分支(分支存在则重置)
  • 区分 ------ 几种不同的创建分支指令

    命令 功能 分支存在时的行为 是否切换 使用场景
    git branch feature 仅创建分支 报错 ❌ 不切换 后台创建,稍后使用
    git checkout -b featuregit switch -c feature 创建并切换 报错 ✅ 切换 标准工作流
    git checkout -B featuregit switch -C feature 创建/重置并切换 重置覆盖 ✅ 切换 修复/重做分支
分支合并 git merge
  • 语法

    sh 复制代码
    git merge [<options>] [<commit>...]
    选项 功能
    --no-ff / --no-fast-forward 禁用快进合并,强制生成合并提交
    --ff-only / --fast-forward-only 仅允许快进合并,否则失败
    -m / --message 指定合并提交的消息(与 --no-ff 一起用)
    --no-commit 执行合并但不自动提交,可以调整合并结果
  • 具体示例

    • 合并 feature/login 到当前分支

      bash 复制代码
      git merge feature/login
    • 禁用快进合并(保留合并历史)

      bash 复制代码
      git merge --no-ff feature/login
    • 仅允许快进合并(否则报错)

      bash 复制代码
      git merge --ff-only feature/login
    • 解决冲突后继续合并

      bash 复制代码
      git merge --continue

分支管理

相关指令
  • git branch ------ 创建、查看、删除、重命名分支

  • git checkout ------ 切换、创建分支

  • git switch ------ 专用切换分支(替代 checkout

实操
  • 创建分支

    sh 复制代码
    $ git branch new-feature
  • 创建并切换到新分支

    sh 复制代码
    $ git checkout -b new-feature
    $ git switch -c new-feature		# 或使用较新的 git 版本中的命令
    Switched to a new branch 'new-feature'
  • 切换分支

    sh 复制代码
    $ git checkout main
    $ git switch main				# 或使用较新的 git 版本中的命令
    Switched to branch 'main'
    Your branch is up to date with 'origin/main'.
  • 查看分支

    sh 复制代码
    $ git branch
      develop
      feature/login
    * main				 # 带星号 * 表示当前所在分支
      new-feature
  • 安全删除已合并的分支

    sh 复制代码
    $ git branch -d develop
    Deleted branch develop (was abc1234).
  • 强制删除未合并的分支

    sh 复制代码
    $ git branch -D develop
    warning: Deleting branch 'develop' that has not been merged.
    Deleted branch experimental (was def5678).

分支合并

相关指令
  • git merge ------ 将指定分支的提交合并到当前分支
场景一:快速合并
  1. 初始状态 ------ 创建并切换分支 dev,查看当前分支情况

    sh 复制代码
    $ git checkout -b dev
    Switched to a new branch 'dev'
    sh 复制代码
    $ git branch
    * dev
      master
  2. 修改文件 ------ 在 dev 分支上修改 readme.txt 文件并提交

    sh 复制代码
    $ git add readme.txt 
    sh 复制代码
    $ git commit -m "branch test"
    [dev b17d20e] branch test
     1 file changed, 1 insertion(+)
  3. 快速合并 ------ 切换回 master 分支,把 dev 分支的工作成果合并到 master 分支上

    sh 复制代码
    $ git checkout master
    Switched to branch 'master'
    sh 复制代码
    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
  4. 删除分支 ------ 合并完成,可放心地删除 dev 分支

    sh 复制代码
    $ git branch -d dev
    Deleted branch dev (was b17d20e).
场景二:非快速合并
  1. feature 分支操作 ------ 创建并切换分支 feature,修改 readme.txt 文件并提交

    sh 复制代码
    $ git switch -c feature
    Switched to a new branch 'feature'
    sh 复制代码
    # feature 分支上的 readme.txt 最后一行改为:
    Modify on feature for merge test.
    sh 复制代码
    $ git add readme.txt
    sh 复制代码
    $ git commit -m "Feature modify"
    [feature 14096d0] Feature modify
     1 file changed, 1 insertion(+), 1 deletion(-)
  2. master 分支操作 ------ 切换分支 master,再次修改 readme.txt 文件并提交

    sh 复制代码
    $ git switch master
    Switched to branch 'master'
    Your branch is ahead of 'origin/master' by 1 commit.
      (use "git push" to publish your local commits)
    sh 复制代码
    # master 分支上 readme.txt 最后一行改为:
    Modify on master for merge test.
    sh 复制代码
    $ git add readme.txt 
    sh 复制代码
    $ git commit -m "Master modify"
    [master 5dc6824] Master modify
     1 file changed, 1 insertion(+), 1 deletion(-)
  3. 直接尝试合并 ------ 提交分支存在"分叉",这种情况下不同分支上的文件可能会产生冲突,无法快速合并

    sh 复制代码
    $ git merge feature
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.

    Git 提示:两个分支的 readme.txt 文件存在冲突,必须手动解决冲突后再提交

  4. 解决冲突后再合并

    • 查看冲突 ------ 输入命令 git status 查看冲突文件

      sh 复制代码
      $ git status
      On branch master
      Your branch is ahead of 'origin/master' by 2 commits.
        (use "git push" to publish your local commits)
      
      You have unmerged paths.
        (fix conflicts and run "git commit")
        (use "git merge --abort" to abort the merge)
      
      Unmerged paths:
        (use "git add <file>..." to mark resolution)
      
      	both modified:   readme.txt
      
      no changes added to commit (use "git add" and/or "git commit -a")
    • 手动解决冲突 ------ 查看 readme.txt,手动解决冲突

      sh 复制代码
      $ cat readme.txt
      Hello word!
      <<<<<<< HEAD
      Modify on master for merge test.
      =======
      Modify on feature for merge test.
      >>>>>>> feature

      Git 提示 :用<<<<<<<=======>>>>>>>标记出不同分支内容

      sh 复制代码
      $ cat readme.txt
      Hello word!
      Modify on feature for merge test.
    • 提交合并

      sh 复制代码
      $ git add readme.txt 
      $ git commit -m "conflict fixed"
      [master cf810e4] conflict fixed
    • 删除分支 ------ 合并完成,可放心地删除 feature 分支

      sh 复制代码
      $ git branch -d feature
      Deleted branch feature (was 14096d0).
场景三:查看分支合并情况
  • 输入带参数的 git log 指令查看分支合并情况

    sh 复制代码
    $ git log --graph --pretty=oneline --abbrev-commit
    *   cf810e4 (HEAD -> master) conflict fixed
    |\  
    | * 14096d0 (feature1) Feature Modify
    * | 5dc6824 Master modify
    |/  
    * b17d20e branch test
    * d46f35e (origin/master) remove test.txt
    * b84166e add test.txt
    * 519219b git tracks changes
    * e43a48b understand how stage works
    * 1094adb append GPL
    * e475afc add distributed
    * eaadf4e wrote a readme file

分支策略

合并策略
  • 合并时启用 Fast-Forward(默认模式)

    sh 复制代码
    git merge -m "merge message" dev
    • 适用 ------ 当目标分支(如 master)是待合并分支(如 dev)的直接祖先时
    • 行为
      • 合并后历史呈直线,无法保留分支的拓扑信息
      • 删除分支后,无法从历史中看出曾存在过分支,不便于追踪代码来源
  • 合并时禁用 Fast-Forward(参数 --no-ff

    sh 复制代码
    git merge --no-ff -m "merge message" dev
    • 适用 ------ 即使满足 Fast-Forward 条件,也会创建一个新的合并提交
    • 行为
      • 保留分支的拓扑结构,从历史中清晰看出分支的存在和合并点
      • 适合团队协作,便于追踪代码来源
  • 策略

    场景 推荐 原因
    个人本地分支合并 Fast-Forward 简化历史,避免冗余提交
    团队协作分支合并 --no-ff 保留分支信息,便于追踪代码变更
    需要明确记录合并操作 --no-ff 合并提交提供上下文(如版本发布)
管理策略
分支 作用 说明
主分支 (master/main 生产环境的 稳定分支 - 仅用于发布正式版本,禁止直接提交代码 - 必须通过合并其他分支(如 dev)来更新 - 代码始终处于可部署状态
开发分支 (dev 集成团队代码的 协作分支 - 所有开发者的功能分支均合并到此处 - 允许存在未完成的代码,但需通过测试后再合并到 master - 定期同步以避免冲突
个人/功能分支 (如 feature/login 开发者独立工作的 开发分支 - 基于 dev 分支创建,命名需清晰(如 feature/xxxfix/xxx) - 开发完成后通过 Pull Request(PR)Merge Request(MR) 合并到 dev - 避免长期存在,及时删除已合并的分支

相关推荐
ModestCoder_2 小时前
Git 版本管理教程
大数据·git·elasticsearch
YMGogre2 小时前
Git 提交信息规范
git
charlie1145141913 小时前
Git团队协作完全入门指南(下)
git
golang学习记5 小时前
Facebook 为什么不用 Git?
git·elasticsearch·facebook
GIS阵地6 小时前
git拉取时报错
大数据·git·elasticsearch
无限进步_8 小时前
C++ Vector 全解析:从使用到深入理解
开发语言·c++·ide·windows·git·github·visual studio
charlee449 小时前
Git使用经验总结9-Git提交关联到Issue
git·issue
顾安r9 小时前
12.27 脚本网页 GITHUB推送教程
linux·css·html·gitlab·github
A13247053129 小时前
curl命令入门:命令行测试接口
linux·运维·服务器·网络·编辑器·github·vim