git(二) 分支管理
概念
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了 git 又学会了 SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
git 把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即 master 分支。HEAD 严格来说不是指向提交,而是指向 master,master 才是指向提交的,所以,HEAD 指向的就是当前分支。
创建与合并分支
(1)一开始的时候,master 分支是一条线,git 用 master 指向最新的提交,再用 HEAD 指向 master,就能确定当前分支,以及当前分支的提交点。
每次提交,master 分支都会向前移动一步,这样,随着你不断提交,master 分支的线也越来越长。
(2)当我们创建新的分支,例如 dev 时,git 新建了一个指针叫 dev,指向 master 相同的提交,再把 HEAD 指向dev,就表示当前分支在dev上。
git 创建一个分支很快,因为除了增加一个 dev 指针,改变 HEAD 的指向,工作区的文件都没有任何变化。
(3)不过,从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变。
(4)假如我们在 dev 上的工作完成了,就可以把 de v合并到 master 上。gi t怎么合并呢?最简单的方法,就是直接把 master 指向 dev 的当前提交,就完成了合并。
git 合并分支也很快,就改改指针,工作区内容也不变。
(5)合并完分支后,甚至可以删除 dev 分支。删除 dev 分支就是把 dev 指针给删掉,删掉后,我们就剩下了一条 master 分支。
案例:
(1)执行如下命令可以查看当前有几个分支并且可以看到现在在哪个分支下工作。
$ git branch
(2)下面创建一个分支 dev 并切换到其上进行工作。
$ git checkout -b dev
(3)下面我们修改 code.txt 内容,在里面增加一行,并进行提交,创建版本。
(4)dev 分支的工作完成,我们就可以切换回 master 分支。
$ git checkout master
查看 code.txt,发现添加的内容没有了。因为那个提交是在 dev 分支上,而 master 分支此刻的提交点并没有变。
(5)现在,我们把dev分支的工作成果合并到master分支上。
$ git merge dev
git merge
命令用于合并指定分支到当前分支。合并后,再查看 code.txt 的内容,就可以看到,和 dev 分支的最新提交是完全一样的。
注意到上面的 Fast-forward 信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。
(6)合并完成后,就可以放心地删除 dev 分支了,删除后,查看 branch,就只剩下 master 分支了。
小结:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突
合并分支往往也不是一帆风顺。
(1)再创建并切换到 dev。
$ git checkout -b dev
(2)修改 code.txt 内容,并进行提交。
(3)切换回 master 分支。
$ git checkout master
(4)在 master 的 code.txt 添加一行内容并进行提交。现在,master分支和dev分支各自都分别有新的提交,变成了这样:
这种情况下,git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。
(5)执行如下命令尝试将 dev 分支合并到 master 分支上来。git告诉我们,code.txt 文件存在冲突,必须手动解决冲突后再提交。
(6)git status
也可以告诉我们冲突的文件。
(7)查看 code.txt 的内容。
(8)git 用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容,我们修改后保存。
(9)再提交,现在 master 分支和 dev 分支变成了下图所示:
(10)用带参数的git log
也可以看到分支的合并情况:
$ git log --graph --pretty=oneline
(11)最后工作完成,可以删除 dev 分支。
分支管理策略
通常,合并分支时,如果可能,git 会用 fast forward 模式,但是有些快速合并不能成功,而且合并时没有冲突,这个时候会合并之后并做一次新的提交。但这种模式下,删除分支后,会丢掉分支信息。
(1)创建切换到 dev 分支下。
$ git checkout -b dev
(2)新建一个文件 code3.txt,编辑内容后提交一个 commit。
(3)切换回 master 分支,编辑 code.txt 并进行一个提交。
(4)合并 dev 分支内容到 master 分支。
(5)出现如下提示,这是因为这次不能进行快速合并,所以 git 提示输入合并说明信息,输入之后合并内容之后 git 会自动创建一次新的提交。
(6)使用分支命令查看分支信息。
$ git log --pretty=oneline --graph
(7)最后就可以删除 dev 分支了。
$ git branch -d dev
如果要强制禁用 fast forward 模式,git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息。
(1)创建并切换到 dev 分支下。
(2)修改 code.txt 内容,并提交一个 commit。
(3)切换回 master 分支。
(4)准备合并 dev 分支,请注意 --no-ff 参数,表示禁用 Fast forward。
$ git merge --no-f -m '禁用fast-forward合并' dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
(5)合并后,我们用git log
看看分支历史:
可以看到,不使用 Fast forward 模式,merge 后就像这样:
Bug 分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
(1)当你接到一个修复一个代号001的 bug 的任务时,很自然地,你想创建一个分支 bug-001 来修复它,但是,等等,当前正在 dev 上进行的工作还没有提交。并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
(2)git 还提供了一个 stash 功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
$ git stash
(3)首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支。
$ git checkout master
$ git checkout -b bug-001
(4)在bug-001我们修复了bug,然后提交。
(5)修复完成后,切换到 master 分支,并完成合并,最后删除 bug-001 分支。
(6)现在 bug-001 修复完成后,是时候接着回到 dev 分支干活了!发现工作区是干净的,刚才的工作现场到哪去了?用git stash list
命令查看。
$ git stash list
现场还在,git 把 stash把内容存在某个地方了,但是需要恢复一下。
$ git stash pop
小结:
修复bug时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除。
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复 bug,修复后,再git stash pop
,恢复工作现场。
git(二) 分支管理的更多相关文章
- 你真的了解git的分支管理跟其他概念吗?
现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...
- Git的分支管理
0.引言 本文参考最后的几篇文章,将git的分支管理整理如下.学习git的分支管理将可以版本进行灵活有效的控制. 1.如何建立与合并分支 1.1分支的新建与合并指令 新建分支 newBranch,并进 ...
- git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...
- Git(四)Git的分支管理
一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...
- 139.00.005 Git学习-分支管理
@(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...
- GIT之分支管理
分支管理 一.分支推进 主分支 单线分支,随着代码的提交而形成的一条直线,HEAD 随着commit提交之后的节点移动而移动. 子分支 当切换到子分支的时候,HEAD 则指向子分支的节点. 在子分支上 ...
- 引入git flow分支管理
git flow是Vincent Driessen提出了一个分支管理的策略,非常值得借鉴.它可以使得版本库的演进保持简洁,主干清晰,各个分支各司其职.井井有条. 先看下Vincent Driessen ...
- git branch分支管理用法总结
查看分支(远程和本地) 1 查看本地分支: $ git branch 2 查看远程分支: $ git branch -r 3.查看本地和远程分支 $ git branch -a 创建分支 1.创建本地 ...
- Git Flow 分支管理简述
概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...
随机推荐
- 2.4JAVA基础复习——JAVA语言的基础组成数组
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- struts2+springmvc+hibernate开发。个人纪录
对于很多新手来说,都不太清楚应该怎么去放置代码并让他成为一种习惯.个人的总结如下: 一.基础包类的功能 1.dao :提供底层接口 2.daoimpl:实现底层接口类,与底层交互 3.entity:实 ...
- Parallels Desktop 14.1.3中文版win系统安装教程
parallels desktop 14 中文版(pd虚拟机)是mac上最强大也是最好用的虚拟机软件,本站第一时间为大家带来这款parallels desktop 14 破解版,最新版本的parall ...
- python:threading.Thread类的使用详解
Python Thread类表示在单独的控制线程中运行的活动.有两种方法可以指定这种活动: 1.给构造函数传递回调对象 mthread=threading.Thread(target=xxxx,arg ...
- Vue 旅游网首页开发2 - 首页编写
Vue 旅游网首页开发2 - 首页编写 项目结构 首页开发 效果图 项目开发组件化 将页面的各个部分划分成不同的组件,有助于项目的开发和维护. 项目代码初始化 项目结构修改 1.删除整个 compin ...
- Java构造器与构建器的使用
我们在平常类的构建过程中,可能会面临很多问题,可扩张性.安全性等等.想象一下,这样一个场景,我们现在要创建一个类,其中有6个属性,其中又有4个属性的值是不太确定的(可能某个对象就不需要其中的某个值), ...
- 编译原理 First,Follow,select集求法
参考:https://blog.csdn.net/CooperNiu/article/details/78524688
- jquery-1.4.4.min.js无法解析json中result.data问题
如下图该版本无法解析json数据 解决方法引用jquer.min.js,并且将$修改为jQuery
- Bigger-Mai 养成计划,Python基础巩固四
一.装饰器:定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能.原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰函数的调用方式实现装饰器的知识储备:1.函数即‘变量’2.高阶函数 ...
- 【新特性】JDK10
一.局部变量类型推断 很多人抱怨Java是一种强类型,需要引入大量的样板代码.甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的.许多流行的编程语言都已经支持某种形 ...