参考博文:廖雪峰Git教程

1. 分支说明

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

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

2. 创建与合并分支

2.1. 创建且使用分支

  1. [root@mini05 zhangtest]# pwd
  2. /opt/git_repository/zhangtest
  3. [root@mini05 zhangtest]# git checkout -b dev
  4. Switched to a new branch 'dev'

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

  1. $ git branch dev # 创建分支
  2. $ git checkout dev # 使用分支
  3. Switched to branch 'dev'

查看当前分支

  1. [root@mini05 zhangtest]# git branch # 当前分支前面会标一个*号
  2. * dev
  3. master

在当前分支提交信息

  1. [root@mini05 zhangtest]# cat test.info
  2.  
  3. where are you from? # 增加的内容
  4. [root@mini05 zhangtest]# git add test.info
  5. [root@mini05 zhangtest]# git commit -m "add test.info"
  6. [dev 068d030] add test.info
  7. file changed, insertion(+)

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

2.2. 切回到master并合并分支

切回master分支

  1. [root@mini05 zhangtest]# git checkout master
  2. Switched to branch 'master'
  3. [root@mini05 zhangtest]# git branch
  4. dev
  5. * master
  6. [root@mini05 zhangtest]# cat test.info

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

合并dev分支

dev分支的工作成果合并到master分支上

  1. [root@mini05 zhangtest]# git merge dev
  2. Updating c752e64..068d030
  3. Fast-forward
  4. test.info | +
  5. file changed, insertion(+)
  6. [root@mini05 zhangtest]# cat test.info
  7.  
  8. where are you from?

合并后,再查看test.info的内容,就可以看到,和dev分支的最新提交是完全一样的。

2.3. 删除dev分支

  1. [root@mini05 zhangtest]# git branch -d dev # 删除分支
  2. Deleted branch dev (was 068d030).
  3. [root@mini05 zhangtest]# git branch
  4. * master

2.4. 分支说明【重点】

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

3. 解决分支冲突

3.1. 创建且使用分支

  1. [root@mini05 zhangtest]# git checkout -b feature1
  2. Switched to a new branch 'feature1'
  3. [root@mini05 zhangtest]# tail -n3 README.md # 最后一行为新加的
  4. ccc
  5. ddd
  6. Creating a new branch is quick AND simple.

添加并提交到本地仓库

  1. [root@mini05 zhangtest]# git add README.md
  2. [root@mini05 zhangtest]# git commit -m "RE new line"
  3. [feature1 75b1490] RE new line
  4. file changed, insertion(+)

3.2. 切回到master且新增提交

切换到master分支

  1. [root@mini05 zhangtest]# git checkout master
  2. Switched to branch 'master'
  3. Your branch is ahead of 'origin/master' by commit.
  4. (use "git push" to publish your local commits)

master分支上把readme.txt文件的最后添加一行并提交

  1. [root@mini05 zhangtest]# tail -n3 README.md # 最后一行为添加
  2. ccc
  3. ddd
  4. Creating a new branch is quick & simple.
  5. [root@mini05 zhangtest]# git add README.md
  6. [root@mini05 zhangtest]# git commit -m "ma commit"
  7. [master 41de15c] ma commit
  8. file changed, insertion(+)

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

3.3. 合并分支处理

尝试合并feature1

  1. [root@mini05 zhangtest]# git merge feature1
  2. Auto-merging README.md
  3. CONFLICT (content): Merge conflict in README.md
  4. Automatic merge failed; fix conflicts and then commit the result.

查看冲突的文件

  1. [root@mini05 zhangtest]# git status
  2. # On branch master
  3. # Your branch is ahead of 'origin/master' by commits.
  4. # (use "git push" to publish your local commits)
  5. #
  6. # You have unmerged paths.
  7. # (fix conflicts and run "git commit")
  8. #
  9. # Unmerged paths:
  10. # (use "git add <file>..." to mark resolution)
  11. #
  12. # both modified: README.md
  13. #
  14. no changes added to commit (use "git add" and/or "git commit -a")

直接查看冲突内容并修改

  1. [root@mini05 zhangtest]# cat README.md # 查看冲突内容
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes.
  9. aaa
  10. bbb
  11. ccc
  12. ddd
  13. <<<<<<< HEAD
  14. Creating a new branch is quick & simple.
  15. =======
  16. Creating a new branch is quick AND simple.
  17. >>>>>>> feature1

修改后保留的内容并再次提交

  1. [root@mini05 zhangtest]# cat README.md
  2. # zhangtest
  3. zhangtest
  4. 张三
  5. Git is a distributed version control system.
  6. Git is free software.
  7.  
  8. Git tracks changes.
  9. aaa
  10. bbb
  11. ccc
  12. ddd
  13. Creating a new branch is quick AND simple.
  14. [root@mini05 zhangtest]# git add README.md
  15. [root@mini05 zhangtest]# git commit -m "conflict fixed"
  16. [master 56c6e0c] conflict fixed

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

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

  1. [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit
  2. * 56c6e0c conflict fixed
  3. |\
  4. | * 75b1490 RE new line
  5. * | 41de15c ma commit
  6. |/
  7. * 068d030 add test.info
  8. * c752e64 add info
  9. * 3b7db1c add aaa.txt
  10. * c795cfc del aaa.txt
  11. * 6d0226b add aaa.txt
  12. * b293c46 git tracks changes
  13. * 53f0f2e understand how stage works
  14. * 65a58f2 add info
  15. * d4fb57e Update README.md
  16. * e730676 Initial commit

3.4. 删除之前创建的分支

  1. [root@mini05 zhangtest]# git branch -d feature1
  2. Deleted branch feature1 (was 75b1490).

4. 分支管理策略【推荐】

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

下面我们实战一下 --no-ff 方式的git merge

4.1. 创建并使用分支

  1. [root@mini05 zhangtest]# git checkout -b dev
  2. Switched to a new branch 'dev'

修改readme.txt文件,并提交.

  1. [root@mini05 zhangtest]# tail -n3 README.md # 最后一行为新增行
  2. Creating a new branch is quick AND simple.
  3. feature2
  4. dev brach new
  5. [root@mini05 zhangtest]# git add README.md
  6. [root@mini05 zhangtest]# git commit -m "dev brach new"
  7. [dev ef9042a] dev brach new
  8. file changed, insertion(+)

4.2. 切回到master并合并分支

切回到master分支

  1. [root@mini05 zhangtest]# git checkout master
  2. Switched to branch 'master'
  3. Your branch is ahead of 'origin/master' by commits.
  4. (use "git push" to publish your local commits)
  5. [root@mini05 zhangtest]# git branch
  6. dev
  7. * master

准备合并dev分支,请注意 --no-ff参数,表示禁用Fast forward

  1. [root@mini05 zhangtest]# git merge --no-ff -m "merge with no-ff" dev
  2. Merge made by the 'recursive' strategy.
  3. README.md | +
  4. file changed, insertion(+)

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

4.3. 用git log看看分支历史

合并后,我们用git log看看分支历史:

  1. [root@mini05 zhangtest]# git log --graph --pretty=oneline --abbrev-commit
  2. * aadf8b4 merge with no-ff
  3. |\
  4. | * ef9042a dev brach new
  5. |/
  6. * 31230a8 feature2
  7. * 56c6e0c conflict fixed
  8. |\
  9. | * 75b1490 RE new line
  10. * | 41de15c ma commit
  11. |/
  12. * 068d030 add test.info
  13. * c752e64 add info
  14. * 3b7db1c add aaa.txt
  15. ………………

可以看到,不使用Fast forward模式,merge后就像这样:

4.4. 分支策略【重点】

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

GitHub-分支管理01的更多相关文章

  1. github 分支管理

    github 分支管理 最近有同事问我git 如何管理分支,这里我以github为例,做下工作中常用的分支管理操作. 分支管理 作用:假设你准备开发一个新功能,但需要两周才能完成,第一周写了60%,如 ...

  2. github分支管理

    一. 需要创建的分支 1.master 主分支 2.dev 开发分支 3.bug 修改bug分支 4.release 预发布分支 二.分支使用 1.在master上创建dev,bug,release分 ...

  3. 01 . Git常用命令及方法和分支管理

    原理 # Workspace:工作区 # Index / Stage:暂存区 # Repository:仓库区(或本地仓库) # Remote:远程仓库 本地分支关联远程 git branch --s ...

  4. 02: git分支管理

    目录:GIT其他篇 01: git & github 02: git分支管理 目录: 1.1 Git常用命令 1.2 主要分支(保护分支) 1.3 特性分支:feature (开发分支合并到d ...

  5. Git远程和分支管理

    一.远程       Git是分布式版本控制系统,最重要的优点就是远程仓库托管代码.不用自己搭建一个服务器,在github上面注册一个账户就可免费获取远程仓库.      首先需要先在github上面 ...

  6. 在GitHub上管理项目

    在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...

  7. Git 分支管理详解

    大纲: 1.前言 2.创建分支 3.切换分支 4.合并分支(快速合并) 5.删除分支 6.分支合并冲突 7.合并分支(普通合并) 8.分支管理策略 9.团队多人开发协作 10.总结 注,测试机 Cen ...

  8. Git 最佳实践:分支管理

    5月份,为统一团队git分支管理规范,刚开始准备自己写,在网上搜了下,发现不少不错的git分支管理实践.最后我为团队选择了这个git分支管理实践 A successful Git branching ...

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

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

  10. [转载]理解 Git 分支管理最佳实践

    原文 理解 Git 分支管理最佳实践 Git 分支有哪些 在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途. 分支分类 根据生命周期区分 主分支:master,deve ...

随机推荐

  1. 第3章 Linux上文件的权限管理

    3.1 文件/目录的权限 3.1.1 文件的权限 每个文件都有其所有者(u:user).所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者.权限包括读(r:r ...

  2. Go基础系列:Go slice详解

    slice表示切片(分片),例如对一个数组进行切片,取出数组中的一部分值.在现代编程语言中,slice(切片)几乎成为一种必备特性,它可以从一个数组(列表)中取出任意长度的子数组(列表),为操作数据结 ...

  3. Redis基础知识补充及持久化、备份介绍(二)--技术流ken

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...

  4. Spring Boot入门(13)自制音乐平台

      经过笔者这几天的辛勤劳作(其实就是苦逼地码代码),一个新的网站已经上线啦!该网站是用Spring Boot工具写的,主要实现的功能如下: 根据歌曲名称和音乐平台搜索歌曲,并实现歌曲的在线播放: 歌 ...

  5. C#基础知识总结(六)

    摘要 方法的总结:其中包含方法的解释.方法参数.方法返回值,方法重载,out.ref.in的用法一.C#面向过程方面的总结 顺序结构:程序按照程序代码的顺序执行 分支结构:if-else.switch ...

  6. [android] listview入门

    Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...

  7. 3款网页jQuery抽奖实例演示

    实例演示 实例演示 实例演示

  8. 弹性盒模型flex

    一.flex flex是flexible box的缩写,意为“弹性布局”: 定义弹性布局 display:flex; box{ display:flex; } 二.基本定义 我只简单的说一下容器和项目 ...

  9. js 返回小数点后几位

    function fmoney(s, n) //s:传入的float数字 ,n:希望返回小数点几位 { n = n > 0 && n <= 20 ? n : 2; s = ...

  10. [总结]高效的jQuery代码编写技巧

    缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); // ...