在上一篇章中,我们深入探究了借助 git 记录开发进程中变更与提交的方法。然而,这些并非git强大功能的全部。这篇文章将向你介绍 git 的分支和远程仓库特性,这些才是 git 版本控制功能的精髓所在。
洞悉 Git 分支
在一切开始之前,我们先花两分钟来看看什么是 git 分支,即使我们已经在上一篇文章中有所涉及。
简而言之,一条分支是一条独立的代码演进轨迹。它依托于主分支(通常为已上线的稳定代码版本)构建,开发者能够据此创建多个分支,每个分支都可独立开展代码的修改、新功能的添设等操作,且彼此之间互不干扰。
不妨想象一下,将软件开发类比为建造房屋,主分支便是房屋的主体架构,而分支则如同在房屋内部尝试增设别具一格的房间,或者更改某面墙壁的色调。即便在分支上的探索未能成功,也丝毫不会对房屋的主体结构造成影响。
同时,这也是使用 git 进行多人团队协作的基础,因为每条分支不会相互干扰,每个人都可以在原分支的基础上自由的添加新的代码和功能,即使是在开发的中途放弃了开发或者对以前的代码进行了修改,都不会影响主分支和其他分支上队友的开发。
在讲解各种和分支相关的命令之前,我们先来看看
- 默认分支:一般而言,默认分支多被命名为main或master。它承载着项目的核心代码,代表着项目的稳定且可发布版本,是整个项目代码的基石。
- HEAD 指针:HEAD 指针在 Git 中扮演着关键角色,它明确指示着当前所处的分支。形象地说,它宛如一盏明灯,照亮你此刻正在进行代码创作的 “代码宇宙”,让开发者清晰知晓自己的工作位置。
分支的基础操作指南
1. 查看分支信息
- 查看本地分支:在命令行中输入git branch指令,即可快速查看本地所有分支。其中,当前所在分支前方会醒目地标注*号,便于开发者迅速识别。
git branch
- 查看全部分支(涵盖远程) :若需全面了解项目的分支架构,包括本地分支与远程分支的情况,可使用git branch -a命令。该命令会将所有分支信息一一呈现,助力开发者对项目的分支全貌有清晰认知。
git branch -a
2. 创建分支操作
- 常规创建方式:运行
git branch feature-login指令,能够基于当前分支创建一个名为feature-login的全新分支。需注意,此操作仅完成分支的创建,并不会自动切换至新创建的分支。
git branch feature-login
- 创建并即刻切换:执行
git branch -b feature-login命令,同样feature-login的分支,但是会在创建之后立马切换到新的分支上去。
git branch -b feature-login
3. 切换分支步骤
- 切换至已有分支:当需要切换到已存在的
feature-login分支时,在命令行输入git checkout feature-login指令,即可顺利切换至该分支,然后你接下来所做的修改就是在当前分支上的了,不会影响到其他的分支的代码。
git checkout feature-login
*
- 创建并切换(常用快捷操作) :git checkout -b feature-login命令集创建新分支与立即切换至新分支的功能于一身,与git branch -b命令的效果类似,是开发者在实际工作中频繁使用的快捷操作手段,能有效提升开发效率。
git checkout -b feature-login
4. 删除分支操作要点
- 删除已合并分支:若要清理已成功合并到目标分支的分支,以保持仓库的整洁有序,可执行git branch -d feature - login命令。此操作会将已完成使命的分支从仓库中移除。
git branch -d feature-login
- 强制删除未合并分支:对于未合并的分支,若要强行删除,可使用git branch -D feature - login命令。但务必谨慎使用该命令,因为强制删除可能会导致未合并的代码永久性丢失,在执行前需仔细确认是否真的不再需要这些未合并的代码。
git branch -D feature - login
💡
从技术层面剖析,在 Git 体系中,分支本质上是一个指向特定提交的指针。这种精妙的设计使得创建分支与切换分支的操作成本极低,极大地提升了开发过程的灵活性与高效性。
分支合并:整合代码成果
接下来有这样一个场景,我们刚刚为我们的项目新增了一个登录功能,我们新开发的代码都在 feature-login 分支上,为了将新功能上线,我们将需要将他合并到master分支上,具体的操作如下。
- 切换到目标分支:在进行合并操作之前,务必确保当前处于main分支。可通过执行
git checkout main命令,快速切换到main分支,为合并操作做好准备。 - 执行合并操作:切换到main分支后,使用
git merge feature-login命令,即可将feature-login分支的代码合并到main分支,实现代码的整合与功能的集成。
合并的两种模式解析
| 模式 | 触发条件 | 特点 |
|---|---|---|
| Fast - forward | 目标分支(如main分支)在合并时没有新提交 | 该模式直接移动指针,将分支快速合并,不会产生额外的合并提交,操作过程简单高效,能迅速完成代码合并。 |
| 三方合并 | 目标分支(如main分支)在合并时有新提交 | 此模式会生成一个新的合并提交,详细记录分支合并的历史信息,保留分支的完整历史,便于后续追溯代码的演变过程,对项目的代码管理和维护具有重要意义。 |
Fast - forward模式:
三方合并模式
分支冲突
然而到这一步并没有结束,因为我们在开发新功能的时候我们的其他队友也在开发新的功能,假如在我们将代码合入master分支之前,他已经合入了,那么我们和master分支的代码就可能有些地方有差异,这些差异在“git”中叫做冲突。
这些冲突是git不能帮你自动处理的,需要我们自己去进行处理。
像下面这种情况就是在feat-merge分支上修改成了hello bowl,然后又在master分支上修改成了hello 2026,两个分支修改了同一个地方,这个时候合并时就需要我们来解决冲突。
冲突的地方git一般会以这种格式给你标注出来,我们需要自己取舍哪些需要保留。
解决冲突完后,我们在把刚刚的操作提交一下,就变成了下面的样子,一次冲突就被我们给解决了。
实践
讲完了枯燥的概念,我们以git book里的例子来深刻的理解一下:
我们有一个项目及其对应的主分支 master 。假设这个时候我们有一个新的需求,要给原来的项目添加一个新的功能。
我们首先基于 master 分支创建一个新的 testing 分支。
git branch testing
此时的分支树如下:
可以注意到此时我们的HEAD指针仍然指向的是master分支,这意味着我们此时对项目做的修改还是会作用到master分支上。这个时候我们需要切换到新创建的testing分支:
git checkout testing
HEAD指针指向testing分支,现在,我们就可以在testing分支上开发了。
做完修改之后,我们将其提交到当前分支
git add .
git commit -m "feat: new feature"
可以看到,HEAD指针是跟随我们的tesing分支向前的。
这个时候,我们突然接到了一个紧急的需求,需要马上上线,于是我们将手头testing分支的工作暂时放一放,切换回master分支:
git checkout master
我们赶紧把需要紧急上线的代码给写好并提交到master分支:
git add .
git commit -m "feat: hot fix"
这个时候我们就可以看到我们的分支树出现了分叉,因为master上的代码和testing分支上的代码是不同的。
假设这个时候我们的开发任务已经完成了,需要把代码上线到master分支上,这个时候就需要我们使用 git merge 来合并代码了。
git merge testing
最后我们将会得到这样一个分支树。