【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%的代码,如果立刻提交, ...
随机推荐
- spring常用模式--模板模式
引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...
- QFramework 使用指南 2020 (一): 概述
大家好,我是 QFramework 的作者 凉鞋,QFramework 从第一次代码提交到现在快 5 年了,期间陆陆续续增加了很多功能,在使用体验上做了大量的改进. 而市面上关于 QFramework ...
- IDEA配置SpringBoot应用的profile启动参数
参考博客:https://blog.csdn.net/li396864285/article/details/83576829 如图为, 配置多台eureka的启动参数, 分别为: --spring. ...
- mysql/mariadb数据库在插入表数据时,ID竟然成奇数增加了?看完下面内容就知道怎么处理了。
今天突然被问到一个问题,mysql数据库插入表数据时,设置了ID自增,但是插入数据后,ID却呈奇数增加,不是123456类型,而是13579形式,突然有点懵,研究了一会,发现是auto_increme ...
- 《剑指offer》树专题 (牛客10.25)
考察的知识点主要在于树的数据结构(BST,AVL).遍历方式(前序,中序,后序,层次).遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- 【持续更新】一个简洁、易用的美赛 LaTeX 模板: easyMCM
目录 1 当前美赛模板通行情况的概述 2 EasyMCM 宏包说明 2.1 与 mcmthesis 的关系之说明 2.2 easymcm宏包的简介 2.3 美赛模板下载地址 3 README 摘录 3 ...
- lua 模块与包(五)
一.模块的介绍 模块类似于1个封装库,从Lua 5.1 开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,用利于代码的重用和降低代码的耦合度. ...
- [转帖]XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件
XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件 https://www.cnblogs.com/smartsmile/p/7665979.html xcopy dirA dir ...
- 【AtCoder】ARC059
为啥这场ARC那么水--一个点就切完了 ARC059 C - いっしょ / Be Together 枚举就行 #include <bits/stdc++.h> #define fi fir ...