上一节讲了如何和远端的仓库协同工作,这一节介绍一下分支

————————————————————————————

提要

//创建一个分支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】六、分支管理&冲突解决的更多相关文章

  1. Git分支合并冲突解决(续)

    接Git分支合并冲突解决,在使用rebase合并冲突情况下,如果不小心,执行完add后执行了commit,此时本地仓库HEAD处于游离态(即HEAD指向未知的分支),如何解决? 解决方法 (1)此时, ...

  2. Git的分支管理

    0.引言 本文参考最后的几篇文章,将git的分支管理整理如下.学习git的分支管理将可以版本进行灵活有效的控制. 1.如何建立与合并分支 1.1分支的新建与合并指令 新建分支 newBranch,并进 ...

  3. 你真的了解git的分支管理跟其他概念吗?

    现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...

  4. git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...

  5. Git应用--04遇到冲突解决办法git stash(转载)

    git merge git pull时候遇到冲突解决办法git stash https://www.cnblogs.com/juandx/p/5362723.html 在使用git pull代码时,经 ...

  6. git多人协作冲突解决方法

    http://www.trinea.cn/dev-tools/git-skill/ http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361 ...

  7. 四、git学习之——分支管理、解决冲突

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...

  8. 【学习总结】Git学习-参考廖雪峰老师教程六-分支管理

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  9. 139.00.005 Git学习-分支管理

    @(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...

随机推荐

  1. 用Keras搭建神经网络 简单模版(六)——Autoencoder 自编码

    import numpy as np np.random.seed(1337) from keras.datasets import mnist from keras.models import Mo ...

  2. Windows 10 下如何彻底关闭 Hyper-V 服务

    以管理员身份运行命令提示符 执行命令 bcdedit /set hypervisorlaunchtype off 重启,运行vm即可. 如果想要恢复hyper启动 bcdedit / set hype ...

  3. 子组件props接受父组件传递的值,能不能修改的问题

    参考链接:https://www.cnblogs.com/pangchunlei/p/11139356.html

  4. javascript let

    es6支持通过let关键字声明属于单独块{}的变量,更好的管理变量作用屿 funtion foo() { var a=1; if (a>1) { let b=2; //只属于if模块 while ...

  5. Java开发环境不再需要配置classpath!

    前言: 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候,确实不需要对classpath进行配置,但市面上的书籍,以及一些博客.还是老 ...

  6. C# DataTable映射成Entity

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  7. 【数据库-SQL Server】IDispatch error #3092

    使用msado15.tlh,链接Microsoft SQL Server,执行语法(syntax)的时候出现IDispatch error #3092的错误. 1.语法错误 (1)保证语法正确,有些数 ...

  8. NOIP2012 DAY1 T2 国王游戏

    题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...

  9. Python【函数使用技巧】

    写成“子函数+主函数”的代码结构,也是因为每个不同的功能封装在单独的函数代码中,方便后续修改.增删 import math # 变量key代表循环运行程序的开关 key = 1 # 采集信息的函数 d ...

  10. 标准库中最值得关注的两个 装饰器是 lru_cache 和全新的 singledispatch(Python 3.4 新增)

    clock 装饰器 def clock(func): @functools.wraps(func) def clocked(*args, **kwargs): t0 = time.perf_count ...