Git学习(四)——分支管理
一、创建与合并分支
1.创建分支
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。每次提交 ,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
实践操作:
首先,创建dev分支,然后切换到dev分支:
git checkout 命令加上-b 参数表示创建并切换,相当于以下两条命令:
然后,用git branch 命令查看当前分支:
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后提交:
现在,dev分支的工作完成,我们切换回master分支:
切换回master后,再查看readme.txt文件,刚才添加的内容没有显示。因为那个提交实在dev分支上,而master分支此刻的提交点并没有变。
2.合并分支
最简单的合并分支的方法,就是直接把master指向dev的当前提交,就完成了合并:
实际操作:
现在我们把dev分支合并到master上:
git merge 命令用于合并指定分支到当前分支。
3.删除分支
删除dev分支就是把dev指针删掉,删掉后,我们就只剩下一条master分支:
实际操作:
合并完成后,就可以放心地删除dev分支了:
删除后查看branch,就只剩下master分支了:
4.解决冲突
如果master分支和本地创建的feature1分支各自都分别有新的提交:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。
当Git无法自动合并分支时,就必须手动解决冲突。解决冲突后,再提交。git status可以告诉我们冲突的文件:
我们可以直接查看readme.txt的内容:
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
现在,master
分支和feature1
分支变成了下图所示:
git log --graph 命令可以查看分支合并图
最后,删除feature1分支,工作完成。
5.Bug分支
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101
来修复它,但是,等等,当前正在dev
上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
现在,用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
首先确定要在哪个分支上修复bug,假定需要在master
分支上修复,就从master
创建临时分支。修完完成后提交,切换到master分支,完成合并,最后删除issue -101 分支即可。
现在,可以回到dev分支上干活了:
工作区是干净的,刚才的工作现场存到哪去了?用git stash list
命令看看:
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一种是用git stash apply恢复,但恢复后,stash内容并不删除,需要用git stash drop 来删除;
另一种是用git stash pop,恢复的同时把stash内容也删除了:
6.feature分支
开发一个新feature,最好新建一个分支;
如果有分支还没有被合并,但是必须要删除。这时删除会丢失掉修改,如果要强行删除,需要使用 命令git branch -D <分支名>.
7.多人协作
当你从远程仓库克隆时,实际上是Git把本地的master和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
或者,用git remote -v 显示更详细的信息:
上面显示了可以抓取和推送的origin地址。如果没有推送权限,就看不到push的地址。
(1)推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
(2)抓取分支
如果你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送:
git pull
成功,但是合并有冲突,需要手动解决,解决的方法和解决冲突完全一样。解决后,提交,再push。
(3)小结
查看远程库信息,使用
git remote -v
;本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
;从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。因此,多人协作的工作模式通常是这样:
首先,可以试图用
git push origin branch-name
推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果
git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
Git学习(四)——分支管理的更多相关文章
- 四、git学习之——分支管理、解决冲突
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- git学习笔记 ---分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- 五、git学习之——分支管理策略、Bug分支、feature分支、多人协作
一.分支管理策略 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生 ...
- git学习笔记 --分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
- git学习(7)标签管理
git学习(7)标签管理 1. 建立标签 在发布版本时候,我们通常会在版本库中打一个标签,这样就唯一确定了打标签的版本,有点像个里程碑,这里会有一个指向某个commit的指针 打标签很简单,首先切换到 ...
- python使用git进行版本控制-分支管理
1.远程克隆 最好的方式是先创建远程库,然后,从远程库克隆: 首先在github上创建一个新的仓库,名字叫gitskills 我们勾选Initialize this repository with a ...
- Git如何进行分支管理?
Git如何进行分支管理? 1.创建分支 创建分支很简单:git branch <分支名> 2.切换分支 git checkout <分支名> ...
- Git 远程仓库分支管理
目录 目录 速查表 关联远程代码仓库 克隆远程仓库 分支管理 创建分支 切换分支 合并分支 删除分支 解决冲突 速查表 指令 作用 git branch 查看分支 git branch newBran ...
- mzy git学习,分支以及分支合并(四)
git 鼓励大量使用分支:最后进行master和分支之间的合并 git branch git branch 查看当前有多少分支,并且将当前在使用的分支用*标注出来. [一定要注意git的分支有从属概念 ...
- Git远程和分支管理
一.远程 Git是分布式版本控制系统,最重要的优点就是远程仓库托管代码.不用自己搭建一个服务器,在github上面注册一个账户就可免费获取远程仓库. 首先需要先在github上面 ...
随机推荐
- 3.1 ARM汇编编程概述
1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...
- python3+ 模块学习 之 subprocess
subprocess 模块方法: call() check_call() check_output() 以上三个方法用于创建一个子进程,父进程等待子进程结束.若shell = true, 则shell ...
- arcgis_engine_c++_runtime_r6034_error
在启动项目中添加app.manifest文件 <?xml version="1.0" encoding="utf-8"?> <asmv1:as ...
- shell中的语法(1)
反引号 命令替换.将命令的输出放在命令行的任意位置. eg. [root@gam ~]# echo The Data is `date` The Data is Fri Nov 18 10:13:56 ...
- 3、C#面向对象:封装、继承、多态、String、集合、文件(下)
面向对象多态 一.装箱和拆箱 装箱:将值类型转换为引用类型.object o = 1:值类型给引用类型赋值 拆箱:将引用类型转换为值类型.int n = (int)o; 强制转换为值类型 满足条件:两 ...
- High Memory in the Linux Kernel
This is enabled via the PAE (Physical Address Extension) extension of the PentiumPro processors. PAE ...
- python基础学习
1 list () 定义 2 dict() 转化为字典 3 tuple() 转化为元组 4 sort() 和 sorted()区别 5 a.sort(key=lambda ...
- 关于已配置log4j,运行tomcat时显示警告的分析
有时候,我们在JavaEE项目中配置了log4j及其参数信息,但是启动tomcat时,仍会显示如下信息:
- php实现只保留mysql中最新1000条记录
这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- virtualbox ubuntu 网络连接 以及 连接 secureCRT
参考http://luowei828.blog.163.com/blog/static/31031204201263125415257/ 用Host-Only 方案 ip: VirtualB ...