在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
通常,合并分支时,如果可能,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 commit readme.txt -m "branch manager"
[dev 4c49945] branch manager
1 file changed, 1 insertion(+)
现在,我们切换回master
:
$ git checkout master
Switched to branch 'master'
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
$ git merge --no-ff -m "merger 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 * 7fbc277 merger with no-ff |\ | * 4c49945 branch manager |/ * 0f3d64a fixed conflicts |\ | * b4309b0 create new branch feature1 first modify * | 0b56936 goback master first modify |/ * 45ae9a9 create new branch.... * 90bc1f7 test name .......
Bug分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号001的bug的任务时,很自然地,你想创建一个分支bug-001
来修复它,但是,等等,当前正在dev
上进行的工作还没有提交:
$ git status On branch dev Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
Saved working directory and index state WIP on dev: e980635 dev
HEAD is now at e980635 dev
现在,用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
首先确定要在哪个分支上修复bug,假定需要在master
分支上修复,就从master
创建临时分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 9 commits.
(use "git push" to publish your local commits)
$ git checkout -b bug-001
Switched to a new branch 'bug-001'
现在修复bug,需要把“git branch manager....”改为“git branch manager....modify”,然后提交:
$ git add readme.txt
$ git commit -m "bug modify"
[bug-001 3b8d00c] bug modify
1 file changed, 1 insertion(+), 1 deletion(-)
修复完成后,切换到master
分支,并完成合并,最后删除issue-101
分支:
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 9 commits. (use "git push" to publish your local commits) $ git merge --no-ff -m "merge bug fix 001" bug-001 Merge made by the 'recursive' strategy. readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
太棒了,原计划两个小时的bug修复只花了5分钟!现在,是时候接着回到dev
分支干活了!
$ git checkout dev
Switched to branch 'dev'
$ git status
On branch dev
nothing to commit, working directory clean
工作区是干净的,刚才的工作现场存到哪去了?用git stash list
命令看看:
$ git stash list
stash@{0}: WIP on dev: e980635 dev
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
$ git stash pop On branch dev Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (9bfeed878d4c504cf12c67a6965db13506567b4a)
再用git stash list
查看,就看不到任何stash内容了:
$ git stash list
你可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
小结
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
现在,你终于接到了一个新任务:开发代号为Vulcan的新功能,该功能计划用于下一代星际飞船。
于是准备开发:
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
5分钟后,开发完毕:
$ git add readme.txt $ git status On branch feature-vulcan Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt
$ git commit -m "add feature-vulcan" [feature-vulcan 939d622] add feature-vulcan 1 file changed, 4 insertions(+), 2 deletions(-)
切回dev
,准备合并:
$ git checkout dev
Switched to branch 'dev'
一切顺利的话,feature分支和bug分支是类似的,合并,然后删除。
但是,
就在此时,接到上级命令,因经费不足,新功能必须取消!
虽然白干了,但是这个分支还是必须就地销毁:
$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
销毁失败。Git友情提醒,feature-vulcan
分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D feature-vulcan
。
现在我们强行删除:
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 939d622).
小结
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
相关推荐
git分支管理策略,git分支管理策略,git分支管理策略,git分支管理策略
在企业环境中,Git 分支策略是确保项目高效、稳定推进的关键。以下是对"git分支版本管理.pdf"中提到的知识点的详细说明: 1. **主分支(master)**: 主分支代表了项目的正式发布版本,通常是最稳定的代码库,只...
通过规范化的分支策略,可以避免代码冲突,保证代码质量,并简化错误修复和新功能的集成过程。 2. **必读文章** 在深入理解这一规范之前,建议阅读以下Git基础和最佳实践的文章: - 《Git工作流基础》:理解Git的...
Git分支管理的策略梳理 Git分支管理的策略梳理是非常重要的,因为 Git 的分支和合并功能非常强大,但如果不加注意,很可能会留下一个枝节蔓生、四处开放的版本库,到处都是分支,完全看不出主干发展的脉络。因此,...
- 明确的分支策略降低了合并冲突的风险,提高了代码质量。 - 特性分支使并行开发成为可能,提高了开发效率。 - 发布和热修复分支确保生产环境的稳定性,同时不影响开发进度。 总之,这个成功的Git分支模型通过...
本篇文章将探讨一种常见的Git分支规范——GitFlow,并结合给定的现状分析,解释如何优化分支使用。 1. **现状与问题**: - **Master分支**:作为发布版本的源码,应始终保持稳定,但在实际操作中,master分支没有...
在阮一峰的网络日志中,作者详细讨论了Git分支管理的策略,旨在保持版本库的演进简洁有序。以下是从文章中提取的关键知识点: 1. 版本管理系统的重要性:文章首先强调了版本管理系统在软件开发过程中的必要性,尤其...
首先,一个健康的Git分支策略应基于两个主要的常设分支:Master和Develop。Master分支被视为代码库的“黄金主线”,它存储着面向用户的正式版本,每次发布新版本时,都会从此分支发布。Develop分支则用于日常开发...
在这篇文章中,我提出一个开发模型。我已经将这个开发模型引入到我所有的项目里(无论 在工作还是私人...我不会讲任何项目的具体细节,仅是关于分支策略和释放管理相关内容。 它主要体现了Git对我们源代码版本的管理。
#### 二、Git分支使用策略 **分支使用策略**通常是团队合作的基础之一,常见的分支模型包括以下几种: - **主分支**(Master/Main):代表项目的主要版本线,只用于发布最终稳定版本。 - **开发分支**(Develop):...
2. 标签与分支:利用 Git 分支策略,为特定主题或项目创建分支,同时利用 Obsidian 的标签系统,对笔记进行分类管理。 3. 解决冲突:在多人协作时可能会遇到冲突,学会使用 Git 的冲突解决机制是必备技能。 4. ...
- 分支策略:了解不同的Git分支策略,如Gitflow、Forking工作流等,适用于不同的开发模式。 - 冲突解决:学习如何处理合并时发生的代码冲突,如何使用Git的工具进行有效解决。 - 变基(Rebasing):理解变基的概念,...
下面将详细讲解如何进行Git仓库迁移以及如何合并dev分支到master分支。 **一、Git仓库迁移** 1. **克隆仓库**:首先,你需要在新的服务器或本地目录上克隆原有的Git仓库。使用以下命令: ``` git clone <原仓库...
以下是对Git分支管理规范的详细说明: **WHY:为什么进行分支管理** 1. **控制代码提交权限**:通过分支管理,可以限制对主分支(如Master)和tag分支的直接修改,确保提交的代码经过测试验证,减少潜在问题。 2....
本章将深入探讨Git分支的概念、创建与合并,以及它如何实现分布式存储。 Git分支是软件开发中的一个灵活工具,它允许开发者在不影响主分支(通常是`master`)的情况下,进行新功能的开发或者问题的修复。在Git中,...
- Mobify是一家专注于移动优化的公司,他们可能有一套针对自身项目的特定Git分支策略,这可能涉及到如何协同处理移动平台的特性和问题。 6. **文件列表**: "branching-strategy-master"可能是一个包含详细分支...
基于项目的学习活动,面向开始使用Git进行分支的人员。 您可以在以下位置玩游戏: : 支持的浏览器:Chrome,Firefox,Safari,Opera和IE9 + 这个有趣的开源游戏是从以下网站克隆的: : 初始回购设置(学生) ...
1. **分支策略**: - **master 分支**:这是主分支,始终保持稳定状态,通常用于发布可用版本。开发不应直接在这个分支上进行,以防止不稳定代码污染主线。 - **develop 分支**:开发主分支,所有的新功能都基于这...
在Java开发中,Git分支策略通常被用于实现敏捷开发,例如,主线分支(master或main)保持生产稳定,开发分支(dev)用于新功能的开发,而特性分支(feature)则承载特定功能的实现。UGBC的核心就是对比这些分支,以...