分支在实际生产环境中的做用:好比你准备开发一个新功能,可是须要很长的时间才能完成,第一天编写了一些代码,若是讲代码当即上传,因为代码还没写完,不完整的代码库会致使别人不能工做。可是若是等代码所有写完再提交,又存在丢失天天进度的巨大风险。git
如今有了分支,这样的担忧就彻底没有必要了。建立一个属于本身的分支,别人看不到,还继续在原来的分支上进行工做,而你在本身的分支上工做,想提交随时能够提交,直到开发完毕后,再一次性地合并到本来的分支上,这样,既安全,又不影响别人工做。github
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你能够从开发主线上分离开来,而后在不影响主线的同时继续工做。在不少版本控制系统中,这是个昂贵的过程,经常须要建立一个源代码目录的完整副本,对大型项目来讲会花费很长时间。vim
有人把git的分支模型称为“必杀技特性”,而正是由于它,将git从版本控制系统家族里区分出来。git有何特别之处呢?git的分支可谓是难以置信的轻量级,它的新建操做几乎能够在瞬间完成,而且在不一样分支间切换起来也差很少同样快。和许多其余版本控制系统不一样,git鼓励在工做流程中频繁使用分支与合并,哪怕一天以内进行许屡次都没有关系。安全
理解分支的概念并熟练运用后,你才会意识到为何 Git 是一个如此强大而独特的工具,并今后真正改变你的开发方式。app
关于git的详细介绍,建议仍是移步到git官方文档进行系统化的学习!ide
[root@git ~]# yum -y install git [root@git ~]# git --version git version 1.8.3.1 [root@localhost ~]# mkdir /git && cd /git [root@git git]# git init 初始化空的 Git 版本库于 /git/.git/ [root@git git]# git config --global user.name admin [root@git git]# git config --global user.email admin@admin.com
[root@localhost git]# echo -e "第一行" > README.txt [root@localhost git]# git add README.txt [root@git git]# git commit -m "第一次提交来自master分支" [root@localhost git]# git checkout -b dev #建立一个新的分支,名称为dev,而且切换到dev分支下 ###############如下操做在dev分支下操做################## [root@localhost git]# git branch #查看当前的分支状况 * dev #分支前的“*”号就表示当前在该分支下 master [root@git git]# echo -e "# 第二行" >> README.txt [root@git git]# git add README.txt [root@git git]# git commit -m "第一次提交来自dev分支" [root@git git]# cat README.txt #在dev分支下查看文件内容 # 第一行 # 第二行 [root@git git]# git checkout master #切换到master分支 ##############如下操做在master分支操做################# [root@git git]# git branch #保证分支切换成功 dev * master [root@git git]# cat README.txt #在master分支下查看文件内容 # 第一行 [root@git git]# git merge dev #将dev分支与当前(master)分支合并,采起的是快速合并的方式 [root@git git]# cat README.txt #再次查看文件内容 # 第一行 # 第二行 [root@git git]# git log --graph --pretty=oneline --abbrev-commit #查看提交的日志信息,使其在一行显示 * da7e6c8 第一次提交来自dev分支 * 78c0b14 第一次提交来自master分支 #能够看到提交日志前面的“*“号在同列,这就是采用快速合并的方式的特色(默认) #时间长了,就没法分辨出,具体是在那个分支进行的提交 #稍后写下关闭快速合并的方法,两者进行比对! [root@git git]# git branch -d dev #删除dev分支(前提是不在dev分支下)
在咱们实际工做中会遇到一个分支冲突的问题,就是当你在工做分支dev下对文件内容进行了修改,而后在你提交到版本库前,master分支下的内容已经发生了改变,此时,你dev分支下的内容是比master下的内容要旧,这种状况下进行分支合并,会有一个分支冲突的概念,例子以下:工具
[root@git git]# mkdir /lzj && cd /lzj #从新建立目录用于测试 [root@git lzj]# git init #初始化目录 [root@git lzj]# echo "aaaa" > readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "commit from master" #将测试文件上传到版本库中 [root@git lzj]# git branch #确认当前分支 * master [root@git lzj]# cat readme.txt #确认文件内容 aaaa [root@git lzj]# git checkout -b dev #建立dev分支并切换到dev分支 [root@git lzj]# echo "bbbb" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "commit form dev" #将dev分支的内容提交到版本库 [root@git lzj]# cat readme.txt #查看文件内容 aaaa bbbb [root@git lzj]# git checkout master #切换到master分支 [root@git lzj]# cat readme.txt #查看文件内容(仍是本来的内容) aaaa [root@git lzj]# echo "cccc" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "alter commit from master" #再次插入内容并提交 [root@git lzj]# cat readme.txt #确认文件内容 aaaa cccc [root@git lzj]# git merge dev #将dev分支与master分支进行合并 #返回如下内容,说明合并时发生冲突 自动合并 readme.txt 冲突(内容):合并冲突于 readme.txt 自动合并失败,修正冲忽然后提交修正的结果。 #接下来就是解决合并时发生的冲突 #出现上述报错信息,表示dev分支下的内容存在master分支的文件,只是dev分支的文件没有与master分支下的文件进行合并,再次提交提交便可 #实际环境中,并不建议直接提交,由于文件内容可能有特殊的地方 [root@git lzj]# vim readme.txt #此时文件内容以下 aaaa <<<<<<< HEAD cccc ======= bbbb >>>>>>> dev [root@git lzj]# cat readme.txt #讲特殊符号进行删除后再次提交 aaaa cccc bbbb [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "冲突已解决" #再次提交 [root@git lzj]# git log --graph --pretty=oneline --abbrev-commit #查看分支合并状况 * 9549c57 冲突已解决 |\ | * 336e03c commit from dev * | 26e7e0d alter commit from master |/ * e766eaf commit from master
在上面说到,在查看git版本的提交历史时,其分支结构表现的不是那么直观,那是由于默认开启了快速合并的选项,这里写下如何关闭快速合并。学习
[root@git lzj]# git checkout dev #切换到dev分支下 [root@git lzj]# echo "dddd" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "关闭快速合并" #插入数据并提交 [root@git lzj]# git checkout master #切换master分支 [root@git lzj]# git merge --no-ff -m "分支合并说明" dev #”--no-ff“选项就是关闭快速合并,需自行添加提交的说明信息 [root@git lzj]# git log --graph --pretty=oneline --abbrev-commit #查看提交的日志信息,并以一行显示 * 2255433 分支合并说明 |\ | * 5c3d07a 关闭快速合并 * | 9549c57 冲突已解决 #从这里往上,能够看出是通过一个分支才提交的 |\ \ | |/ | * 336e03c commit from dev * | 26e7e0d alter commit from master |/ * e766eaf commit from master [root@git lzj]# git branch -d dev #删除dev分支
开发人员在开发过程当中,bug就像屡见不鲜同样,有了bug就要修复,在git中,因为分支是强大的,因此均可以经过一个新的临时分支来修复bug,修复后,分支合并,而后将临时分支删除。测试
当咱们接到一个修改bug的任务后,很天然的想要建立一个分支来修复它,可是当前正在进行的工做进行到一半,还没法提交,但又须要立刻修复bug,此时,能够经过git提供的stash功能,能够把当前工做区“储藏”起来,等之后恢复现场后继续工做。3d
[root@git lzj]# cat readme.txt aaaa cccc bbbb dddd [root@git lzj]# echo "eeee" >> readme.txt [root@git lzj]# git status #查看状态能够看出有修改但未提交 # 位于分支 master # 还没有暂存以备提交的变动: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工做区的改动) # # 修改: readme.txt # 修改还没有加入提交(使用 "git add" 和/或 "git commit -a")
[root@git lzj]# git stash #使用此命令讲当前工做区隐藏 [root@git lzj]# git status #再次查看当前工做区,就是干净的状态了 # 位于分支 master 无文件要提交,干净的工做区 [root@git lzj]# cat readme.txt #再次查看文件内容,也没有刚才添加的内容 aaaa cccc bbbb dddd
[root@git lzj]# git checkout -b dev #建立dev分支并切换到dev分支 [root@git lzj]# echo "ffff" >> readme.txt [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "alter from dev" [root@git lzj]# git checkout master #切换到master分支 [root@git lzj]# git merge dev #将dev分支进行快速合并 #有两种恢复方法: #一是使用 git stash apply 恢复,可是恢复后,stash 内容并不删除,须要用 git stash drop 来删除; #另外一种方式是用 git stash pop,恢复的同时把 stash 内容也删了;这里我采用第二种方法 [root@git lzj]# git stash pop #回复存储区的内容 [root@git lzj]# cat readme.txt aaaa cccc bbbb dddd <<<<<<< Updated upstream ffff ======= eeee >>>>>>> Stashed changes #查看文件内容发现出现了分支冲突 [root@git lzj]# cat readme.txt aaaa cccc bbbb dddd ffff eeee #将文件中的乱码进行删除 [root@git lzj]# git add readme.txt [root@git lzj]# git commit -m "解决分支冲突" #从新提交
将本地的版本库与github进行关联,因为关于简单,省略此步骤!
[root@git ~]# git clone git@github.com:lvzhenjiang-hub/test.git #将github上的数据拉取到本地 [root@git ~]# git remote add origin git@github.com:lvzhenjiang-hub/test.git [root@git ~]# git remote #查看远程关联的远程主机,使用”-v“选项查看详细信息 origin [root@git ~]# git checkout -b dev #建立并进入dev分支 [root@git ~]# echo "aaa" > 123.txt [root@git ~]# git add 123.txt [root@git ~]# git commit -m "aaa" [root@git ~]# git push origin dev #将本地的dev分支与远程的dev进行关联,若是远程没有dev分支,则会新建
如图:
[root@git ~]# git branch -r -d origin/dev #将远程的dev分支进行删除 [root@git ~]# git push origin :dev #将删除的远程分支提交到远程版本库中
若是github在dev分支下,这时再次刷新就会出现如下页面,如图:
——————————本次博文到此结束,感谢阅读————————————