Git 分支管理

目录

分支管理介绍

创建分支

切换分支

合并分支

删除分支

合并冲突

分支合并策略

分支策略

修改暂存

删除临时分支


分支管理介绍

分支管理Git 的重要功能之一,能够把不同功能、不同阶段的开发工作隔离不同分支 ,互不干扰,完成后再合并到主分支

在上一篇文章(Git 基本操作-CSDN博客)中,我们看到,在创建 Git 仓库时,会自动创建 master 分支,而对于每一次提交,Git 会将它们串成一条提交时间线:

HEAD 指向master,master 指向提交,每次提交,master 分支都会向前移动一步,因此,随着不断提交,master 分支的提交线越来越长

除了 master 分支,我们也可以自己创建分支

创建分支

首先,我们可以通过 git branch 命令,查看当前本地的所有分支:

当前只有 master 分支,我们可以通过**git branch [branchname]**来创建对应分支:

那么,新创建的 dev 分支指向哪里呢?

我们查看**.git/refs/heads/** 下的分支,并查看存储的commit id

可以发现,devmaster 中存储的commit id 相同,即,devmaster指向同一个修改:

我们查看 HEAD

可以看到此时 HEAD 仍然指向 master ,那么,我们如何切换到 dev 分支呢?

切换分支

我们可以使用git checkout命令来进行分支切换:

可以看到,此时***** 标记在 dev 分支上,表示当前在 dev 分支,且 HEAD 中存储的也是 dev,而不是 master:

接下来,我们在dev 分支下修改test 文件,再进行提交操作:

此时,我们再切换回 master 分支,并查看 test 文件内容:

可以看到,在 dev 上的修改并未同步到 master 分支上,我们查看此时 dev 分支和 master 分支指向的提交:

dev 分支指向的提交已经发生了改变,这是因为我们在 dev 分支上新进行了提交,而 master 分支此时的提交并没有改变:

那么,如果我们想要在 master 分支上也能够看到新的修改,该如何做呢?

合并分支

想要能在 master 分支上看到新的修改提交,需要将 dev 分支合并到 master 分支

我们需要保证当前在master 分支上,再通过git merge [targetbranch] 命令来合并目标分支,也就是 dev 分支:

此时,我们就能够看到 dev 分支提交的内容了,当前的状态为:

我们看到在 master 分支合并 dev 分支时,显示Fast-forword ,代表本次合并模式为 "快进模式" ,也就是直接修改 master 的指向为 dev 的当前提交,因此合并速度非常快

通过查看 dev 和 master 指向的提交,我们就可以看到,此时 master 与 dev 的指向相同,都为 dev 的最新提交:

在合并完成之后,dev 分支也就没什么作用了,此时就可以删除 dev 分支,那么,该如何删除分支呢?

删除分支

我们可以通过git branch -d [branchname] 来删除指定分支,但需要注意的是 不能删除当前所处分支

因此,要删除 dev 分支,我们需要切换到 master 分支,再进行删除

此时就只剩 master 分支了:

上述我们在合并分支时,非常的顺利,但是,在实际合并分支时,可能会遇到一些问题

合并冲突

我们创建一个新的分支 dev1,并在 dev1 分支下修改 test 文件,再进行提交:

再切换回 master 分支,此时,由于 master 分支未合并 dev1 分支,因此,test 中无 dev1 新修改内容:

若我们此时再对 test 文件进行修改,并进行提交:

此时,master 分支和 dev1 分支各自分别有了新的提交:

此时,若我们再想将 dev1 分支合并到 master 分支,就可能会出现冲突:

我们可以看到,在合并过程中,test 文件发生冲突,自动合并失败。需要修复冲突,再重新提交结果,我们查看 test 文件:

Git 会使用**<<<<<<<、======= 和 >>>>>>>** 来标记处不同分支的冲突内容

此时,我们需要手动调整冲突内容 ,并再次提交修改后结果

此时,冲突就解决完成了:

此外,我们可以使用带参数的git log 命令查看分支合并情况:

git log --graph --pretty=oneline --abbrev-commit

--graph:用 ASCII 图形画出分支合并关系,直观展示不同分支的提交脉络

--pretty=oneline :把每个提交压缩成单行输出​,只保留核心信息,让日志更紧凑

--abbrev-commit :只显示提交哈希的短版本​,让输出更简洁

最后,我们删除 dev1 分支:

分支合并策略

在合并分支时,如果可能,Git 会采用 Fast forward模式:

Fast forward 模式下,删除分支后,再查看分支历史时,就不能看出提交是merge 进来 的还是 master 正常提交的,例如,合并 dev 时:

而我们在合并 dev1 时,合并过程中发生了冲突,而我们解决这个冲突之后,再次进行了一次新提交:

上述模式就不是 Fast forward 模式了,但我们可以从分支历史上清晰看出分支信息,此时及时我们删除了 dev1 分钟,也依旧可以看到 master 分支合并了其他分支:

那么,如果我们想使用上述非 Fast forward 模式,来帮助我们更清晰的显示合并过程,该如何实现呢?

我们可以在合并时使用git merge --no-ff -m "message" [mergename] 来强制禁止 Fast forward 模式

例如,我们再创建一个 dev2 分支,进行修改后,再合并至 master 分支:

此时,就会在 merge 时生成一个新的 commit,此时,我们就可以在分支历史上看出分支信息:

即:

因此,在合并分支时,使用**--no-ff** 参数就可以使用普通模式 合并,合并后的历史有分支情况,可以看出曾经做个合并,而 Fast forward 合并就看不出曾经做个合并

分支策略

在实际开发过程中,我们应该按照以下结果基本原则来进行分支管理:

  1. 保持master 主分支稳定 ,任何时候主分支,都应该是可编译、可测试、可发布的状态,也就是说,master 主分支上仅用于版本发布,而不在上面完成开发工作

  2. 保证任务隔离,一个功能/修复对应一个分支,不混放不同任务的代码

3.分支任务完成后,及时进行合并,避免长期分支,减少大规模合并冲突

团队之间的合作分支情况:

修改暂存

我们来看一个例子:假设此时在 dev3 分支上进行开发,开发到一半,突然发现 master 分支上存在 bug,需要紧急进行修复,因此,我们需要创建一个新的临时分支来修复该 bug修复完成后再合并到 master 分支

但是,现在 dev2 分支上的代码在工作区上开发了一半,还未进行提交,又不想带着这些修改切换分支,此时该怎么办?

我们可以使用 git stash 命令,将当前工作区未完成的修改暂时贮藏起来:

可以看到,此时工作区变得非常干净,为了方便识别我们每次贮藏的内容,可以为其添加说明信息

可以使用git stash list来查看所有贮藏列表:

最新的贮藏位于最上方,编号是stash@{0},越久编号越大

此时,我们再切回 master 分支,并创建临时分支来修复 bug:

使用**git checkout -b [branchname]**可新建并切换到目标分支

我们再在 fix_bug 分支上进行修改,修改完成后,再进行提交:

此时,再将其进行合并:

至此,bug 就已经修复完成了,可以删除 fix_bug 分支,我们需要继续回到 dev3 分支上继续进行开发:

但是,由于我们直接将工作区的修改暂存了起来,此时工作区是干净的

那么,我们如何恢复之前的修改呢?

可以使用git stash pop 命令来恢复最新的贮藏 (也就是stash@{0}),它会同时将其从贮藏列表移除:

若我们想恢复指定贮藏,可使用命令:git stash pop stash@{指定编号}

而若我们想恢复贮藏后,仍在贮藏列表中保存,可以使用命令:git stash apply ,通用,也可以指定恢复贮藏:git stash apply stash@{制定编号}

我们继续进行开发,开发完成后进行提交:

我们可以看到,修复的 bug 内容并未在 dev3 上显示:

当前,master 分支的最新提交,领先于新建 dev3 分支时的提交,因此我们也就在 dev3 分支中看不到最新的修改

此时,我们需要让 master 合并 dev3 分支,若我们此时切回 master 分支并直接进行合并 ,此时可能会发生冲突,而代码的冲突需要我们手动进行解决,此时就是在 master上进行解决的,但是,若冲突问题比较复杂或比较多,我们就无法保证冲突问题可以正确地一次性解决掉,此时,就可能导致错误的代码被合并到 master上,从而导致 master 分支上出现 bug:

那么,该如何做呢?

我们可以在 dev3 分支上先合并 master 分支,若此时出现冲突,先在 dev3 分支上进行解决,让 dev3 分支保持最新,然后再让 master 合并 dev3 分支,从而不影响 master:

dev3 合并 master 分支,若合并时未发生冲突,会显示以下内容:

使用Ctrl + X即可退出:

此时,我们再切回 master 分支,合并 dev3 分支

最后,再删除 dev3 分支

删除临时分支

在开发过程中,当添加一个新功能时,我们都需要新建一个分支(被称为 feature 分支),在分支上进行开发,完成后,再进行合并,最后删除该分支

但是,若我们在某个 feature 分支上开发了一半,此时,被告知该功能废弃了,那么,这个分支也就误用了,需要进行销毁,若我们此时使用git branch -d 命令来进行删除:

Git 提示我们需要使用git branch -D命令来强制删除存在修改的分支:

相关推荐
奇怪的点3 小时前
git clone失败
git
WaiSaa4 小时前
Ubuntu配置Git免密操作
git·ubuntu·gitee
牛奶咖啡134 小时前
Git实践——分支管理与标签管理及git个性化配置
git·禁用 fast forward·bug分支的创建与操作·远程分支的查看与推送·拉取仓库·推送指定分支到远程仓库·标签的创建与操作
千寻girling7 小时前
五一劳动节快乐 [特殊字符][特殊字符][特殊字符]
java·c++·git·python·学习·github·php
波特率1152008 小时前
git指令学习
git·学习
Karry_6668 小时前
[特殊字符] Git 提交项目 全套命令(按顺序执行)
git
计算机安禾9 小时前
【Linux从入门到精通】第39篇:版本控制Git服务器搭建——Gitea/GitLab私有化部署
linux·服务器·git
lst04269 小时前
Git 巨大失误案例记录 (2026-05-01)
大数据·git·elasticsearch
donecoding10 小时前
Git Worktree:一个仓库同时在多个分支工作,告别 stash 地狱
git