http://blog.csdn.net/pipisorry/article/details/46958699

分支的意义

创建分支可以避免提交代码后对主分支的影响,同时也使你有了相对独立的开发环境。

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

分支管理使用基本命令

创建并切换到新分支

git checkout -b new_branch

新建分支

git branch new_branch

查看当前分支

git branch
切换到master分支

(dev): git checkout master

Note: 切换分支后你会发现本地文件会变化,如果dev分支和master文件不同的话。再cheout回来就又可以看到之前分支的文件了。不过git2.0以上好像都看得到文件。

在dev分支中时,可以通过git pull origin master将master分支上的文件下载到本地当前分支中。
合并分支到当前分支

git merge命令用于合并指定分支到当前分支
把dev分支的工作成果合并到master分支上:

$(master): git merge dev

合并分支的操作是从new_branch合并到master分支(这时master的内容就变成了dev的内容),当前环境在master分支。
删除分支

git branch -d dev

git push origin :dev #将删除操作提交到远程(删除远程分支,注意origin和:之间有空格)

皮皮Blog

git分支使用

Git里默认分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

每次提交,master分支都会向前移动一步。

当创建并进入新的分支dev时

$git checkout -b dev    #这时是看不到master中的内容,如果想同步master内容到dev,需要使用git merge master

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

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向!

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

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

$git checkout master     #到master中来时,本地看不到修改的文件及内容

$git merge dev      #这样master分支和dev分支的内容一样了

git merge命令用于合并指定分支到当前分支。直接使用git merge的合并是“快进模式”Fast-forward,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,其它merge策略可参考后面的分支merge策略。

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

$ git branch -d dev
Deleted branch dev (was fec145a).

删除后,查看branch,就只剩下master分支了:$ git branch     #输出* master

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

[创建与合并分支]

分支merge策略

git merge --no-ff dev

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

建议使用 git merge --no-ff,这样无论如何都会产生一个新的 merge commit。然后你 git show <merge-commit-sha1> 就可以看到这次 merge 的所有改动。

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


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

首先,仍然创建并切换dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

修改readme.txt文件,并提交一个新的commit:

$ git add readme.txt
$ git commit -m "add merge"
[dev 6224937] add merge1 file changed, 1 insertion(+)

现在,我们切换回master:

$ git checkout master
Switched to branch 'master'

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

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.readme.txt |    1 +1 file changed, 1 insertion(+)

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

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

$ git log --graph --pretty=oneline --abbrev-commit
*   7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
*   59bc1cb conflict fixed
...

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

Git Rebase

不怎么好用,有风险。

[彻底搞懂 Git-Rebase]git merge –squash

–squash:使用squash方式合并,把多次分支commit历史压缩为一次

git merge –squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

[git merge 将多个commit合并为一条之--squash 选项]

减少commit/更容易找到回滚点的策略

Note: 需要注意的一点是,无论是git merge dev还是git merge --no-ff dev,在master分支上都能看到dev上提交的所有commit,这样在master上直接找上一个回滚点也是很烦。需要使用

$git log --graph --pretty=oneline --abbrev-commit

这个来查询commit历史,更容易找出master上的commit。[Git版本控制:Git查阅、撤销文件修改和撤销文件追踪]

或者使用上面的git merge --spuash减少dev上的commit数。

实际开发中分支管理的几个基本原则

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

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

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

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

[分支管理策略]

皮皮Blog

写保护分支

Github推出了“可以写保护的分支”,对多人协作的项目非常有用:不得删除、不得强行推送、只有测试全部通过才接受PR

[About protected branches]

from:http://blog.csdn.net/pipisorry/article/details/46958699

ref:learnGitBranching-demo

Git版本控制:Git分支处理相关推荐

  1. git版本控制以及分支管理

    git版本控制以及分支管理--一起乘坐时光机 四.深度剖析 一.版本控制---时光机穿梭 1.熟悉版本 2.版本回退 3.管理修改 1.管理修改以及理解工作的原理 2.撤销修改的内容 3.删除文件 二 ...

  2. Git版本控制__分支管理

    文章目录 Git基本操作 1. git 两大特点 2. 安装与配置 3. 创建一个版本库 4.版本创建与回退 4.1 使用 4.2 工作区和版本库 工作区 ( Working Directory ) ...

  3. Git版本控制管理——分支

    实际开发中,会在当前开发线路上拉出另外的开发线进行开发,比如软件功能已经比较稳定的话,在后续功能的开发过程中,就很可能会拉出独立的支线进行开发,待功能开发完毕后,再将该直线合入稳定的主线中. 当然实际 ...

  4. java中git版本控制,git版本控制管理是什么?git如何实现版本控制?

    大家好,今天要跟大家讲的是关于git版本控制管理的一点小知识,git相信程序员小伙伴们都已经很熟悉了,很多项目开发都需要git,所以,git版本控制管理到底是干嘛的呢?Git又如何实现版本控制呢?下面 ...

  5. MIT 计算机操作环境导论Missing Semester Lesson 6 Git 版本控制(Git)

    版本控制系统 (VCSs) 是一类用于追踪源代码(或其他文件.文件夹)改动的工具.顾名思义,这些工具可以帮助我们管理代码的修改历史:不仅如此,它还可以让协作编码变得更方便.VCS通过一系列的快照将某个 ...

  6. 最实用 Git 版本控制

    git版本控制 Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现 ...

  7. Git本地库版本控制和分支管理

    版本控制 ①git log [parameter] 查看版本记录(使用Hash值指向相关信息,只显示之前的版本) 常用参数: –pretty = oneline (或 --oneline,缩短Hash ...

  8. Git学习(了解版本控制、Git安装配置、Git基本理论、Git搭建、Git文件操作、使用码云或Github、IDEA集成Git,Git分支开发)

    学习git之前,我们需要先明白一个概念,版本控制! 版本控制 什么是版本控制 版本迭代,新的版本!版本管理器. 版本控制(Revision Control)是一种在开发的过程中用于管理我们对文件.目录 ...

  9. 【Git版本控制】Git基础入门和分支管理

    原文作者:我辈理想 版权声明:文章原创,转载时请务必加上原文超链接.作者信息和本声明. 文章目录 前言 一.Git是什么? 二.git代码托管平台 三.git入口 (一)安装 1.linux安装 2. ...

  10. Git 版本控制之 GitFlow

    来源:  http://t.cn/EbZKx96 最近在着手制定开发规范,想要把项目正规高效的跑起来.计划引入 Git 版本控制,Git-Flow 便成为了首选.因为之前并没有过多接触,所以先花些时间 ...

最新文章

  1. ORACLE SELECT INTO NO_DATA_FOUND问题
  2. 每日两SQL(5),欢迎交流~
  3. AGC012D - Colorful Balls(并查集)
  4. 彻底搞懂Cookie、Session、JWT和Token
  5. 解决连接mysql报错1130
  6. python——文本简单可逆加密
  7. Liang-Barsky算法
  8. 47 - 算法 - 记住常用位运算-Leetcode-136-只出现一次的数字
  9. .NET Remoting 入门实例
  10. 斯诺登NFT作品拍得者PleasrDAO将继续收藏NFT艺术品
  11. 如何利用开源风控系统 TH-Nubula(星云)防止撞库?
  12. 【TDA4系列】使用 Linux + RTOS 开发基于以太网的应用程序
  13. MATLAB之ODE
  14. matlab解超静定方程,超定方程和最小二乘法 | 学步园
  15. (专升本)PowerPoint(插入超链接和动作)
  16. 16进制颜色代码#FF000000 (css颜色值)
  17. 此程序被组策略阻止,有关详细信息请联系管理员
  18. 【C语言】创建各类三角形图案
  19. Nginx 实现域名访问以及反向代理
  20. 程序员月薪多少才不会焦虑

热门文章

  1. Android依赖注入:Dagger、RoboGuice和ButterKnife
  2. 在SharePoint 2010中使用jQuery
  3. arm7 键盘扫描程序
  4. R/3 ABAP开发学习笔记---网摘
  5. 链表简介(一)——创建单向动态链表及输出单向链表内容
  6. Windows 创建 Redis 和 zookeeper 系统服务
  7. C#代码执行中等待10秒
  8. python 笔记数据类型
  9. linux导出Mysql数据sql脚本
  10. JavaScript我学之七数组