git(3)分支管理_<-krush->的博客-程序员秘密

技术标签: - - Git  

git 开发笔记(三)

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

$ git checkout -b dev
Switched to a new branch ‘dev’
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

gitbranchdev git checkout dev
Switched to branch ‘dev’
然后,用git branch命令查看当前分支:

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

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

Creating a new branch is quick.
然后提交:

gitaddreadme.txt git commit -m “branch test”
[dev fec145a] branch test
1 file changed, 1 insertion(+)
现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master
Switched to branch ‘master’
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d17efd8..fec145a
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 fec145a).
删除后,查看branch,就只剩下master分支了:

$ git branch
* master

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

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

用git log –graph命令可以看到分支合并图
常用:

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

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

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

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

$ git merge –no-ff -m “merge with no-ff” dev

因为本次合并要创建一个新的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后就像这样

合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug 分支:
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

小结
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

强行删除分支:

$ git branch -D feature-vulcan

多人分支:
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

因此,多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name。

标签管理:
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

Git有commit,为什么还要引入tag?

“请把上周一的那个版本打包发布,commit号是6a5819e…”

“一串乱七八糟的数字不好找!”

如果换一个办法:

“请把上周一的那个版本打包发布,版本号是v1.2”

“好的,按照tag v1.2查找commit就行!”

所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑

命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a -m “blablabla…”可以指定标签信息;

git tag -s -m “blablabla…”可以用PGP签名标签;

命令git tag可以查看所有标签。

使用github
小结
在GitHub上,可以任意Fork开源仓库;

自己拥有Fork后的仓库的读写权限;

可以推送pull request给官方仓库来贡献代码。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33592583/article/details/78840674

智能推荐

用PHP将CMYK格式的JPG文件转为RGB格式_zwfcan的博客-程序员秘密

imagick是一个PHP的扩展,它调用ImageMagick提供的API来进行图片的操作ImageMagick是一套软件系列,主要用于图片的创建、编辑以及转换等,详细的解释见ImageMagick的官方网站http://www.imagemagick.org/,ImageMagick与GD的性能要高很多,如果是在处理大量的图片时更加能体现ImageMagick的性能。一、安装Im

vscode常用前端插件_vs code nunjucks插件_yytoo2的博客-程序员秘密

1. EditorConfig for VS Code2. ESLint3. gitignore4. languageStylus5. Nunjucks6. One Dark Pro7. PostCSS Syntax8. Vetur9. View In Browser10. vscode-icons

CSR8670项目实战:BlueHeartSound电子心音计_NiceBT的博客-程序员秘密

听诊器在医学应用中十分重要,通过简单的方法,可以使医生充分了解到一个人的身体状况。但是,听诊器也存在着一定的弊端,人体内脏器官发出的一些微弱的声音,医生往往听不清楚或者根本听不到声音,所以导致许多医生直接凭借自己的经验对病人进行诊断。

Sencha Touch 2.2根据不同设备自动加载相应样式文件及Sencha Touch 2.3中各主题说明_样式中自动加touch_小姜哥的博客-程序员秘密

email:gm4linus at gmail dot comSencha Touch2.2起支持根据不同的设备加载不同的样式,你可以在应用的app.json中css配置项来配置这个规则比如"css": [ { "path": "../../resources/css/sencha-touch.css", "platform": [

SpringBoot整合ES_springboot+es_珍奇国英的博客-程序员秘密

创建SpringBoot项目,导入 ES 6.2.1 的 RestClient 依赖和 ES 依赖。在项目中直接引用 es-starter 的话会报容器初始化异常错误,导致项目无法启动。如果有读者解决了这个问题,欢迎留言交流&lt;!-- ES 客户端 --&gt;&lt;dependency&gt; &lt;groupId&gt;org.elasticsearch.client&lt;/groupId&gt; &lt;artifactId&gt;elasticsearch-rest

随便推点

PCB敷铜的作用和区别_lucky tiger的博客-程序员秘密

敷铜好处减少回路面积,散热,优化EMC电磁兼容网孔敷铜高速板一般用网孔敷铜低频电路多用大面积敷铜,这样回路更加优化。两种散热差不多,可能网孔的受热面要好一些。D+R改变敷铜规则,也就是间距设为20mil,然后敷铜,敷完后D+R再把规则改回来6milT+D+R检查板子...

华为云ModelArts产品0代码数据集测试_美好环环相扣的博客-程序员秘密

最近在搞人工智能用到华为云的ModelArts,现在总结一下大致过程现将花卉识别实验做以下总结: 网站输入华为云选择“智能,见未来”进入选择产品下方的ModelArts登录个人账号进入控制台选择开始体验创建OBS项目时名称一定要全局唯一刷新之后选择新建文件夹在你的本地上传准备好的图片,分为训练集和测试集(测试的和上传的分开,不要弄混)新建标签,...

Java圣经_zaowei21的博客-程序员秘密

 Java开发的方法论是什么?一个站在开发软件最前沿的技术怎么和方法论联系在一起呢?这对读者来说是一个新鲜的概念,对使用Java作为开发语言的软件公司来说同样如此。因此,当2003年JCOE出现在中国软

集成式电子液压制动系统液压力变结构控制_ehb simulink_thtrll1的博客-程序员秘密

转自:http://www.360doc.com/content/17/0530/15/28704984_658459526.shtml集成式电子液压制动系统液压力变结构控制*余卓平,韩 伟,熊 璐(1.同济大学汽车学院,上海 201804; 2.同济大学新能源汽车工程中心,上海 201804)[摘要] 针对集成式电液制动系统液压力控制中系统受到摩擦等非线性因素的影响而控制精度低的...

最近做Vue前端项目时遇到的一些问题总结以及解决方案_vue前端框架遇到的问题_WionWan的博客-程序员秘密

最近忙碌,但是也要总结一下最近遇到的一些问题,查漏补缺文章目录遇到的问题:watch的深度监听deep:true 导致了 Maximum call stack size exceeded记录遇到的问题:页面动态扩展,从没有滚动条到出现滚动,导致页面抖动记录:遇到的问题:vertical-align 设置什么情况下才会起作用记录:遇到的问题:vue Webpack打包后的dist 文件夹中新增除...