日常工作中经常会用到Git操作。但是对于新手来说,刚上来Git是很陌生的,操作起来也很迷茫。本文主要针对刚开始接触Git,了解Git基本原理,掌握一些常用命令的新手。一、Git工作流程上面包含了一些简单常用的命令,暂时先不管这些,先了解一下下面四个专有名词。Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:程序员在远程仓库工作区进行开发更改的地方,就是你当前看到的,也是最新的。通常我们的开发都是在远程仓库复制一个分支,基于这个分支进行开发。在开发过程中是对工作区的操作。对于暂存区.git目录下的索引文件,暂存区会记录gitadd添加的文件的相关信息(文件名,大小,时间戳...),不会保存文件实体,通过id指向每一个文件实体。您可以使用gitstatus查看暂存区的状态。暂存区标记了当前工作区中的哪些内容由git管理。当你完成某个需求或功能,需要提交到远程仓库时,第一步是通过gitadd提交到暂存区,由git管理。本地仓库保存的是已经提交的对象的版本,比工作区和暂存区的内容要旧。gitcommit后将index的目录树同步到本地仓库,方便下一步通过gitpush同步本地仓库和远程仓库。远程仓库远程仓库的内容可能会被本地仓库以分布在多个地点的协作关系修改,所以可能会也可能不会与本地仓库同步,??但它的内容是最旧的。总结任何对象都是在工作空间中诞生和修改的;任何修改只有进入索引区才受版本控制;只有将修改提交到本地仓库,修改才会在仓库中留下痕迹;分享给合作者本地修改可以推送到远程仓库进行分享。下图更直接地说明了四个区域之间的关系。有些命令可能不清楚,但没关系。下一部分将详细介绍它们。2.常用的Git命令在网上找了一张图,别人整理的一张图,很全很好,借用一下。下面详细解释一些常用命令。HEAD在掌握具体命令之前,先了解一下HEAD。HEAD,它总是指向当前分支的最新提交点。当你所在的分支发生变化,或者产生新的提交点时,HEAD会随之变化。addadd相关的命令非常简单。主要实现将工作区的修改内容提交到暂存区,交给git管理。commitcommit相关的命令也很简单,主要是将暂存区的内容提交到本地仓库,将当前分支的HEAD向后移动一个提交点。分支涉及协作,自然涉及分支。对于分支,有四种操作:显示分支、切换分支、创建分支和删除分支。对分支的操作??虽然很多,但都比较简单,容易记忆。mergemerge命令将不同的分支合并在一起。如上图所示,在实际开通的时候,我们可能会从master分支切出一个分支,然后进行开发,完成需求。中间有R3、R4、R5的commit记录后,最后的开发需要合并到master中。这用于合并。一般合并后会出现冲突,需要根据冲突情况手动解决冲突。主要是两个用户修改了同一个文件的同一个区域。如下图,需要手动释放。RebaseRebase,也称为rebase,是合并的另一种选择。初始阶段,我们在新分支上,执行gitrebasedev,然后新分支上的新提交会在master分支上重复,***checkout会切换回新分支。这个和merge一样,merge前后的分支没有变化。gitrebasedev,通俗的解释是新分支要继续站在dev的肩膀上。Rebase还需要手动解决冲突。rebase和merge的区别现在我们有两个这样的分支,test和master,提交如下:D---Etest/A---B---C---Fmaster在master上执行gitmergetest,然后你会得到如下结果:D--------E/\A---B---C---F----Gtest,master在master上执行gitrebasetest,然后得到如下结果:A---B---D---E---C'---F'test,master可以看到merge操作会生成一个新节点,之前的提交会被单独显示。rebase操作不会产生新的节点,而是将两个分支合并成一个线性提交。如果你想要一个没有合并提交的干净、线性的历史树,那么你应该选择gitrebase如果你想保留完整的历史并且想要避免重写提交历史的风险,你应该选择使用gitmergeresetreset命令来放置当前分支指向另一个位置,工作区和暂存区也随之改变。revertgitrevert删除历史提交和新提交所做的任何更改。revert和reset的区别gitrevert是用一个新的commit回滚之前的commit,而gitreset是直接删除指定的commit。在回滚操作方面,效果类似。但是以后继续合并旧版本的时候就不一样了。因为gitrevert使用反向提交来“中和”之前的提交,所以以后合并旧分支时,这部分改动不会再出现,减少冲突。但是gitreset删除了某个分支上的一些commit,所以再次和老分支合并的时候,这些回滚的commit还是要引入,导致很多冲突。gitreset是将HEAD后移,gitrevert是将HEAD前移,但是新commit的内容与要revert的内容正好相反,可以抵消要revert的内容。push将本地仓库分支上传到远程仓库分支,实现同步。其他命令以上是Git的一些常用命令和详细解释。相信可以对Git有一个初步的了解。
