阅读完需:约 8 分钟
上一篇关于Git的文章:
Svn 中也有分支管理,但是很 low,Git 的分支管理非常强大!
分支的必要性
小伙伴们都知道,我们在完成一个项目时,不可能是“单线程”开发的,很多时候任务是并行的,举个栗子:项目 2.0 版本上线了,现在要着手开发 3.0 版本,同时 2.0 版本可能还有一些 bug 需要修复,这些 bug 修复之后我们可能还会发 2.1,2.2,2.3 这些版本,我们不可能等所有 bug 都修复完了再去开发 3.0 版本,修复 2.0 的 bug 和开发 3.0 的新功能是两个并行的任务,这个时候我们 3.0 的功能开发直接在 master 分支上进行肯定不合适,我们要保证有一个稳定,可以随时发版本的分支存在(一般情况下这个角色由 master 分支来扮演),此时我们就可以灵活的使用 Git 中的分支管理功能:
- 创建一个长期分支用来开发 3.0 功能,假设这个分支的名字就叫 v3,我们在 v3 上添加新功能,并不断测试,当 v3 稳定后,将 v3 合并到 master 分支上。
- 创建一个特性分支用来修复 2.0 的 bug ,一旦 bug 修复成功,就将该分支合并到 master 上,一旦发现新 bug ,就立马再创建分支进行修复,修复成功之后再合并。
以上两个步骤同步进行,这在 Svn 中简直是不可想象的,因为 Svn 的分支管理太 low,而 Git 能够让我们做到随心所欲的创建、合并和删除分支。
git分支中常用指令:
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
查看分支
我们可以通过 git branch
命令来查看当前仓库有哪些分支,而我们处于哪一个分支中,如下:
git branch
命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表
git branch -d dev # 删除dev分支
git branch -a # 查看所有分支
这里显示当前仓库只有一个 master 分支,这是 git 默认创建出来的,master 前面的 *
表示我们当前处于这一个分支中。
分支创建和切换
我们可以利用 git branch <分支名>
命令来创建一个分支,然后利用 git checkout <分支名>
来切换分支,如下:
如果小伙伴觉得这样太麻烦,可以通过 git checkout -b <分支名>
来一步到位,创建并切换分支,如下:
也可以通过 git checkout -
命令来切换回上一个分支,如下:
分支合并
1、创建一个temp.txt文件,通过master提交并push到远程仓库
2、切换到dev分支,修改temp.txt内容并提交
该项目有一个测试文件 temp.txt,我们修改它的内容,并通过dev分支提交一下。
vim temp.txt cat temp.txt git add temp.txt git commit -m "dev commit"
3、切换回master分支,查看temp.txt文件是否有修改
git checkout master cat temp.txt
大家可以看到我们刚才增加的一行内容不见了,嘿嘿。因为那个提交是在dev分支上,而master分支没 有变化。好了,下面我们来演示一下快速合并分支。
fast-forward 方式表示当条件允许时, git 直接把 HEAD 指针指向合并分支的头,完成合并,这种方式合并速度快,但是在整个过程中没有创建 commit,所以如果当我们删除掉这个分支时就再也找不回来了
git merge 方式强行关闭 快速合并 fast-forward
通过 git merge --no-ff <分支名>
命令将 fa 分支合并到 master 分支上。其中 –no-ff 表示强行关闭 fast-forward 方式。
想要合并分支,我们先切换到 master 分支上,然后执行 git merge --no-ff fa
命令即可完成分支合并。
合并成功后,我们看到 master 分支上的 git01.txt 上已经有了 fa 分支中的内容了。
以图表方式查看分支
我们可以通过 git log --graph
命令来直观的查看分支的创建和合并等操作,如下图:
分支衍合
所谓的分支衍合其实也是分支合并的一种方式,下面我们就来看看这个分支衍合到底是什么样的。现在我的 master 分支的内容和 fa 分支的内容是保持一致的,fa 是从 master 中创建出来的,如下图:
现在我向 fa 和 master 中各自做一次提交,如下图:
此时我们执行如下两条命令将两个分支合并:
$ git checkout fa
$ git rebase master
rebase 命令在执行的过程中会首先把 fa 中的每个 commit 取消,并且将之保存为临时 patch ,再将 fa 分支更新为最新的 master 分支,然后再把那些临时的 patch 应用到 fa 上,此时 fa 分支将指向新创建的 commit 上,那些老的 commit 将会被丢弃,这些被丢弃的 commit 在执行 git gc 命令时会被删除。合并后的分支如下图:
上面的 git rebase master
命令在执行的过程中有可能会发生冲突,发生冲突时我们有两种方案,一种直接退回到之前的状态,另一种就是解决冲突继续提交。
退回到之前的状态
我们可以通过如下命令来回到之前的状态:
$ git rebase --abort
解决冲突
不过大多数情况下我们都是要解决冲突的,解决之后继续提交。此时我们用编辑器打开冲突的文件,看到的内容可能是这样的:
上面的是 HEAD 中的内容,下面的是要合并的内容,根据自己的需求编辑文件,编辑完成之后,通过如下两条命令继续完成合并:
$ git add git01.txt
$ git rebase --continue
冲突解决
我们前面提到了在分支衍合时出现冲突的解决方案,其实普通的合并也有可能出冲突,出现冲突很正常,解决就是了,git merge 合并分支时如果出现冲突还是先重新编辑冲突文件,编辑完成之后,再执行 git add 和 git commit 即可。
小结
大家在实际操作中可以发现在我们创建、合并、删除分支的速度非常快吧,这和直接在master分支上工 作效果是一样的,但过程更安全,更可靠。下面我们来简单的总结一下:
- 查看分支 git branch -a
- 创建分支 git branch name
- 切换分支 git checkout name
- 创建并切换 git checkout -b name
- 合并某分支到当前分支 git merge name
- 删除分支 git branch -d name
更多关于Git分支的详情:
https://blog.csdn.net/justlpf/article/details/80401839