许多人都希望长生不老,却不知道如何度过一个无聊的周末。
这是我的第四篇原创文章
前两篇我们了解了github的本地使用和远程服务器使用。然而这并不是github的核心和亮点。很多工具都能实现前两篇讲述的功能,github的亮点在于分支的管理和多人协同开发的功能。这篇我们就讲讲git的分支管理的具体操作。
git的分支可以实现多人开发的伟大模式,从而提高生产效率。在整个GIT中,主分支(master)主要作为程序的发布使用,一般而言很少会在主分支上进行代码开发,都会在各自的分支上进行,然后在整合到master分支。可以用一个例子来说明分支,就是在开发中一般用主分支给客户做展示,用子分支做开发。
这篇文章有点长,耐心点看完,就一定会对git的理解更进一步。
准备工作:我们得先了解分支的基本原理。
master分支
以上的操作属于项目的发布执行顺序,因为最终版本就是master分支。但是对于其他的开发者,不应该在master分支进行。所以应该建立子分支,而子分支最起码建立的时候应该是当前master分支状态,而子分支一旦建立后,HEAD指针就会发生变化。
分支操作
在整个过程中,发现HEAD的指针发生变化,因为HEAD永远都要指向当前的分支,一旦创建了分支,那么一定需要针对于代码进行新的修改提交。
分支提交
那么此时master分支的版本号就落后于子分支了,但是不管子分子再怎么开发,也不是最新的发布版本,所有的发布版本都保存在master分支上,所以就必须将子分支与master分支进行合并。
当分支合并之后,实际上就相当于master的分支的提交点修改为了子分支的提交点,而后这个合并应该在master分支上完成,而后HEAD需要修改指针,断开brh分支,而指向原本的master分支。
删除分支
分支删除掉之后,所有的内容也就都取消了。
上面的是github的分支基本工作原理。下面来做学习前的文件准备:
1.新建版本库,添加文件 :
git init
git add .
2.提交本地仓库
git commit -a -m 'add some file'
(上述讲解图片来源:优拓教育的李兴华老师课件)
1
新建分支
git checkout -b xxx(分支名)
这句指令的意思是新建分支并切换到新建的分支上。
也可以分段使用指令:
git branch xxx(分支名) 新建分支
git checkout xxx(分支名) 切换分支
因为大多数情况下,我们新建分支是为了切换到那个分支上进行开发。
2
查看分支
git branch
输入指令后会发现,你所在操作的分支前有一个'*'。
3
修改分支名
git branch -m xxx(原名) xxx(修改名)
有时候在做开发的时候,发现分支名字取得不太合理,重新新建一个分支没多大必要,所以会考虑换一个分支名。
4
推送远程服务器
git push origin xxx(待提交的分支名)
提交服务器的前提是,本地必须有自己的分支,才能提交。只有第一次提交要加 '-u' 参数,之后提交并不用加这个参数。
5
查看所有分支
git branch –a 查看全部分支(远程、本地)
git branch –r 查看远程分支
git branch –l 查看本地分支
可以看的出来输入 :
git branch
默认是查看本地分支。
6
分支的合并
git merge xxx(要合并的分支)
讲解原理的时候,说过,最终版本一定是master分支上所以要进行分支的合并。要合并分支前,必须先用指令:
git chechout master
回到master分支,然后在进行合并。
上面介绍原理的时候说过,实际上修改master指针为brh 分支的指针信息。所以此时的合并方式为“Fast-forword”,表示是快速合并方式,快速的合并方式并不会产生任何的commit id.他只是利用了合并子分支的commit id 继续操作。后面在讲解“no fast-forword”方法和这种方式的区别。
7
删除分支(本地)
git branch -d xxx(待删除的分支)
强制删除分支:
git branch -D xxx(待删除的分支)
我们合并完分支后,这个分支其实已经没有什么用,我们这会儿就可以删除。
如果有一种情况,当我们在在分支开发着正开心,但是发现这个分支开发的功能并没有什么软用,我们最想做的是删除这个分支,并返回上最开始的地址。这个时候如果在分支上提交过,一般情况下用普通的删除是无法操作的,要用'-D'参数,代表强制删除。
8
删除分支(远程)
git push origin --delete xxx(远程分支名)
本地分支删除完,也要删除远程分支,表示同步。
我们也可以登陆git上查看分支是否被删除。
9
冲突自动解决
分支可以很好的实现多人开发的互操作,但是有可能出现这样的情况:
(1)现在建立了一个新的分支brh,并且有一位开发者再次分支上修改了Demo.c文件。
(2)但是这个开发者由于不小心的失误,又将分支切换回master分支上,并且在master分支上也对文件修改。
现在等于有两个分支对同一个文件进行了修改,那么在进行提交的时候一定会出现一个冲突。因为系统不知道现在应该提交那一份分支的文件。
解决冲突
上图表示子分支提交了,但是主分支也进行了修改提交。
我们可以做一个实验:
(1)创建一个分支,并修改分支某一个文件内容
git checkout -b brh
(2)提交内容
git commit -a -m 'modified some file'
(3)切换回master分支
git checkout master
(4)修改同一个文件内容,并提交修改
git commit -a -m 'master brach change'
现在是在两个分支上都进行了修改,而且修改同一个文件(简单的添加或者删除),显然现在合并是无法合并的。
(5)合并分支
git merge brh
这个时候的冲突的是git自动给你解决的,其实它解决只能是简单的合并删除,有很大的局限性。正式写代码的时候,我们是会在代码内部修修改改,并不会只是添加和删除文件,这时候,git就无能为力了。只能手动解决冲突,就是我们下面要讲解的内容。
10
冲突手动解决
以上的由于代码修改的比较有规律,程序并没有发现不能够操作的冲突,那么下面进行一个更加严格冲突产生代码。
(1) 先把brh分支删除
git branch -D brh
(2)创建并切换一个新的分支
git checkout -b brh
(3)修改文件,随意修改,并提交
git commit -a -m 'modified young.c file'
(4)切换为master分支
git checkout master
(5) 在master分支上任意修改文件,并提交
git commit -a -m 'master:modified some file'
(6)合并分支
git merge brh
这时候,我们会发现 直接冲突了,这时候,需要我们手动修改冲突。
(7)查看冲突状态
git status
我们点开"young.c"这个文件,会发现这个文件冲突的地方,git已经给你标记出来了,告诉你哪里是你修改过的,我们只需要把不需要的删除(包括标记符)即可。
(8)删除标记和手动修改文件,并提交
(9)提交服务器
git push origin master
(10) 查看历史分支合并情况
git log --graph -pretty=oneline
这个指令的意思是说,用绘图的形式,一行打印log数据。所以我们能在左侧看到完整的分支。
(11) 删除分支
git branch -d brh
11
分支管理
在之前进行的分支合并时候全部使用的是“fast forward”方式完成的,而这种方式只是改变了master指针,没有commit id。可是在分支合并的时候也可以不用这种方式快速合并,即:增加一个“—no-ff”参数,这表示合并之后会自动生成新的commit id ,从而保证了合并数据的完整性,因为有commit id 就有了阶段性的数据。
“—no-ff 进行合并”
我们来做一个实验:
(1)创建一个分支
git checkout -b brh
(2)创建或者修改文件并提交
git add .
git commit -a -m 'add some file'
(3)切换会master分支
git checkout master
(4)使用非快速方式进行代码合并
git merge --no-ff -m 'merge brh'
(5)查看提交日志
git log --graph --pretty=oneline
分支策略
12
分支暂存
现在有一个场景,你正在一个分支上进行代码的开发,但是突然你的领导给你一个新的任务,并且要求半小时内完成,怎么办?
难道那开发一半的分支要提交吗?不可能的,因为对于版本控制的基本道德方式:不能把所有有问题的代码提交上去,你所提交的代码一定是正确的,那么为了这样的一个问题,git中提供了一个分支的暂存机制,可以将开发一半的分支进行保持,而后在适当的时候进行代码恢复。
那么下面来创建一个基本的开发场景。
(1) 创建并切换到一个新的分支
git checkout –b brh
(2) 在分支上添加文件,将文件保存在暂存区中
git add .
(3) 将工作暂存
git stash
(4)查看工作区中的内容
git status
这里我只是添加了文件并没有提交,本该有提示信息,但是暂时保存了分支的工作状态。所以没有任何提示信息。
(5)返回master新建一个分支,修改并提交
git checkout master
git commit -a -m "change file"
那么现在假设创建一个新的分支,用于完成老板的要求,假设这个分支为”dev”(也可能是bug调试)
(6)新建一个分支
git checkout -b dev
我们在新建分支上进行修改,巴拉巴拉的。假装下,我们现在已经修改完了老板的要求。但是代码只是在dev这个分支,所以我们必须与master合并。
(7)切换回master分支
git checkout master
(8)合并dev分支,使用no fast forword方法
git merge --no-ff -m "merge dev branch" dev
(9)删除dev分支
git branch -dev
现在这个突发状态已经解决,就可以删除刚新建的分支(dev)。
(10)查看所有的暂存状态
git stash list
因为现在需要回到刚才的工作状态,但是这会儿可能存在多个暂存的状态,我们需要查看现在有的暂存状态有哪些。
(11)从暂存区进行恢复
暂存区恢复之后那么所暂存的操作将没有存在的意义,但是也有人会认为他又意义。所以恢复有两种形式:
·形式一:先恢复,然后手工删除暂存
git stash apply
git stash drop
·形式二:恢复的同时也将stash内容删除
git stash pop
现在下面的任务就可以想之前一样的方式修改,提交,而后删除分支。
git commit -a -m 'chang file'
git branch -d young
这篇文章有点长,先写这么多吧。剩下的一部分:git的补丁和如何进行多人协同开发部分,就放到下一篇文章来说明吧。
学习本来就不是一个容易的事儿,慢慢来,一切都还来得及。
总结
在整个git中,分支的管理是最麻烦但是这个是最重要的操作,所以这部分可以反复查看,分支是进行开发使用的,最终必须都在master上,这点最重要,切记。
-END-
转载是一种动力 分享是一种美德
感谢您抽出·来阅读此文
领取专属 10元无门槛券
私享最新 技术干货