有趣的git
Git
这一篇文章,单独讲讲Git。因为回去我问了一下小伙伴,大家都是GUI操作GIT,虽然并不影响开发,但一方面我们需要去知道GUI到底做了什么事情,另外一方面就是你需要更细致灵活和自由的去操纵GIT这是GUI提供不了的能力,随心所欲的写GIT真的是一件很帅的事情。基础概念
在这之前还得说一下fork和clone,我们平时开发业务项目都是自己clone把,但这是在给你了开发权限的情况。
而fork是这种没有权限的情况,具体说一下这个流程把(昨天正好有人问到):当我们fork后就多了一个同名的项目,在自己的账号下,然后clone到本地,去关联上游仓库gitremoteaddupstreamxxx,当开发时,需要增加一个分支(如同名上游分支叫feat:xxx),你需要建立一个分支并设置追踪关系(这里你要确定一下你是rebase还是merage),gitfetchupstream、gitupstreamxx、gitpushoriginxxx,然后就开发改文件push到自己的分支,提PR或者MR,然后叫人做CR(Codereview)就合了。1。gitremote
对于一个想了解Git的开发者来说,是一定知道本地仓库和远程仓库的。
而本地仓库与远程仓库的一系列联系,通常是通过gitremote,例如:gitremoteadd来添加当前本地仓库的远程仓库,在这之后你的本地仓库已经和远程仓库建立了联系。
就比如说:你fork了一个分支,本地就新建了一个master分支去追踪(track)远程的master分支,此时你的master和远程的master是同名的,就会可以直接gitpush2。gitbranch
git的分支有很多的理论知识,但它们的本质都是为了将branch从对应的主线分支分离出来,去做进一步的开发而不影响原始主线。而branch系列命令是为了我们去将各分支进行一些管理和建立联系,而Git分支,其实本质上仅仅是指向提交对象的可变指针。
同样branch也存在本地分支和远程分支,我们gitbrancha可以看到所有的包含远程分支和本地的分支,而gitbranchsetupstreamoriginbranch是与上游分支去建立追踪关系,此时可以直接gitpush。3。gitcommit
在每次本地工作完成后,提交代码后,都会做一个gitcommit操作来保存当前工作到本地仓库(repository),此时会产生一个commitid,这是一个能唯一标识一个版本的序列号。你可以对于这个版本号做很多的操作比如回退,反转等(有个重要的地方是你只需要前4位就可以完成操作)。在使用gitpush后,这个序列号还会同步到远程仓库。4。prormr
Pr和Mr,都是在集成一个版本前的缓冲余地,他们的好处就是代码合并之前能做一个拦截,去做你任何想做的事情(比如审查,打回去等)。
git的结构适合多人合作开发不同的功能模块,此时如果每个人都在其各自的分支上开发一个相对独立的模块的话,在每次release制作时都需先将各成员的模块做一个合并操作,用于合并各成员的工作成果,完成集成。5。工作区域
上图我们可以看到,git的工作区域分为:工作区,暂存区,本地仓库区,远程仓库区。
工作区workspace:即我们项目的根目录,也是我们存放代码的地方。
暂存区indexstage:在我们项目的。git目录下有一个index文件,是一个包含文件索引的目录树用于记录文件的变化。当我们代码有改动但不想push时,我们可以选择add到暂存区。我们工作区的代码在提交push回滚reset时,也会优先选择暂存区的内容进行操作。
本地仓库区repository:也叫本地版本库是。git目录存在的位置。当我们执行commit命令后,暂存区的目录树会写到版本库中(最终存储在分支branch)。这里安全的存放你提交到所有版本的数据,其中HEAD指向最新放入仓库的版本。
远程仓库区remote:托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。基础实战
好了每次感觉讲基础能力的时候都觉得自己其实理解不够。唔这里推荐个基础的练习网站。
说句后话,那些专门想玩的git的伙伴们,可以去了解一下其他指针,比如FERCHHEAD,MERGEHEAD,CHERRYPICKHEAD等,他们分别作用于类似解决冲突,记录拉取,cheerypick之类的事情,但我们这讲的是基础嘛,再加上我也没去了解过了,就不写了。HEAD指针实战
HEAD指针,用于记录当前工作的位置,可以指向commit和branch,但实际上是指向当前正在操作的commit。
我们工作在某一个分支上,比如main分支。当指向main时commit提交后,main指针和HEAD指针一起前进的,每做一次提交,这两个指针就会一起向前挪一步。
我们以checkout来说,实际上我们的checkout这个命令控制的是HEAD指针。
我们平时gitcheckoutfeaturexxx是切到当前featurexxx这个分支,此时的指针是这样的HEADfeaturexxxcommitid(提交版本号)
以下图为例:
gitcheckoutoverHere
HEADoverHereC1
可以看到此时的overHere指针和HEAD指针分离惹。
gitcheckoutc1
HEADC1overHere
如果要切回去就gitcheckoutoverHere
切回去后我们试试提交,此时branch指针和head指针,会同时移动
gitcommit
唔?那有啥用那?
当HEAD指针直接指向提交时,就会导致detachedHEAD状态。在这个状态下,如果创建了新提交,新提交不属于任何分支。相对应的,现存的所有分支也不会受detachedHEAD状态提交的影响。
简单的说我们有时候在排查复杂的问题的时候,我们可以直接checkout到你觉得可能有问题的版本号去修改,detachedHEAD会保护你现有分支不受影响,测试完了不想保存直接checkout到其他地方,可以放弃修改。想保存修改,可以创建一个gitcheckoutb新分支保存。
还有在你回滚一系列操作的时候你可以HEAD、HEAD、HEAD4,分别代表的是当前版本,上一个版本,上4个版本。比如:gitresetHAED表示的就是回滚到上个版本。暂存区实战
怎么讲那,上面简单提到了暂存区但那个概念的东西有点虚无,但我们可能平时对于它的了解只在于gitadd,存到暂存区然后push,然后mr。但其实实际上我们平时在一些GUI工具中,对代码的比对就跟它息息相关,这里我只简单讲一下,可能是因为我觉得在现在一些GUI中做得更好把。
比如我们现在:gitadd了一下文件到暂存区中。我们就可以通过下面的命令去对暂存区做一些比对和修改。
命令
作用
gitdiff
工作区vs暂存区
gitdiffhead
工作区vs版本库
gitdiffcached
暂存区vs版本库
而对于一些暂存区回滚操作来说:
命令
作用
gitresetsoft
暂存区工作区
gitresetmixed
版本库暂存区
gitresethard
版本库暂存区工作区回滚
gitresethard这种模式大家熟悉把,但它会将暂存区工作区版本库全部都回滚到你指定的版本。
而reset其实有三种模式hard回滚三大区mixed回滚版本库和暂存区(默认模式)soft只回滚版本库
说说我经常会遇到的一个场景
假设我提交了一个文件,然后我突然发现有bug,我这时候觉得就改一句话的事情再提代码一次很恶心(显得自己提交记录很多)。就可以(HEAD表示指向上个版本,HEAD5表示指向上面5个版本,也可以gitresetsoft前四位数就行)gitresetsoftHEADgitadd。gitcommitm修改bug复制代码反做
它在什么场景用?比如,我们commit了三个版本(版本一、版本二、版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用gitrevert命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。恢复
reflog,可以分为两个单词,Referencelog,引用日志。当本地仓库中的引用发生移动时,reflog都会记录下这个移动的行为。
在这先放个很丑陋的log,说说含义,前缀移动后的commit哈希,HEAD(23)移动的原因,移动的原因等。
在上面那副图中,引用指的就是HEAD指针;引用的移动就是HEAD指针的移动;通过记录操作的命令,操作的次序,操作的内容,操作后的提交信息,来记录这整个操作引起的指针移动行为。
看看实战:我当时出于某种原因,删除了featureflowtest这个分支,属于这个分支的指针都不见了,但我发现我在上一行从这个分支离开切到了另外一个分支。
此时我从引用日志里找到了,就可以恢复这个分支的内容(我还得删一次!!!)
莫名其妙的提交丢失
有时候,我们会在一些误操作后,发现我们的提交竟然不见了,也许它变成一个danglingobjects(孤立提交),指的就是没有任何分支指针或者头指针指向他,等待git去回收,这种孤立提交。一般来说并不会吗说回收,我们可以通过
它应该是我们找回git提交的最后途径了,就像这样,当然我们也可以过分一点直接gitfsckgc直接给它清理了,这样后面的人就什么都找不到了(开玩笑的,本来gitgc也会在超过数量后回收)。gitfsck复制代码
总结
总算把这些基础的东西,写完了后面应该会写一些gitflow三种流,以及CICD,以及一些git小技巧。
题外话,今年面试确实有点难约,可能大伙需要再等个1个月看看,学习学习准备准备,不会有人觉得讲git也算八股文把面试也不考这个是不是自己不懂的都叫八股文啊。
来啦!iOS15。6beta4内测,它更新什么?iOS15。6内测终于更新了,在6月29日凌晨时段,苹果发布iOS15。6beta4内测版系统,离上一个版本相隔14天,周更改成隔周更?难道要拖到9月份,等iOS16。0正式版……
果冻口红有什么危害其实就是变色唇膏在我们平时的日常生活中有很多人都非常喜欢涂口红,我们都知道,口红的种类颜色都非常多,果冻口红是很常见的一种口红,那么果冻口红有什么危害?其实就是变色唇膏。果冻口红是什么果……
硅谷心理学家98的孩子不听话绝对不是专门来气你的看点当我们在讨论孩子不听话时,到底讨论的是什么?美国硅谷校区学校心理学家,天普大学心理学博士谢刚认为,气人的孩子大概率不是故意不听话,而是心理状态出现了问题。她的实证研究表明,……
美颜秘笈口红真假对比美颜秘笈果冻口红真假鉴定美颜秘笈口红是一款在朋友圈火起来的口红,而且自从邀请一线明星李小璐代言后人气一直比较高。那么,这款口红怎么样呢?购买的时候怎么看真假呢?美颜秘笈口红为什么火【德国美……
美颜秘笈果冻口红怎么样?美颜秘笈果冻口红好用吗?美颜秘笈果冻口红色泽自然,超显年轻,提气色,适合所有唇形。那么美颜秘笈果冻口红怎么样?美颜秘笈果冻口红好用吗?试客背景彩妆风格:淡妆星座:射手性别:女妆龄:13年发……
整牙等于整容?看到傅园慧的现状,才知道baby没有说谎不知道大家还记得那个在2016年里约奥运会上,喊出洪荒之力的游泳选手傅园慧吗?当时在接受采访的傅园慧真的太可爱了,更是被称为采访界的一股泥石流,当时看到的她牙齿有些不太整……
果冻口红怎么做的?果冻口红的做法没有女人能够拒绝一支口红,女人的好气色就这样轻轻一抹就出来了,如果说天生爱口红的女人碰上了透明的果冻口红会怎样?当然是买买买!其实也可以亲自动手做果冻口红哦!安全方便卫生,赶紧……
什么叫饰底乳饰底乳什么时候用化妆品的种类有很多,不同的化妆品使用方法作用都不一样,饰底乳是一种很受大家喜爱的底妆产品,饰底乳从它的名字就能听出来大概,那么什么叫饰底乳?饰底乳什么时候用?什么叫饰底乳……
什么牌子的口红便宜又好用有哪些便宜又好的口红口红是大家都非常喜爱的一种化妆品,口红的美妆效果非常好,不同的口红颜色和口红质地涂出来的感觉都很不一样,口红是大多数人都有的必备彩妆之一,那么什么牌子的口红便宜又好用?有哪些便……
手机一亿像素是什么概念?真的能拍出清晰好看的照片吗?现在很多手机厂商都推出1亿像素的手机,小米、华为、荣耀、ov等都推出过一亿像素的手机,非常吸引眼球。对于普通用户来说,一亿像素到底强在哪里?到底能拍出多清晰的照片?今天就……
毕业妆怎么画毕业妆容画法我们都知道,化妆可以画出不同的妆容效果,每种妆容展现出来的气质感觉都很不一样,很多人都想做毕业之际留下一些美好的照片回忆,那么毕业妆怎么画?毕业妆容画法。毕业妆怎么画今天……
河北有一奇葩建筑,造型奇特风格不一,吸引着许多游客来此河北有一奇葩建筑,造型奇特风格不一,吸引着许多游客来此我国是具有丰富旅游资源的大国,每个城市都有非常出名的景区,这些景区为了吸引更多的游客,必须要做好经营,打造成性价比高……