合肥网络推广外包,百度优化怎么做,长春网站建设网站制作推广,网络推广培训一对一我习惯每篇博客都有个开篇
还记得 Git 系列第一篇 Git 自我介绍的话吗#xff1f;其中有 Git 自己都赞同的三大特色 cheap local branching, convenient staging areas, and multiple workflows 轻量的本地分支, 方便的暂存#xff0c;以及多工作流。其中因为有分支的存在其中有 Git 自己都赞同的三大特色 cheap local branching, convenient staging areas, and multiple workflows 轻量的本地分支, 方便的暂存以及多工作流。其中因为有分支的存在才构成了多工作流的特色所以 Branch 不愧为 Git 的王牌特色。这篇博客主要和大家一起学习一下轻若鸿毛帅到炸裂的分支儿。
Branch 的概念
分支的概念在我看来分两个版本
从使用场景上解释是这么个概念
Git 的分支就是开发过程中要选择的一条路你可以选择和其他小伙伴一起走同一条路也可以自己走一条路路与路之间相互没有影响作为路的主人你也随时可以让两条路合并。 深入一点的话是这么个概念
Git 的分支其实本质上仅仅是指向提交对象的可变指针这个可变指针指向路的终点。同时还有一个比较特别的 HEAD 指针用于记录当前工作的位置借用上面的例子这个 HEAD 指针等于在路上走的你自己你在哪指针就在哪你在哪个分支HEAD 指针就指向哪个分支的指针。
实际上当我们使用 Git 的时候我们就使用了分支因为 Git 的默认分支名字是 master如果你有心的话会发现执行 git init后命令行的输出头部已经默认在 master 分支了。 但是这个时候还并未创建 master 分支只有当有一个提交的时候才会创建 master 分支。原因在于分支的指针要指向提交的呀突然明白了当初看 Android Studio 的教程为什么每个都让有一个初步提交了呢。
无图无真相不信的看下面: 玩转 Branch 必备技能
有关分支的命令不多无非是换着花样的增删改查掌握好以下基本的命令以后就可以在 Branch 的草原上策马奔腾潇潇洒洒啦
创建分支 git branch name这个命令看起来似乎简单到你只需要想个分支的名字就好了。 但是在创建分支的时候要想下是否要从当前分支的内容基础上去开辟一条新分支。
查看分支
三个命令让你想看什么分支就看什么分支就是这么方便 git branch //查看本地分支git branch -r //查看远程分支git branch -a //查看本地和远程的所有分支删除分支
当本地分支删除后推动到远程仓库后远程仓库并不能自动删除远程分支原因下回分解。所以分支的完全删除是分两个部分的一个是本地一个是远程。
本地删除操作需要加上 -d或者 -D 参数参数的名称来自英语 delete的缩写Remember it so easy!
两者的区别在于-D比-d要粗暴一点。当被删除分支有新内容没有被合并的时候使用-D会直接删除 使用-d会提示该分支有新内容没有被合并不执行删除。删除需谨慎建议非特殊情况下使用温柔的-d要好一点以免小手一抖眼泪长流。 git branch -d namegit branch -D name //强制删除
删除远程分支需要 push 操作。
git push origin :name重命名分支
其实这是个伪命题。
但是有很多人包括我都有过对分支名称不满意想该修改一下的想法所以就有了这个伪命题的存在。
事实上分支不存在重命名没有 rename 的这个命令。如果你起的名字不满意想重新起的话那只要创建一个和要修改分支内容一样的分支起上你喜欢的名字然后再把之前的给删掉。
检出分支
这个检出分支的“检出”二字算是个关于 Git 分支的专业术语了,你可以理解为切换当前分支。 本质上 checkout 操作是移动 HEAD 指针将 HEAD 指针指向要切换的分支的指针处。
使用场景有两个
已经存在的分支现在要切换过去。 git checkout name创建一个新分支并切换到新分支这个一步到位的话需要 -b 参数。 以当前分支为基础创建一个新分支 git checkout -b branch name以指定的某一个提交创建一个新分支 git checkout -b branch name SHA1合并分支
以上是分支的增删改查独立操作但是 Git 创造这个分支并不只是为了让它们自个儿和自个儿玩的还需要它们之间的相互协作和配合。 就像写项目的时候分好开发任务你和你的小伙伴新建了两个分支你写你的 Anglela他写他的 baby,到开发完成之后肯定要合在一起才能成就 Anglelababy。合的这个动作就涉及到了分支合并的概念。
分支合并使用到的命令是
git merge branch name分支合并相对分支的其他操作是相对要复杂一点的怎么说也是多分支操作至少要对得起它一听就比较高端的名字吧于是我决定把分支的合并作为一个大标题。
Branch 合并是大事
git 的两种合并模式
分支的合并是非常智能的目前有两种模式两种模式的选择不需要我们参与而是 Git 根据分支情况不同自行判断选择的。在我使用 Git 的过程中执行分支合并有时需要输入提交信息有时不需要作为小白的我懵的不知所以然后来才知道是因为合并模式的问题。
两种模式是
Fast-Forward快进式PS:这个名字是官方的Recursive Strategy Merge策略合并式PS:这个名字非官方我自己起的有时也叫三方合并式
Fast-Forward快进式 如图有两个分支master 分支和 feature 分支。当这两个分支处于上面的关系时当进行合并操作时就会出现 fast-forward。
原因是由于当前 master 分支所指向的提交是 feature 分支的直接上游所以 Git 只是简单的将指针向前移动。 换句话说当你试图合并两个分支时如果顺着一个分支走下去能够到达另一个分支那么 Git 在合并两者的时候只会简单的将指针向前推进指针右移因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进fast-forward”。
合并后的分支指针位置如下 Recursive Strategy Merge策略合并式
这个合并方式是为补充 fast-forward 而出现的因为你知道在项目开发过程中很多人开发的情况下出现 fast-forward 的情况并不是很多很多是类似下面这种。提交历史是分叉的无法满足执行 fast-forward 的条件 因为master 分支所在提交并不是 feature 分支所在提交的直接祖先Git 不得不做一些额外的工作。 出现这种情况的时候Git 会使用两个分支的末端所指的快照C4 和 C5以及这两个分支的工作祖先C3做一个简单的三方合并,生成一个新的提交C6。 实战演练一下
说起来就是一堆理论我自己都记不住找个例子演示一下:
//创建一个文件夹并初始化 Git
mkdir GitDemo
git init//初次提交创建 master 分支
touch master.txt
git add.
git commit -m 添加master文件//从master分支末尾创建并切换 featureA 分支并创建一个提交
git checkout -b featureA
touch A.txt
git add.
git commit -m 添加A文件//从master分支末尾创建并切换 featureB 分支并创建一个提交
git checkout master
git checkout -b featureB
touch B.txt
git add.
git commit -m 添加B文件//切换 master 分支
git checkout master//master 合并 featureA 分支
git merge featureA//master 合并featureA 后再合并 featureB 分支
git merge featureB
博主不想给你说话并向你投掷了一大串命令快去敲敲看啊会看到两种合并模式的
master 分支合并 featureA 时是快进式合并 master 分支合并 featureA 后 再合并 featureB 时已经不满足快进式条件了此时合并会触发一个三方合并产生一个新的提交。所以执行合并命令会跳到下面的页面让我们编辑这个新提交的提交信息默认提交信息是“Merge branch ‘branch name’”. 按 i编辑提交信息, :wq!保存并退出页面。 合并成功后的提示信息 画出上面小例子的分支合并示意图如下 和平解决 Branch 合并冲突
有人在的地方就有江湖有分支在的地方就有冲突。
有时候合并操作不会如此顺利。 如果你在两个不同的分支中对同一个文件的同一个部分进行了不同的修改Git 就没法干净的合并它们于是就会发生冲突。
如下分别在 master 和 featureA 在master.txt 文件第一行添加一句话然后两个分支合并就会发生冲突。
冲突提示信息中指明冲突文件为 master.txt。同时也可以通过 git status 命令查看冲突的详细信息 需要说明的是如果遇到冲突的话git 就无法自动合并了接下来要靠我们自己手动解决冲突方法是
查看造成冲突的文件修改冲突部分对修改后冲突文件执行 git add操作创建一个修改冲突的提交。
先知道一下思路有个简单的概念在脑子里接下来一步一步仔细看
第一步查看造成冲突的文件修改冲突部分
冲突文件 master.txt 如下git 虽然无法解决冲突 但是已经帮我们帮到最后了使用简单的三个符号标明了冲突的地方以及冲突的两个分支在该地方发生冲突内容。 符号意义分隔符 HEAD 至 master 分支中该地方的内容 至 featureAfeatureA 分支中该地方为内容
接下来编辑 master.txt 文件,完成合并确认之后把 git 冲突标识符号给删除掉即可。
第二步 第三步修改后冲突文件add commit 分支回滚 有后悔路可以走
现实中难免有些时候你会有后悔的念头。例如每天我迟到的时候都会后悔为什么第一遍闹钟响的时候没有起床但是这个世界没有后悔路可以走我只能努力做到明天早起。
但是Git 中有因为神奇的 reset 和 revert 命令两个命令都可以达到回滚的效果两者之间的区别以后会专门说这里我们使用 reset 。
提前声明回滚之前不要忘记做好备份有备无患呐。
本地分支回滚
确定回滚到哪个提交找到该提交的 commit id,执行以下命令就好了
git reset --hard commit id远程分支回滚
依旧是个伪命题。远程分支不存在什么回滚要想达到回滚的效果就是删除之前的远程分支然后把本地回滚好的本地分支push 到远程。
git reset --hard commit id //本地分支回滚
git push origin :name //删除远程分支
git push origin name //用回滚后的本地分支重新建立远程分支我习惯每篇博客都有个结束语
这篇博客用了我不少洪荒之力希望对大家理解 Git 分支有所帮助不对之处还请指出。 最近 Git 系列走起下篇博客见
欢迎订阅我的Git系列文章 01. 请回答Git是什么 02. Git常用命令一日游活动 03. Git三大特色之Branch(分支) 04. Git三大特色之Stage(暂存区) 05. Git三大特色之WorkFlow(工作流) 06. Git-你好, HEAD 同学 07. Git-用 cherry-pick 挑好看的小樱桃 08. Git-rebase 黑魔法之打造完美的线性历史 09. Git-rebase 黑魔法之打磨 commit 颗粒度 10. Git-少年你想学回滚吗想撤销文件修改吗 11. Git-移动记录仪 贴心小棉袄 reflog 12. Git-丢失的 commit 是真的消失了吗 13. Git-叹为观止的 log 命令 其参数 14. Git-送娃子们一本关于如何自学 Git 的秘籍 欢迎关注个人微信公众号「浅浅同学的开发笔记」最新的博客好玩的事情都会在上面分享期待与你共同成长。