【Git】六、分支管理&冲突解决
上一节讲了如何和远端的仓库协同工作,这一节介绍一下分支
————————————————————————————
提要
//创建一个分支dev
$ git branch dev
//切换到dev分支
$ git checkout dev
//创建并切换到dev2分支
$ git checkout -b dev2
//查看当前的分支列表
$ git branch
//合并dev2分支到当前分支
$ git merge dev2
//删除dev2分支
$ git branch -d dev2
//查看gitlog,以图标形式,单行展示,版本号缩写
$ git log --graph --pretty=oneline --abbrev-commit
一、创建分支、合并、删除
之前的小节里,我们讲到的分支都只有master只一个默认分支,使用分支的场景如下:
你想做一个A功能,但还有一个B功能也需要你开发。这两个功能哪个先做完就要先提交不能相互影响;如果你在master分支上同时进行开发,AB功能之间会互相影响,只等你等到你把两个功能都开发完之后才能提交;这时就需要用到分支来解决这个问题,一个A分支用来开发A功能,一个B分支用来开发B功能,哪个先开发完把那个分支合并到master,这样不仅可以做到同时开发,还能不互相影响。
之前讲到版本回退的时候用到指令git reset --hard HEAD^,其中这个HEAD就是一个指向master分支的指针,其实master也是一个指针,它才真正指向当前的分支。
每次对master的commit都会有一个记录,这些记录会连成一条线;如果此时创建一个分支dev,则dev会指向当前的提交,并且HEAD指向了dev。


当我们在dev分支开发完成了一个提交,此时dev分支会指向新的提交,而HEAD依然指向dev。

加入dev的工作完成了,就可以把dev合并到master,然后销毁dev


以下上指令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
先创建一个分支,然后切换到新的分支,这里的checkout和之前撤销工作区修改的命令相同,只是少了--
可以用1条命令代替以上2条命令
$ git checkout -b dev2
Switched to a new branch 'dev2'
$ git branch
dev
* dev2
master
-b就代表创建并切换,使用git branch指令可以查看当前所有的分支,前面有*表示当前所在的分支
现在我们在新的dev2分支上做修改,add并commit一次修改后,再切换回master
$ git add .
$ git commit -m "dev2 commit"
[dev2 1c6205f] dev2 commit
1 file changed, 2 insertions(+), 1 deletion(-)
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
你会发现你刚才的修改不见了~因为刚刚的修改提交在了dev2分支,master是没有的,现在把dev2合并到master
$ git merge dev2
Updating 175d6f5..1c6205f
Fast-forward
testgit.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
git merge dev2 这句指令是在master分支时敲的,表示将dev2分支合并到当前分支,合并只会将新的提交合并到老的提交,将时间轴靠后的合并到时间轴靠前的;这里的Fast-forward表示合并是快进模式,直接将指针指向了最新的分支,现在master和dev2一致了,如果dev2不再使用,可以删除
$ git branch -d dev2
Deleted branch dev2 (was 1c6205f).
二、分支的冲突解决
刚刚提到的使用分支的场景,是同时修改两个功能,难免修改中我们修改了同一个文件,这时想把两个分支合并在一起,就会产生冲突
例如,我们先在master分支上修改testgit.txt文件,然后add、commit
再切换到dev分支,同样修改testgit.txt文件,然后add、commit
切回master分支,合并dev到master,这时会出现冲突
//修改master文件
$ git add .
$ git commit -m "master modify"
[master 7160ae0] master modify
1 file changed, 3 insertions(+), 1 deletion(-)
//切换分支,修改dev文件
$ git checkout dev
Switched to branch 'dev'
$ git add .
$ git commit -m "dev modify"
[dev 217c01e] dev modify
1 file changed, 3 insertions(+), 1 deletion(-)
//切回master,合并dev到master
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
$ git merge dev
Auto-merging testgit.txt
CONFLICT (content): Merge conflict in testgit.txt
Automatic merge failed; fix conflicts and then commit the result.
此时testgit.txt文件会变成这样,同时展示master的修改和dev的修改,然后待你解决冲突
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:

解决冲突后要进行add、commit操作,解决冲突的代码才会被提交到master,此时dev分支还是只有dev的修改,而master已经是解决冲突后的状态了。如果dev不用了,可以将其删除;或将master同步到dev,这时不会再有冲突
我们可以通过log来查看分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
* ddfb691 (HEAD -> dev, master) conflict
|\
| * 217c01e dev modify
* | 7160ae0 master modify
* | 1c6205f (origin/master) dev2 commit
* | 175d6f5 init
|/
* 1f79d9c Merge branch 'master' of github.com:ls199242/DemoRepo
|\
| * 95a3e58 Initial commit
* a472776 commit testgit.txt
* e8c7ff0 delete test.txt
* 499094d test commit
* e6ded21 test commit2
* a50498c test commit,2 files is commited
* 81a320c readme file
这是从我创建版本库以来的所有log,指令里面graph表示用图形展示合并历史,pretty=oneline表示只展示一行,abbrev表示版本号展示缩写。95a3e58 这个版本是和远程仓库创建时候的记录;ddfb691这一次是冲突那一次的提交
【Git】六、分支管理&冲突解决的更多相关文章
- Git分支合并冲突解决(续)
接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...
- Git的分支管理
0.引言 本文参考最后的几篇文章,将git的分支管理整理如下.学习git的分支管理将可以版本进行灵活有效的控制. 1.如何建立与合并分支 1.1分支的新建与合并指令 新建分支 newBranch,并进 ...
- 你真的了解git的分支管理跟其他概念吗?
现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...
- git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...
- Git应用--04遇到冲突解决办法git stash(转载)
git merge git pull时候遇到冲突解决办法git stash https://www.cnblogs.com/juandx/p/5362723.html 在使用git pull代码时,经 ...
- git多人协作冲突解决方法
http://www.trinea.cn/dev-tools/git-skill/ http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361 ...
- 四、git学习之——分支管理、解决冲突
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- 【学习总结】Git学习-参考廖雪峰老师教程六-分支管理
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- 139.00.005 Git学习-分支管理
@(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...
随机推荐
- JAVA 基础编程练习题37 【程序 37 报数】
37 [程序 37 报数] 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 问最后留下的是原来第几号的那位. package cskaoy ...
- Java使用Java OCR API进行验证码识别
Maven坐标: <!-- https://mvnrepository.com/artifact/com.asprise.ocr/java-ocr-api --> <dependen ...
- Python-OpenCV实现二值图像孔洞填充
代码如下: import cv2 import numpy as np def FillHole(mask): contours, hierarchy = cv2.findContours(mask, ...
- centos(linux)-Tomcat配置
1.在apache官网下载tomcat 2.解压缩:tar -zxvf apache-tomcat-7.0.73.tar.gz 注:是否在前面加上sudo根据自己的具体情况决定 3.配置环境变量 (1 ...
- nload 安装和使用
nload是一个很小巧的工具,用来监控当前系统的网速 安装 MAC brew install nload Linux 下载地址:https://sourceforge.net/projects/nlo ...
- XXE漏洞原理及利用
0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...
- vue项目中请求头为applicationx-www-form-urlencoded的参数传递
当请求接口的请求头如下图所示时, 前端在传参时需要先新建一个URLSearchParams对象,然后将参数append到这个对象中 const params = new URLSearchParams ...
- Centos7服务器环境搭建
1.Apache安装 yum install httpd systemctl start httpd.service #启动 systemctl stop httpd.service#停止 syste ...
- TensorFlow.环境_avx2
1.缘由: 按照之前的步骤,在Win10的笔记本上就是不行: 1.1.jupyter notebook的相关界面,如下图所示: ZC:感觉 应该还是 tensorflow的问题 1.2.然后 各种测试 ...
- Aspose.Words提取word文档中的图片文件
/// <summary> /// 提取word中的图片 /// </summary> /// <param name="filePath">w ...