在日常生活组织工作中,时常会加进Git操作方式。但对后辈来说,刚上去对Git很孤单,操作方式出来也很懵逼。第一集该文主要就特别针对刚开始碰触Git的后辈,认知Git的基本概念,掌控常见的许多指示。
Git组织工作业务流程
以内主要就包括许多单纯而常见的指示,但先不重视那些,先来介绍上面这4个辞汇。
Workspace:组织工作区
Index / Stage:甲类
Repository:库房区(或邻近地区库房)
Remote:远距库房
组织工作区
开发人员展开合作开发更动的地方性,是你现阶段看见的,也是新一代的。
平时他们合作开发是复本远距库房中的两个组成部分,如前所述该组成部分展开合作开发。在合作开发操作过程中是对组织工作区的操作方式。
甲类
.git目录下的index文件, 甲类会记录git add添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看甲类的状态。甲类标记了你现阶段组织工作区中,哪些内容是被git管理的。
当你完成某个需求或功能后需要提交到远距库房,那么第一步是通过git add先提交到甲类,被git管理。
邻近地区库房
保存了对象被提交 过的各个版本,比起组织工作区和甲类的内容,它要更旧许多。
git commit后同步index的目录树到邻近地区库房,方便从下一步通过git push同步邻近地区库房与远距库房的同步。
远距库房
远距库房的内容可能被分布在多个地点的处于协作关系的邻近地区库房修改,因此它可能与邻近地区库房同步,也可能不同步,但它的内容是最旧的。
小结
1. 任何对象都是在组织工作区中诞生和被修改;
2. 任何修改都是从进入index区才开始被版本控制;
3. 只有把修改提交到邻近地区库房,该修改才能在库房中留下痕迹;
4. 与协作者分享邻近地区的修改,可以把它们push到远距库房来共享。
上面这幅图更加直接阐述了四个区域之间的关系,可能有些指示不太清楚,没关系,下部分会详细介绍。
常见Git指示
网上找了个图,别人整理的一张图,很全很好,借来用下。上面详细解释许多常见指示。
HEAD
在掌控具体指示前,先认知下HEAD。
HEAD,它始终指向现阶段所处组成部分的新一代的提交点。你所处的组成部分变化了,或者产生了新的提交点,HEAD就会跟着改变。
add
add相关指示很单纯,主要就实现将组织工作区修改的内容提交到甲类,交由git管理。
commit
commit相关指示也很单纯,主要就实现将甲类的内容提交到邻近地区库房,并使得现阶段组成部分的HEAD向后移动两个提交点。
branch
涉及到协作,自然会涉及到组成部分,关于组成部分,大概有展示组成部分,切换组成部分,创建组成部分,删除组成部分这四种操作方式。
关于组成部分的操作方式虽然比较多,但都比较单纯好记。
merge
merge指示把不同的组成部分合并出来。如上图,在实际开放中,他们可能从master组成部分中切出两个组成部分,然后展开合作开发完成需求,中间经过R3,R4,R5的commit记录,最后合作开发完成需要合入master中,这便加进了merge。
一般在merge之后,会出现conflict,需要特别针对冲突情况,手动解除冲突。主要就是因为两个用户修改了同一文件的同一块区域。如下图所示,需要手动解除。
rebase
rebase又称为衍合,是合并的另外一种选择。
在开始阶段,他们处于new组成部分上,执行git rebase dev,那么new组成部分上新的commit都在master组成部分上重演一遍,最后checkout切换回到new组成部分。这一点与merge是一样的,合并前后所处的组成部分并没有改变。git rebase dev,通俗的解释是new组成部分想站在dev的肩膀上继续下去。rebase也需要手动解决冲突。
rebase与merge的区别
现在他们有这样的两个组成部分,test和master,提交如下:
1. D—E test
2. /
3. A—B—C—F master
在master执行git merge test,然后会得到如下结果:
1. D——–E
2. /
3. A—B—C—F—-G test, master
在master执行git rebase test,然后得到如下结果:
1. A—B—D—E—C—F test, master
可以看见,merge操作方式会生成两个新的节点,之前的提交分开显示。而rebase操作方式不会生成新的节点,是将两个组成部分融合成一个线性的提交。
如果你想要两个干净的,没有merge commit的线性历史树,那么你应该选择git rebase 如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge
reset
reset指示把现阶段组成部分指向另两个位置,并且相应的变动组织工作区和甲类。
revert
git revert用两个新提交来消除两个历史提交所做的任何修改。
revert与reset的区别
git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
在回滚这一操作方式上看,效果差不多。但在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少冲突。但git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,那些被回滚的commit应该还会被引入,产生很多冲突。关于这一点,不太认知的可以看这篇该文。
git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
push
上传邻近地区库房组成部分到远距库房组成部分,实现同步。
其他指示
分享程序员重视的技术、求职、学习、成长与生活