今天我们总结一下,Git中最为强大的一点——分支。那么什么是分支呢?
所谓分支,就是分出一个枝干,用于其他用途。
比如说,你们一个团队有3个人,要同时完成一个APP的开发,每个人负责不同的模块,那么怎么可以保证所有人都可以同时进行开发呢?
这个时候就需要引入分支的概念了,3个人,每人一个分支,分别完成,当任务完成之后就可以通过分支的合并将工作完成
那么我们应该如何建立分支呢?
首先,我们先查看我们现在所在的分支,输入命令:git branch
可以看到我们当前处于master分支(也就是主分支),且只有一个分支
我们新建一个a.txt方便理解,其内容为:Hello Git!
接下来我们要开始今天的任务了,需要新建一个分支,输入命令:git branch 【分支名】
之后再输入:git branch 查看可以得到下图:
发现我们新建了一个today的分支,我们现在还是处于master分支中
接下来我们需要切换到today分支中,输入命令:git checkout 【分支名】 (这里就是输入:git checkout today)
可以得到一下提示:
再查看状态的时候,就可以看到我们处于today的分支了
之后在a.txt文件后面添加working表示正在工作,如下图:
那么我们每次创建新的分支都需要这样写,然后再切换吗?
当然不是,为了偷懒,我们可以输入:git checkout -b 【分支名】 (用于创建并移动到新的分支中)
注:为了保证不会报错,切换分支之前最好保证每个分支的工作区是干净的(也就是说提交到分支,这里并没有涉及远程库,都是本地的操作)
当commit到分支之后可以分别查看master分支下的a.txt文件和today分支下的,发现只有today下的a.txt文件有“working”这一行
工作到一半,需要调试一个bug,这个时候在today分支之外再建立一个bug分支,然后调试bug,并将其commit到分支
此时a.txt内容如下:
接下来将这个bug分支和today分支合并,将刚刚调试好的bug融入到今天的进度中
我们先checkout到today分支,输入命令:git merge 【分支名】 (这里是:git merge bug 将当前分支和bug分支合并)
这个时候再查看today分支下的内容,发现和bug下的内容一样
此时已经不再需要bug分支,所以可以将其删除,输入命令:git branch -d 【分支名】
得到提示:表示分支已经删除,可以再次查看分支状态确认
当一天的任务完成之后我们可以按照相同的方法将today分支合并到master分支,最后push到远程库
以上纯属最为简单的创建合并分支,实际过程中当然没有那么简单,最常见的就是冲突!!
当你对原来的文件进行修改,或者你的两个分支对分别对一个文件进行了不同的修改之后,再想要合并的时候,就需要考虑冲突了
我们假设如下情况:
首先,在解决冲突之后,你继续在write分支下工作,突然有个补丁需要马上补上,因此你再新建了一个fix分支,并修补了补丁
其文件内容分别如下:
(正在编写)
(修补补丁)
之后你需要将补丁补入正在编写的文件中,输入:git merge fix
这个时候会出现如下提示:
这里可以通过git status 命令查看问题所在,如下图所示:
发现了问题所在之后,通过自己的编译器打开双方修改的文件(我这里是vim)
可以看到这里将两个分支所修改的内容都显示了出来
“<<<<<<HEAD”以下“======”以上是本分支所修改的内容,而下面">>>>>fix"之前就是在合并分支所修改的地方,这里就可以根据自己的需要将其修改之后保存退出
之后再commit,可以得到提示:表示两个分支已经合并,之后便可以删除fix分支了
(这里的“write and fix”是我在修改a.txt文件之后,commit时候的提示信息)
之后我们可以通过:git branch -v 查看每个分支最后提交的提示内容,如下图:
便于我们了解我们在每个分支都做了什么内容
同样的我们可以输入:git branch --merged 查看与当前分支合并了的分支,如下图:
(这个是在today分支下查看的)
相对应的还可以输入:git branch --no-merged 查看与当前分支没有合并的分支,如下图:
(这个是在today分支下查看的)
Git有个非常智能的一点在于,当你的分支内容没有合并的时候,如果输入删除分支的命令,它会提醒你不要这样做,如下图:
(这个是在today分支下输入:git branch -d write)
当然你如果非要删除,可以按照提示输入:git branch -D 【分支名】
以上就是本地分支的一些操作和使用了,接下来再说一下远程分支吧
我们一般都是默认将本地的master分支推送到远程origin库中的master分支
但是当一个团队一起工作的时候,就需要建立远程分支,成员对产品的修改都在分支上实现,最后再合并到master分支上,作为最终版本
那么我们首先讲一下将本地的分支推送到远程分支上
输入命令:git push 【远程库名】 【分支名】
注:这里的远程库就是remote的时候链接的那个,而分支名就是新建的用于存放你的东西的文件名
例如,我将本地的today分支推送到Github上,输入:git push origin today 结果如下图:
这样就在远程库创建了today分支
当然你还可以输入:git push 【远程库名】【本地分支名】:【远程分支名】
例如,我将本地的write分支推送到一个名为read的分支上,输入:git push origin write:read 结果如下图:
此时在Github上查看,可以看到多了两个分支,分别为today和read,如下图:
当然,我们还可以将不需要的远程分支删除掉,输入命令:git push 【远程库名】 :【远程分支名】
例如,将远程的read分支删除,输入:git push origin :read
再次在Github上查看,可以看到read分支已经不在:
注:这个删除命令,其实可以理解为将一个空的分支推送到read分支,并将其覆盖
最后说一下有关衍合的问题吧,其实我并没有很理解,这里就不乱说了,等以后了解了之后再做总结吧
就我现在而言,rebase和merge其实差不多都是对分支的合并,但是有一点要非常注意,那就是:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。