Git分支管理

目录

[1 理解分支](#1 理解分支)

[1.2 git branch](#1.2 git branch)

[2 创建分支](#2 创建分支)

[2.1 创建分支操作](#2.1 创建分支操作)

[3 切换分支](#3 切换分支)

[3.1 切换分支操作](#3.1 切换分支操作)

[4 合并分支](#4 合并分支)

[4.1 合并操作](#4.1 合并操作)

[4.2 合并策略](#4.2 合并策略)

[4.3 撤销合并](#4.3 撤销合并)

[5 删除分支](#5 删除分支)

[5.1 删除本地分支](#5.1 删除本地分支)

[5.2 删除远程分支](#5.2 删除远程分支)

[5.3 批量删除分支](#5.3 批量删除分支)

[5.4 恢复误删的分支](#5.4 恢复误删的分支)

[6 合并冲突](#6 合并冲突)

[6.1 解决合并冲突](#6.1 解决合并冲突)


1 理解分支


在版本回退⾥,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即 master 分⽀。

再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分⽀。

每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽HEAD只要⼀直指向master分⽀即可指向当前分⽀。

1.2 git branch

(1)基本语法

复制代码
git branch [选项] [分支名] [起始提交]

(2)常用选项

|------------|-----------------|
| 选项 | 说明 |
| -a | 显示所有分支(本地 + 远程) |
| -r | 仅显示远程分支 |
| -v | 显示分支的最后提交信息 |
| -vv | 显示分支及其跟踪的远程分支 |
| -d | 删除已合并的分支 |
| -D | 强制删除分支(即使未合并) |
| -m | 重命名分支 |
| --track | 创建分支并跟踪远程分支 |
| --no-track | 创建分支但不跟踪远程分支 |

(3)功能

git branch 是 Git 中用于 分支管理 的核心命令,它可以 查看、创建、重命名和删除分支。分支是 Git 最重要的功能之一,它允许你在独立线上开发,而不会影响主代码。

常用选项:

  1. 查看分支
  2. 创建分支
  3. 删除分支
  4. 重命名分支
  5. 设置远程跟踪分支
  • 查看分支

    git branch # 查看本地分支(当前分支前带 *
    git branch -v # 查看分支 + 最后提交信息
    git branch -vv # 查看分支 + 关联的远程分支
    git branch -a # 查看所有分支(本地 + 远程)
    git branch -r # 仅查看远程分支

  • 创建分支

    git branch <new-branch> # 基于当前提交创建分支
    git branch <new-branch> <commit> # 基于某次提交创建分支

  • 删除分支

    git branch -d <branch> # 删除已合并的分支(安全)
    git branch -D <branch> # 强制删除未合并的分支(危险!)
    git push origin --delete <branch> # 删除远程分支

  • 重命名分支

    git branch -m <old-name> <new-name> # 重命名分支
    git branch -m <new-name> # 重命名当前分支

  • 设置远程跟踪分支

    git branch -u origin/main # 让当前分支跟踪 origin/main
    git branch --set-upstream-to=origin/main # 同上(旧版 Git)

2 创建分支


2.1 创建分支操作

(1)基于当前分支创建新的分支

复制代码
git branch <new-branch>          # 基于当前提交创建分支
git branch <new-branch> <commit> # 基于某次提交创建分支

// 示例
git branch dev              # 基于当前分支创建 dev
git branch hotfix abc123    # 基于 commit abc123 创建 hotfix

lz@VM-8-15-ubuntu:~/gitcode$ git branch
  dev
* master

当我们创建新的分⽀后, * 表⽰当前 HEAD 指向的分⽀是那一个分⽀

(2)创建并立即切换到新分支

复制代码
git checkout -b <新分支名>
# 或(Git 2.23+ 推荐)
git switch -c <新分支名>

// 示例
git checkout -b hotfix  # 创建并切换到 `hotfix` 分支

3 切换分支


3.1 切换分支操作

(1)切换到本地已有分支

复制代码
git checkout <branch>      # 切换到已有分支
git checkout -b <new-branch>  # 创建并切换到新分支(基于当前分支)
git checkout -b <new-branch> <commit>  # 基于某次提交创建分支

// 示例
git checkout dev    #切换到dev分支

lz@VM-8-15-ubuntu:~/gitcode$ git checkout dev    #切换分支
Switched to branch 'dev'
lz@VM-8-15-ubuntu:~/gitcode$ git branch    #查看分支
* dev
  master

(2)切换到远程分支

复制代码
git checkout -t origin/<远程分支名>  # 自动创建本地分支并跟踪远程
# 或
git switch -c <本地分支名> origin/<远程分支名>

// 示例
git checkout -t origin/feature-login  # 本地分支名默认为 `feature-login`
git switch -c login origin/feature-login  # 自定义本地分支名

在切换分支后,对当前所处的分支进行操作不会影响其他分支的改变,除非对分支进行合并

4 合并分支


4.1 合并操作

(1)快速合并(Fast-Forward Merge)
当目标分支(如 main )是当前分支(如 feature )的直接祖先时,Git 会执行快速合并(仅移动指针)

  • 分支线性历史(无并行提交)

  • 适合短期功能分支合并

    git checkout master # 切换到目标分支
    git merge dev # 将 feature 合并到 main

(2)非快速合并(三方合并)
当两个分支有分叉历史时,Git 会创建新的合并提交

  • 保留完整分支历史(即使可快速合并)

  • 推荐用于长期分支合并(如 devmain

    git checkout main
    git merge feature --no-ff # 强制禁用快速合并

4.2 合并策略

(1)普通合并(默认)

复制代码
git merge feature

(2)非 first forward 模式合并

复制代码
git merge --no-ff -m "merge with no-ff" dev2

(3)压缩合并(Squash Merge)
将多个提交压缩成一个新提交再合并
适用场景

  • 清理功能分支的琐碎提交

  • 保持主分支历史简洁

    git merge --squash feature
    git commit -m "合并 feature 分支"

4.3 撤销合并

(1)合并未提交时撤销

复制代码
git merge --abort

(2)合并已提交后撤销

复制代码
git reset --hard HEAD~1   # 回退到合并前状态(慎用!)
# 或
git revert -m 1 <合并提交的哈希>  # 创建反向提交(推荐)

5 删除分支


5.1 删除本地分支

(1)删除已合并的分支(安全操作)

复制代码
git branch -d <分支名>

// 示例
git branch -d feature-login  # 删除已合并的 feature-login 分支

(2)强制删除未合并的分支(危险操作)

复制代码
git branch -D <分支名>

// 示例
git branch -D experimental  # 强制删除未合并的 experimental 分支

5.2 删除远程分支

(1)删除远程分支

复制代码
git push origin --delete <远程分支名>
# 或
git push origin :<远程分支名>  # 旧语法(等效)

// 示例
git push origin --delete feature-payment  # 删除远程的 feature-payment 分支

(2)同步本地远程分支缓存

删除远程分支后,本地仍可能保留远程分支的缓存记录,需清理:

复制代码
git fetch --prune  # 自动清理已删除的远程分支缓存

5.3 批量删除分支

(1)删除所有已合并的分支(保留主分支)

复制代码
git branch --merged | grep -v "main" | xargs git branch -d
  • 说明
    • git branch --merged:列出已合并的分支。
    • grep -v "main" :排除主分支(如 mainmaster)。
    • xargs git branch -d:逐个删除。

(2)删除所有匹配名称的分支

复制代码
git branch | grep "feature/" | xargs git branch -D  # 强制删除所有 feature/ 开头的分支

5.4 恢复误删的分支

如果误删了未合并的分支,可以通过以下步骤恢复:

(1)查找分支的最后提交哈希:

复制代码
git reflog  # 查看操作历史,找到被删分支的最后 commit

(2)从提交重新创建分支:

复制代码
git branch <分支名> <commit-hash>

(3)示例

复制代码
git branch experimental abc123  # 从 commit abc123 恢复 experimental 分支

6 合并冲突


合并冲突是 Git 中常见的问题,当两个分支对同一文件的同一部分进行了不同的修改时,Git 无法自动决定保留哪个修改,就会产生冲突

常见的合并冲突场景:

  1. 两个分支修改了同一个文件的同一区域
  2. 一个分支删除了文件,另一个分支修改了该文件
  3. 二进制文件的修改

6.1 解决合并冲突

(1)识别冲突

当执行 git mergegit pull 时遇到冲突,Git 会显示类似消息:

复制代码
lz@VM-8-15-ubuntu:~/gitcode$ git merge dev
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

(2)查看冲突文件

复制代码
lz@VM-8-15-ubuntu:~/gitcode$ cat test.txt
<<<<<<< HEAD
bbb
=======
aaa
>>>>>>> dev

(3)手动解决冲突

  1. 打开冲突文件
  2. 决定保留哪部分修改,或进行整合
  3. 删除冲突标记 (<<<<<<<, =======, >>>>>>>)

(4)标记冲突已解决

复制代码
git add <已解决冲突的文件>

(5)完成合并

复制代码
git commit
相关推荐
黑屋里的马3 小时前
GitExtension下载、安装
git·gitextension
Geoking.3 小时前
Git 中的 Rebase 与 Merge:原理、区别与最佳实践
git
invicinble5 小时前
一文了解git
大数据·git·elasticsearch
我命由我123455 小时前
Git 初始化本地仓库并推送到远程仓库解读
运维·服务器·经验分享·笔记·git·学习·学习方法
爱码小白6 小时前
Git学习笔记
笔记·git·学习
skywalk81637 小时前
sudo apt upgrade git 报错
git
_运维那些事儿7 小时前
GitLabCI/CD语法
linux·服务器·git·ci/cd·gitlab·运维开发·devops
huohuopro8 小时前
git基本使用
大数据·git·elasticsearch
码云的一天8 小时前
git之游离head处理
git