分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

创建与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

真是太神奇了,你看得出来有些提交是通过分支完成的吗?

下面开始实战。

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev

Switched to a new branch'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev

$ git checkout dev

Switched to branch'dev'

然后,用git branch命令查看当前分支:

$ git branch*dev

master

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

create new branch dev..

然后提交:

$ git add readme.txt

$ git commit-m "create new branch...."[dev 45ae9a9] create new branch....1 file changed, 1 insertion(+)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master

Switched to branch'master'Your branch is up-to-date with 'origin/master'.

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev

Updating 90bc1f7..45ae9a9

Fast-forward

readme.txt| 1 +

1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev

Deleted branch dev (was 45ae9a9).

删除后,查看branch,就只剩下master分支了:

$ git branch* master

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

小结

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch

切换分支:git checkout

创建+切换分支:git checkout -b

合并某分支到当前分支:git merge

删除分支:git branch -d

解决冲突

人生不如意之事十之八九,合并分支往往也不是一帆风顺的。

准备新的feature1分支,继续我们的新分支开发:

$ git checkout -b feature1

Switched to a new branch'feature1'

修改readme.txt最后一行,改为:

create new branch feature1..

在feature1分支上提交:

$ git add readme.txt

$ git commit-m "create new branch feature1 first modify"[feature1 b4309b0] create new branch feature1 first modify1 file changed, 1 insertion(+)

切换到master分支:

$ git checkout master

Switched to branch'master'Your branch is ahead of'origin/master' by 1commit.

(use"git push" to publish your local commits)

Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。

在master分支上把readme.txt文件的最后一行改为:

goback master....

提交:

$ git add readme.txt

$ git commit-m "goback master first modify"[master 0b56936] goback master first modify1 file changed, 1 insertion(+)

现在,master分支和feature1分支各自都分别有新的提交,变成了这样:

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

$ git merge feature1

Auto-merging readme.txt

CONFLICT (content): Merge conflictinreadme.txt

Automatic merge failed; fix conflicts andthen commit the result.

果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:

$ git status

On branch master

Your branch is ahead of'origin/master' by 2commits.

(use"git push"to publish your local commits)

You have unmerged paths.

(fix conflicts and run"git commit")

Unmerged paths:

(use"git add ..."to mark resolution)

both modified: readme.txt

no changes added to commit (use"git add" and/or "git commit -a")

我们可以直接查看readme.txt的内容:

test git modify second

study git

three add

four add modify

five add modify

six add modify

seven add modify

eight add modify ...

create new branch dev..<<<<<<

goback master....=======create new branch feature1..>>>>>>> feature1

Git用<<<<<<>>>>>>标记出不同分支的内容,我们修改如下后保存:

test git modify second

study git

three add

four add modify

five add modify

six add modify

seven add modify

eight add modify ...

create new branch dev..

create new branch feature1..

goback master....

再提交:

$ git add readme.txt

$ git commit-m "fixed conflicts"[master 0f3d64a] fixed conflicts

现在,master分支和feature1分支变成了下图所示:

用带参数的git log也可以看到分支的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit*0f3d64a fixed conflicts|\| *b4309b0 create new branch feature1 first modify* |0b56936 goback master first modify|/

*45ae9a9 create new branch....*90bc1f7 test name*c1bdf43 test commit*dd34c9a no add but commit,because use other parameter*4ed30d1 eight modify dify*b45ca96 eight modify*9332d40 seven modify*72c6f9b six modify*f64b5a0 five modify*de8fd65 four modify*83a4b1e three modify*01c05cf two modify*1acafa7 first modify* 09c1bba first git

最后,删除feature1分支:

$ git branch -d feature1

Deleted branch feature1 (was b4309b0).

小结

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

用git log --graph命令可以看到分支合并图。

已经无法合并还报请合并git_GIT 分支管理:创建与合并分支、解决合并冲突相关推荐

  1. 【Git】Git 分支管理 ( 创建并切换分支 | 查看分支 git branch | 合并分支 git merge dev | 删除分支 git branch -d dev )

    文章目录 一.创建并切换分支 1.创建分支 git branch dev 2.切换分支 git checkout dev 3.创建并切换分支 git checkout -b dev 二.查看分支 gi ...

  2. 已经无法合并还报请合并git_Git不能自动合并怎么解决?

    慕仰0522570 冲突的产生很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突.而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突.git p ...

  3. 分支管理---创建与合并分支

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  4. Git 分支管理-创建与合并

    上一篇博客讲了即时分支合并是git的杀手锏,Git是非常鼓励大家使用分支的,日常开发中打断你思维的连续性是会大大降低生产力的,并且切换上下文也更繁琐,更大的损失.使用中心版本控制我们必须从中心服务器下 ...

  5. idea 分支管理插件_Git的分支管理常用命令

    文章目录 分支管理 git stash gitmerge与git rebase git merge --squash cherry-pick 分支管理 命令 作用 git branch 查看当前分支 ...

  6. idea 分支管理插件_git flow 分支管理idea 具体操做

    先借一张总体图git 整体图服务器 说明 :白色图片都是远程库信息,黑色图片为本地库信息ide 首先 在idea 搜索且按照 git flow :工具 安装完成后:idea 第一步:点击init Re ...

  7. git拉取远程分支到本地分支或者创建本地新分支

    git fetch origin branchname:branchname 可以把远程某各分支拉去到本地的branchname下,如果没有branchname,则会在本地新建branchname g ...

  8. Git 远程仓库分支管理

    目录 目录 速查表 关联远程代码仓库 克隆远程仓库 分支管理 创建分支 切换分支 合并分支 删除分支 解决冲突 速查表 指令 作用 git branch 查看分支 git branch newBran ...

  9. Git学习笔记:分支管理(1)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

最新文章

  1. 偷天换日,逼真的天空置换算法
  2. 技术面试,高效求职准则
  3. keras dense sigmoid_tf.keras一个存在自定义层时加载模型时的小坑
  4. Asp.NET MVC3添加域(Areas)区分Admin域和用户域
  5. php如何做水仙花数,使用PHP实现水仙花数及各种特殊有趣数的输出
  6. JAVA蓝桥杯: 时间转换
  7. react生命周期钩子
  8. ASP.NET验证控件详解
  9. sdk开发包怎么使用_怎么使用 Buildroot 构建根文件系统?
  10. linux下彻底卸载mysql 图解教程
  11. 自动驾驶感知-车道线系列(二)——Canny边缘检测
  12. 大数据:知识,真正的价值体现
  13. Qos令牌桶技术原理
  14. 项目:调用百度API实现图像识别
  15. 系统设计之路:如何设计一个URL短链服务
  16. java论坛 基于SSM框架的游戏论坛 java游戏贴吧 java游戏论坛 java论坛 ssm论坛 ssm贴吧 可以改为各种论坛,分类可在后台自己控制,图片可任意换
  17. 计算机总是莫名其妙重启,电脑老是自动重启怎么办,电脑为什么经常自动重启_系统圣地...
  18. 文件夹共享失败解决方式
  19. 飞腾D2000 偶尔识别不到网卡
  20. 配置Hadoop格式化namenode时报错cannot create directory /usr/local/hadoop/tmp/dfs/name/current

热门文章

  1. 贪吃蛇游戏(附源码)
  2. extern使用说明
  3. svn里ignore不需要提交的用户文档
  4. 查linux有哪些task_Java面试手册:Linux高频考点
  5. python界面开发pyqt_Python2.7+PyQt4进行界面开发
  6. python在sql添加数据库_使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据...
  7. mybatis 动态字段与表中不一样_mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题...
  8. 型热电偶阻值温度对照表_如何选用温度传感器
  9. pythonapi是什么意思_python api是什么
  10. php编写开机启动脚本,设置 msyql php-fpm 开机自动启动脚本