git分支管理详解

1 概念

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习其他。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了git又学会了其他!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

2 创建与合并分支

git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

(1) 一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

(2)当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。

(3)不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

(4)假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并

git合并分支也很快,就改改指针,工作区内容也不变。

(5)合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支

案例:

(1)执行git branch 命令可以查看当前有几个分支并且看到在哪个分支下工作。

(2)下面创建一个分支dev并切换到其上进行工作。

(3)下面我们修改code.txt内容,在里面添加一行,并进行提交。

(4)dev分支的工作完成,我们就可以切换回master分支:

查看code.txt,发现添加的内容没有了。因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

(5)现在,我们把dev分支的工作成果合并到master分支上:

git merge命令用于合并指定分支到当前分支。合并后,再查看code.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是"快进模式",也就是直接把master指向dev的当前提交,所以合并速度非常快。

(6)合并完成后,就可以放心地删除dev分支了,删除后,查看branch,就只剩下master分支了。

小结:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

3 解决冲突

合并分支往往也不是一帆风顺的。

(1)再创建一个新分支dev。

(2)修改code.txt内容,并进行提交。

(3)切换回master分支。

(4)在master的code.txt添加一行内容并进行提交。

现在,master分支和dev分支各自都分别有新的提交

这种情况下,git无法执行"快速合并",只能试图把各自的修改合并起来,但这种合并就可能会有冲突。

(5)执行如下命令尝试将dev分支合并到master分支上来。

git告诉我们,code.txt文件存在冲突,必须手动解决冲突后再提交。

(6)git status也可以显示冲突的文件

(7)查看code.txt的内容。

(8)git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存再提交。

(9)用带参数的git log也可以看到分支的合并情况:

(10)最后工作完成,可以删除dev分支。

题外话:

Git 提交代码时(git commit -a 的描述)要满足Angular 提交规范(或其它规范):

每次提交可以包含页眉(header) 、正文(body) 和页脚(footer) ,每次提交必须包含页眉内容

页眉的格式指定为提交类型(type) 、作用域(scope ,可选) 和主题(subject)

提交类型指定为下面其中一个:

  1. build :对构建系统或者外部依赖项进行了修改
  2. ci :对CI 配置文件或脚本进行了修改
  3. docs :对文档进行了修改
  4. feat :增加新的特征
  5. fix :修复bug
  6. pref :提高性能的代码更改
  7. refactor :既不是修复bug 也不是添加特征的代码重构
  8. style :不影响代码含义的修改,比如空格、格式化、缺失的分号等
  9. test :增加确实的测试或者矫正已存在的测试
相关推荐
lazy H10 分钟前
从入门到日常开发,一篇文章掌握 Git 核心操作
git·后端·学习·github
Scott9999HH8 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
zzqssliu8 小时前
煤炉自动代拍系统的队列设计与超时控制机制
git·github
一支绝命钩8 小时前
FPGA工程Git常用操作手册
git
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海9 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区12 小时前
怎么把C语言学到精通?
c语言·开发语言
不搞学术柒柒12 小时前
Git新功能完整开发提交流程
git