第1节:分支 = github项目的副本
1.1本节涉及概念:
概念 | 解释 |
---|---|
分支 | 就是github项目的副本 |
本地分支 | 克隆项目到本地后,在本地上的项目副本 |
远程分支 | 远程仓库里的项目副本 |
1.2图解
【git clone后本地分支】
远程仓库现在有四个分支,git clone项目会默认创建一个本地master分支,与远程master分支关联。
【基于远程分支,创建本地分支】
图中“工作区/本地仓库”部分,哪个颜色在上面代表当前工作区正在使用哪个分支;
基于远程分支创建本地分支,会默认将当前本地分支切换到刚创建的本地分支上,所以图中蓝色分支feature-branch-1会在红色分支master上面。
【本地分支之间的切换】
1.3本节涉及git指令
指令 | 作用 |
---|---|
git branch | 查看本地所有分支 |
git branch -a | 查看本地所有分支和远程所有分支 |
git checkout --track origin/branch_name | 基于远程分支创建本地分支(创建成功后,本地分支名默认与远程分支同名,并且切换到新创建的本地分支) |
git checkout --track origin/branch_name new_branch_name | 基于远程分支创建本地分支,指定名字作为新创建的本地分支名 |
git checkout branch_name | 切换本地分支 |
1.4对比同一项目不同分支下的区别
# 基于远程分支创建本地分支(默认使用远程分支名作为本地分支名)
git checkout --track origin/feature_branch_1
# 添加一个新文件a.txt
touch a.txt
# 保存并提交
git add .
git commit -m'创建了a.txt'
# 查看本地文件夹下的内容,可以看到多了一个a.txt文件
ls
# 切换回master分支
git checkout master
# 再次查看本地文件夹下的内容,可以发现a.txt不见了
ls
1.5图解
【切换回master分支】
工作区展示的就是版本库中当前分支的内容,所以切换回master就会发现a.txt不见了,如图。
1.6多个分支开发≈多人合作开发
- Q1:为什么要有多个分支存在?
- A1:可以多人同时开发,每一个人基于master创建自己的远程分支,然后再基于自己的远程分支创建本地分支,在自己的本地分支上开发。开发完成后提交到远程分支,最后再将所有人的提交内容合并到dev分支。就好比做一道西红柿炒鸡蛋,一个人切西红柿,一个人炒鸡蛋,最后将切好的西红柿和炒好的鸡蛋放在一起,简单翻炒一会,就可以出锅了。这样比一个人做西红柿炒鸡蛋快多了,大大提升了效率。
- Q2:多人合作开发的优缺点?
- A2:优点就是:提升效率,分工明确,互不干扰;缺点就是:如果合作不规范或者特殊情况,会容易产生代码冲突,就需要人工检查合并。
1.7图解
1.远程仓库中除master分支外,有三个基于master分支创建的远程分支(默认由三个人自己创建的)
2.三个人分别基于远程仓库的三个远程分支创建本地分支
3.三个人分别在自己的本地分支上开发(这里默认他们开发的部分不冲突,冲突问题放在第三章讲
)
4.三个人开发完成后,将开发的内容push到自己的远程分支
5.最终由组长来将三个远程分支的内容合并到master分支(一般来说会有一个dev分支,用来跑测试环境,组长先合并到dev分支,测试环境跑一段时间没问题后再合并到master上线,这里为了方便画图,直接省略dev分支
)
第2节:合并分支
每一个分支都有一个头指针,指向分支的最新节点
HEAD指针指向的是当前分支的头指针
合并的过程,实质上是
分支头指针的转移过程
2.1本节涉及的概念
概念 | 解释 |
---|---|
Fast forward模式 | git merge时默认使用的方式:直接将当前分支指针指向要合并的分支指针 |
非Fast forward模式 | git merge --no-ff:先创建一个新的历史节点,记录这次合并操作,然后再将当前分支指针指向要合并的分支指针 |
2.2本节涉及的git指令
指令 | 作用 |
---|---|
git merge branch_1 | 将本地分支branch_1合并到当前分支 |
git merge origin/branch_1 | 将远程分支branch_1合并到当前分支 |
git merge --no-ff branch_1 | 将本地分支branch_1合并到当前分支,非Fast forward模式 |
2.3四种合并情况
下面四个例子中,分支A和分支B既可以是远程分支也可以是本地分支
情况1:【分支A合并到分支B,A比B新,Fast forward模式合并】
1.图中001、002、003代表commit id
2.分支A和B的前两个历史节点其实是相同的,实际上应该是一条链表,这里画成两条链表是为了方便看“分支头指针”是如何转变的
情况2:【分支A合并到分支B,B比A新,Fast forward模式合并】
不会做任何操作,提示Already up to date.
情况3:【分支A合并到分支B,A比B新,非Fast forward模式合并】
情况4:【分支A合并到分支B,B比A新,非Fast forward模式合并】
不会做任何操作,提示Already up to date.