[廖雪峰] Git 分支管理(3):分支管理策略
通常,合并分支时,如果可能,Git 会用 Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制 禁用 Fast forward
模式,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 merge
1 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 后就像这样:
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
- 首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活; - 那在哪干活呢?干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如 1.0 版本发布时,再把dev
分支合并到master
上,在master
分支发布 1.0 版本; - 你和你的小伙伴们每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
说白了就是 master 是正式版,dev 是测试版。测试版在测试后确认无误才能和正式版合并,如果一开始就在正式版上开发或者修改,那如果改的过程刚好有人要使用正式版,那么就没办法保证正式版的安全稳定了。
所以,团队合作的分支看起来就像这样:
小结
Git 分支十分强大,在团队开发中应该充分应用。
合并分支时,加上 --no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而 fast forward
合并就看不出来曾经做过合并。
【网友 留言】
留言1:实际开发流程是不是这样子的呢?
- leader 在远程仓库创建 2 个分支:master 和 dev
- 张三和李四克隆远程仓库到本地
- 张三和李四都切换到 dev 分支
- 张三创建分支 z3,李四创建分支 l4
- 张三合并 z3 到 dev,李四合并 l4 到 dev
- 张三和李四 push dev 到远程库(此处会冲突吗)
- leader 把远程库里的 dev 合并到远程库的 master
答1:[廖雪峰] 合并也是在本地合并,把本地的 dev 合并到本地的 master,再把本地的 master 推到远程 master。
答2:Z3 --> dev 时 先 pull origin dev
有冲突时,在自己本地更改。
Z3 提交到 --> dev
dev 下 merge z3
如果这时候
l4 --> dev
但是他并没有先 pull,他提交上去的就会出现冲突
如果这个时候他也在 dev 下 merge 就会出现冲突。
这时候就需要在 dev 下解决冲突。
如果有冲突的情况下 提交 master 请求时 就会告诉你,解决完冲突才可以提交。
留言2:远程的 master 和 push 上去的 master 进行冲突解决?
z3 master--> |
l4 master--> | ----> 远程 master
w5 master--> |
各自解决各自的冲突,各个 master 之间的冲突 push 上去谁解决呢?
答1:[勤奋的光光2012] 根据我的理解,假设提交的先后顺序为 Z3 L4 W5, Z3 push 上去有冲突就 Z3 解决, l4 再拿到的就是 Z3 push 后的版本了,所以有冲突是 l4 解决, 依次类推。
延伸阅读:
摘自:
http://www.liaoxuefeng.com/wiki/0013739516305929606
[廖雪峰] Git 分支管理(3):分支管理策略的更多相关文章
- 廖雪峰 Git 教程 + Git-Cheat-Sheet 学习总结
廖雪峰 Git 教程 + Git-Cheat-Sheet 学习总结 本教程主要是个人的 Git 学习总结. 主要参考博客: 廖雪峰 Git 教程 Git-Cheat-Sheet 文章目录 廖雪峰 Gi ...
- 廖雪峰Git入门教程
廖雪峰Git入门教程 2018-05-24 23:05:11 0 0 0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...
- [廖雪峰] Git 分支管理(2):Bug 分支
软件开发中,bug 就像家常便饭一样.有了 bug 就需要修复,在 Git 中,由于分支是如此的强大,所以,每个 bug 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你 ...
- [廖雪峰] Git 分支管理(1):创建与合并分支(HEAD、master、dev、指针)
每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支.HEAD 严格来说不是指向提交,而是指向 mas ...
- Git-第五篇廖雪峰Git教程学习笔记(4)分支
1.一开始,只有一个主分支(master),HEAD指向Master,而Master指向主分支.现在我们创建dev分支. lfy@lfy-PC MINGW64 /c/fyliu/lfyTemp/git ...
- git学习笔记——廖雪峰git教程
OK,先附上教程--廖雪峰的官方网站 友情连接:git官网 简介 这里我只想引用他的原文: Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的.实际情况是这样的: L ...
- 《廖雪峰 . Git 教程》学习总结
基本上,Git就是以下面的命令顺序学习的.文中笔记是从廖雪峰老师的 Git教程 中总结出来的,方面查阅命令. 1.基础 git config --global user.name "Your ...
- 廖雪峰 Git教程学习笔记 原文 http://www.liaoxuefeng.com/
一 .集中式与分布式 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推 ...
- 廖雪峰git教程学习笔记2
本地git仓库和github仓库之间的传输是通过SSH加密的,所以: 注册GitHub账号 创建SSH key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id ...
随机推荐
- android ViewPager之PagerAdapter中View的重用
在写PagerAdapter的时候,需要重写instantiateItem(ViewGroup container ,int position) 此方法中,将需要加载的View,添加到conta ...
- os_cpu_a.asm
在OS_CPU_A.ASM中,定义了开.关中断的方法,在uC/OS-II系统中有三种方法可以实现中断开关,而ARM只适用于模式三,即使用一个局部变量,在中断进入之间保存CPU状态,退出时候再恢复状态. ...
- 【转载】linux ls -l命令详解
Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loca ...
- asp.net动态增加服务器端控件并提交表单
为什么要用原生的呢? 1.目的 原生出现浏览器兼容性问题 极少,不用测试多浏览兼容性 .需要考虑到市面上的其他垃圾浏览器. 2.性能不好 如果不考虑第一条 你可以换一种方式 直接上代码 .aspx页面 ...
- ps自由变换以及再次变换快捷键
ctrl+t:自由变换ctrl+shift+t:再次变换ctrl+shift+alt+t:复制一次,再次变换.
- 在VMware上安装Ubuntu软件步骤与遇到的相关问题及解决方案
图解演示环境版本: 本机系统: WIN10 虚拟机:VMware Workstation 12(中文版) 安装目标:Ubuntu Desktop 12.04 LTS (请点击这里)先下载好iso镜像 ...
- 解决JavaFTP上传文件假死问题
之前使用ftp上传文件,代码很稳定,用了快三年,因为数据迁移,从搭建了ftp服务器,配置好ip和账号密码后,再使用之前代码发现: 在下载过程中,程序出现假死的现象,就是,既不报错,也不抛异常,还不终止 ...
- pandas 合并数据
1. pandas 的merge,join 就不说了. 2. 神奇的: concat append 参考: PANDAS 数据合并与重塑(concat篇) 3.
- 洛谷P4549裴蜀定理
传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- dede列表页读取当前栏目名称
list或者arclist之内使用[field:typename/]之外使用{dede:field name='typename'/}