Git版本管理系列:(二)多分支操作
目录
- 分支的查看、创建、切换、删除
- 分支合并
- merge方法
- 变基rebase
- 语法总结
前面学习了单分支下git的各种用法,但在实际的版本控制中我们往往面临的是多分支的开发状况。例如你想为现有的程序(B)开发不同的功能,如果只有一个分支的话各个功能的开发只能串行进行,例如开发完了功能A,再在(B+A)的基础上开发功能C,如果功能C开发失败,势必会影响到前面的(B+A),如果使用分支的话就不会出现这种问题。另一种情况是你在和别人合作开发代码时,两个人应该要在基础版本上开辟两条分支分别进行开发,最后再将这两条分支合并到主分支中。
分支的查看、创建、切换、删除
- 创建分支:
git branch <branchname>
即可在当前分支的最新一次提交版的基础上创建一个分支。 - 基于某个提交版创建分支:
git branch <branchname> <commit_id>
- 查看分支
git branch
即可查看所有的分支,并且使用*
指示当前在哪个分支上。 - 查看分支图
git log --graph --oneline --decorate --all
其中–graph:显示分支和合并的图形化结构,–oneline:简化提交信息为单行显示,–decorate:显示分支和标签名称,–all:包含所有分支(本地和远程)。 - 切换分支:
git checkout <branchname>
/git switch <branchname>
(推荐使用),注意checkout还有恢复工作区的功能:git checkout -- <filename>
,因此分支的切换以及创建+切换都推荐使用switch。 - 创建并切换分支:
git checkout -b <branchname>
/git switch -c <branchname>
(推荐)
这里插一句话:切换分支前一定要将当前工作区中未提交的代码进行提交,因为切换相当于要丢失当前工作区与暂存区内容,加载指定分支的工作区与暂存区
- 删除分支(已合并):
git branch -d <branchname>
已经合并的分支作用不大。 - 删除分支(未合并)
git branch -D <branchname>
为合并的分支的删除需要谨慎,使用大写D进行强制删除。
分支合并
merge方法
merge叫融合,具体操作步骤如下:
- 切换到主分支
git switch <main_branch_name>
。 - 运行
git merge <feature_branch_name>
,将子分支的内容合并到主分支内。 - 解决冲突。以上两个步骤后,如果有冲突(即同一个文件相同的代码位置上主分支和子分支有不同的语句(最常见)、子分支中多出来了主分支中屏蔽的文件,诸如此类)需要解决冲突,没有冲突(例如子分支只是增加了一些主分支中没有的东西)会自动合并完成。使用
git status 来查看冲突内容
。
主要介绍一下代码冲突的表现形式:
有代码冲突的地方会被替换成如下内容:
<<<<<<< HEAD
当前分支的代码
=======
要合并的分支的代码
>>>>>>> branch-name
需要手动修改合并上面的代码,最后留下一句可执行的代码
- 执行merge就相当于自动更新了工作区,需要使用git add . 以及git commit 来完成合并工作
变基rebase
变基操作也是合并分支的一种方法,即将一个分支整体移动到另一个分支上。rebase操作的原理就是找到两个分支共同的节点,再将此节点之后的待变分支移动到基分支的最新提交后面,这就是所谓的变基,并且不同与merge分支会保留,变基操作后待变分支会消失,两个分支变成一个。
rebase语法为:git rebase [基分支] [待变分支]
,也可以简写为git rebase [基分支]
,此时默认待变分支为当前所在的分支。
rebase相比merge不会产生新的提交,可以简化项目的分支结构。但说实话rebase使用频率相比merge低一些,新手掌握merge就够用。只有当项目分支特别多特别繁杂时才有可能用rebase进行简化,并且也只会在一个支线分支上(一般也只有一个开发者)进行rebase,支线和主线的代码融合仍然是使用merge更好。
执行git rebase master bypass
。将bypass变基到master上,变基础的过程是先将bypass分支的第一个提交版本即上图的bypass1添加到master的提交五上,此时需要解决冲突,并执行git rebase --continue
,继续下一条变基操作:即将bypass分支的第二个提交版本bypass2添加到master最新的提交上(也就是前面五和bypass1合并的版本即下图rebass记录),commit后变成rebase2。此时提示变基已完成,可以看到仓库分支情况如下,原本两条分支变成了一条。rebase需要逐个continue才能完成最终的变基,不必continue一次提交一次,可以等全部continue完再提交
语法总结
1. git branch #查看分支
2. git log --graph --oneline #查看提交记录组成的分支图
3. git branch <branchname> #创建分支
4. git checkout <branchname> #切换分支
5. git checkout -b <branchname> #创建并切换到分支
6. git switch <branchname> #切换分支
7. git switch -c <branchname> #创建并切换到分支
8. git branch -d <branchname> #删除已合并的分支
9. git branch -D <branchname> #删除未合并的分支
10. git merge <branchname> #将branchname分支合并到当前分支
11. git rebase <基分支> <待变分支>