目录
前言
0.理解分支
1.查看本地仓库存在的分支
2.HEAD指向分支
3.创建本地分支
4.切换分支
5.分支提交操作
6.合并分支
快进模式Fast-forward
7.删除分支
8.强制删除分支
本篇开始介绍下Git提供的杀手级的功能:分支管理
- 先提交再合并
前言
在玄幻武侠村中,武林大会:赢的人可以迎娶村长的女儿。武林大会有三个月的准备时间。
基本时间线:参赛者——>练习基本功——>学习降龙十八掌——>参加比赛
此时为了赢得武林大会的几率更大,你创建了一个分身,在同时一时间线上(3个月)
参赛者——>练习基本功——>学习降龙十八掌——>参加比赛
分身👇👉辟邪剑法👉👆合体
0.理解分支
根据上面例子,其实Git的提交时间线也是可以做到分支和合体的动作的。
回顾:
- master里面存储是最新一次提交记录的commit id
- commit id对应的是版本库中对象库中的对象的索引
- tree后面也是一个对象指向☞每个文件的提交的详情的commit id☞每个问价详细修改内容
- parent指向上一次提交的commit id
- git log
- git log --pretty=oneline
- git status
- git cat-file -p 跟commit id //查看maseter索引commit id的内容
- git add 提交文件名
- git commit -m "详细描述" 文件名
- 对此可以画出一个提交时间线(主线),master里面存储就是最新一次提交记录的commit id
- 提交时间线:master主分支
1.查看本地仓库存在的分支
git branch 命令展示出来当前本地仓库有哪些本地分支。
当在创建本地仓库的时候,Git会为自动创建一个本地分支:master主分支
2.HEAD指向分支
* master前面的 * 表示什么意思呢❓
*出现在master前面,是表示HEAD指向master分支且master主分支是当前正在工作分支。
HEAD指针指向master主分支。
HEAD指针不止可以指向master主分支,可以指向其他任意分支。
被HEAD指向的分支,就是当前正在工作的分支。(之前HEAD指向master主分支,所以add/commit 操作提交 影响的都是master主分支)
3.创建本地分支
git branch 创建分支的名称
- HEAD还是指向master(*master 当前正在工作的分支)
- 分支都存放在refs/heads/路径下,此刻次路径下有两个本地分支(dev /master)
- 查看dev和master里面内容,发现无论是master还是dev里面的内容都是最新一次提交的commit id且master和dev里面的内容一摸一样的(dev的初始内容)
- 所以:dev分支是基于master主分支最新一次提交记录 创建的
4.切换分支
git checkout dev(需要切换分支的名称)
- 让HEAD指向dev分支,让dev成为当前工作分支(*dev),才能在dev分支上操作
5.分支提交操作
前提:还未在dev分支上提交,ReadMe文件是只有一份,创建不同分支,对其进行修改操作,相互分支切换都是看的到的文件的改变。(只是在工作区发生改变)
还未提交【dev&master分支】
前提:分支还未合并,在某分支上去add / commit 提交之后,只能在提交的分支才能看到,其他分支看不到改变。
- dev分支指向最新一次的提交记录
- 它的parent指向上次提交记录,也就是是指向master的最新一次提交。
- 无论是dev分支还是master分支都存储的是各自提交线的最新一次提交的commit id 且他们是在不同提交时间线的
- dev是记录master提交时间线创建的,所以有之前master分支提交时间线
提交之后【dev分支】
提交之后【master分支】
6.合并分支
处于A分支上:git merge B(需要合并的分支名称)
前提:分支和分支合并之后,就是都是指向最新一次提交,都可以看到修改的内容。
想要在master分支上看到新增的代码。将master和dev分支上的内容进行合并操作。
如果我们想要master分支合并我们的dev分支,我们必须先切换到master分支上,然后合并dev分支。
如果我们想要dev分支合并我们的master分支,我们必须先切换到dev分支上,然后合并master分支。
综上,如果我们想要B上的内容出现在A上,必须先切换到A上,把B的内容合并到A上。
❓Fast-forward表示快进模式是什么☞后面分支模式讲
快进模式Fast-forward
Fast-forward快进模式:意味着直接把 master的内容 改变为 dev当前最新的一次提交内容
(合并非常快是因为直接改变master里面的内容commit id即可)当然不是每次都是faster - forward快速模式还有其他模式。
7.删除分支
前提:删除A分支的时候,一定处于其他分支(B),才能删除A分支
git branch -d 删除分支名称 (-d delete)
- dev分支的使命:就是修改ReadMe文件,新增一行代码。
- 最后将dev分支上面的内容合并到了master分支上,dev分支此刻的任务也就完成了。
- 因为创建、合并和删除分⽀⾮常快,所以Git⿎励你使⽤分⽀完成某个任务,合并后再删掉分⽀,这和直接在master分⽀上⼯作效果是⼀样的,但过程更安全。
- git branch -d 是merge之后,git才支持我们删除的分支
- 在分支没有merge且进行开发和提交了,这个时候删除,git是不允许你删除的。(git认为对我们有用,所以他要保护分支,不支持删除)
【处于dev分支上】
【处于master分支上】
8.强制删除分支
前提:删除A分支的时候,一定处于其他分支(B),才能删除A分支
git branch -D 删除分支名称 (-D Delete)
- 软件开发中,总有⽆穷⽆尽的新的功能要不断添加进来。
- 添加⼀个新功能时,你肯定不希望因为⼀些实验性质的代码,把主分⽀搞乱了,所以,每添加⼀个新功能,最好新建⼀个分⽀,我们可以将其称之为 feature 分⽀,在上⾯开发,完成后,合并,最后,删除该 feature 分⽀。
- 可是,如果我们今天正在某个 feature 分⽀上开发了⼀半,被产品经理突然叫停,说是要停⽌新功能的开发。虽然⽩⼲了,但是这个 feature 分⽀还是必须就地销毁,留着⽆⽤了。这时使⽤传统的 git branch -d 命令删除分⽀的⽅法是不⾏的。