当前位置: 首页 > 科技观察

教你打通Git的人毒二麦

时间:2023-03-17 12:36:11 科技观察

本文转载自微信公众号《狼王编程》,作者狼王。转载本文请联系狼王编程公众号。大家好,我是狼王,一个爱玩的程序员。这篇文章主要是让我们了解一下Git。这个分布式版本控制系统在日常工作中经常会用到Git操作。但是对于很多人来说,刚上来的时候对Git是很陌生的,操作起来也很迷茫。本文主要针对刚开始接触Git,了解Git基本原理,掌握一些常用命令的新手。关于版本控制什么是版本控制?我真的需要它吗?版本控制是一个记录多个文件内容变化的系统,以便您将来可以参考特定版本的修订。什么是分布式版本控制系统分布式版本控制系统(DistributedVersionControlSystem,简称DVCS)。在Git、Mercurial、Bazaar和Darcs等系统中,客户端不仅提取最新版本的文件快照,而且完整地镜像原始代码存储库。这样,如果任何一个用于协同工作的服务器发生故障,之后可以用任意一个本地镜像仓库进行恢复。因为每一次抽取操作其实都是对代码仓库的一次完整备份。此外,许多这些系统可以指定与几个不同的远程代码存储库交互。通过这种方式,您可以在同一项目中与不同工作组的人员进行协作。您可以根据需要设置不同的协作流程,例如分层模型工作流程,这在以前的集中式系统中是不可能的。一、Git工作流程上面包含了一些简单常用的命令,暂时先不管这些,先了解一下下面四个专有名词。Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库工作区是指PC上可以看到的管理仓库的目录,比如我的测试文件夹就是一个工作区:如下图:暂存区.git目录下的索引文件,暂存区会记录gitadd添加的文件的相关信息(文件名,大小,时间戳...),并且文件实体将不会被保存。通过id指向每个文件实体。您可以使用gitstatus查看暂存区的状态。暂存区标记了当前工作区中的哪些内容由git管理。当你完成某个需求或功能,需要提交到远程仓库时,第一步是通过gitadd提交到暂存区,由git管理。本地仓库保存的是已经提交的对象的版本,比工作区和暂存区的内容要旧。gitcommit后将index的目录树同步到本地仓库,方便下一步通过gitpush同步本地仓库和远程仓库。远程仓库远程仓库的内容可能会被本地仓库以分布在多个地点的协作关系修改,所以可能会也可能不会与本地仓库同步,??但它的内容是最旧的。总结任何对象都是在工作空间中诞生和修改的;从进入索引区域开始,任何修改都是受版本控制的;只有当修改提交到本地仓库时,修改才能在仓库中留下痕迹;与合作者共享本地修改可以推送到远程仓库进行共享。下图更直接地说明了四个区域之间的关系。有些命令可能不清楚,但没关系。下一部分将详细介绍它们。2.常用的Git命令在网上找了一张图,别人整理的一张图,很全很好,借用一下。下面详细解释一些常用命令。HEAD在掌握具体命令之前,先了解一下HEAD。这要从git的分支说起。git中的分支实际上只是一个指向提交对象的变量指针。git是如何知道你当前在哪个分支上工作的?答案其实很简单,它持有一个特殊的指针,叫做HEAD。在git中,它是指向您正在处理的本地分支的指针,将HEAD视为当前分支的别名。addadd相关的命令非常简单。主要实现将工作区的修改内容提交到暂存区,交给git管理。混帐添加。将当前目录下的所有文件添加到暂存区gitadddir将指定目录添加到暂存区,包括子目录gitaddfile将指定文件添加到暂存区gitadd-A和gitadd。和gitadd-u的区别gitadd-A:提交索引库的所有修改,包括当前git仓库的所有目录gitadd-u:提交修改(modified)和删除(deleted)的文件,不包括新文件(new)gitadd.:该操作与git的版本有关:-1.x版本:提交新文件(new)和修改(modified)文件,不包括删除(deleted)文件-2.x版本:同gitadd-A、提交所有修改commitgitcommit主要是将暂存区的修改提交到本地仓库。我们每次使用gitcommit命令,都会在本地版本库中生成一个40位的哈希值。这个散列值也称为commit-id。commit-id在版本回滚时非常有用。相当于一个快照,以后可以通过结合命令和gitreset随时回到这里。gitcommit-mmessage将暂存区提交到本地仓库,message代表说明信息。gitcommitfile-mmessage将暂存区的指定文件提交到本地仓库gitcommit--amend-mmessage用新的commit替换上一次的commitbranch涉及协作,自然涉及分支。关于分支,大概有四种操作:显示分支、切换分支、创建分支、删除分支。.gitbranch列出所有本地分支gitbranch-r列出所有远程分支gitbranch-a列出所有本地分支和远程分支gitbranchbranch-name创建一个新分支,但仍然停留在当前分支gitcheckout-bbranch-name创建一个新的分支并切换到它gitbranch--trackbranchremote-branch新建一个分支并与指定的远程分支建立跟踪关系gitcheckoutbranch-name切换到指定的分支并更新工作空间gitbranch-dbranch-name删除分支gitpushorigin--deletebranch-name删除远程分支虽然对分支的操作??很多,但都比较简单,容易记忆。mergeGit的git-merge是Git中经常使用的命令。很多人认为gitmerging是一件很麻烦的事情。一不小心就会遇到丢码的问题,对git望而却步。merge命令将不同的分支合并在一起。如上图所示,在实际开通的时候,我们可能会从master分支切出一个分支,然后进行开发,完成需求。中间通过了R3、R4、R5的commit记录后,最后的开发需要合并到master中,使用merge。在gitfetchremotemerge之前,从远程仓库拉取最新的代码。gitmergebranch将指定分支合并到当前分支。一般合并后会出现冲突,需要针对冲突情况手动解决冲突。主要是两个用户修改了同一个文件的同一个区域。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,高手可以看到合并操作会生成一个新的节点,并且会显示之前的提交分别地。rebase操作不会产生新的节点,而是将两个分支合并成一个线性提交。如果你想要一个没有合并提交的干净、线性的历史树,那么你应该选择gitrebase如果你想保留完整的历史,并且想要避免重写提交历史的风险,你应该选择使用gitmergeresetsometimes,when我们使用Git,可能会commit提交代码,发现这次commit的内容是错误的,那么有两种处理方式:修改错误内容,重新commit,使用gitreset命令取消这次错误commitfirst这种方法比较直接,但是会多次提交记录。而我个人更喜欢第二种方法,不需要保留错误的commit。reset命令将当前分支指向另一个位置,并相应地更改工作区和暂存区。gitreset--softcommit只改变提交点,暂存区和工作目录的内容不变。gitreset--mixedcommit改变提交点,改变暂存区内容。将修改为与提交点完全一致的状态。gitreset--hardHEAD将工作区恢复到上次提交时的状态。revertgitrevert使用新的提交来消除历史提交所做的任何更改。revert和reset的区别gitrevert是用一个新的commit回滚之前的commit,而gitreset是直接删除指定的commit。在回滚操作方面,效果类似。但是以后继续合并旧版本的时候就不一样了。因为gitrevert使用反向提交来“中和”之前的提交,所以以后合并旧分支时,这部分改动不会再出现,减少冲突。但是gitreset删除了某个分支上的一些commit,所以再次和老分支合并的时候,这些回滚的commit还是要引入,导致很多冲突。关于这一点,如果你不明白,可以看这篇文章。gitreset是将HEAD后移,gitrevert是将HEAD前移,但是新commit的内容与要revert的内容正好相反,可以抵消要revert的内容。pushgitpush的一般形式是gitpush<远程主机名><本地分支名><远程分支名>,例如gitpushoriginmaster:refs/for/master,就是将本地的master分支推送到远程hostorigin对应master分支,origin为远程主机名gitpushremotebranch上传本地指定分支到远程仓库gitpushremote--force强制将当前分支推送到远程仓库,即使有冲突gitpushremote--all将所有分支推送到远程仓库other命令gitstatus显示更改的文件gitlog显示当前分支的版本历史gitdiff显示暂存区和工作区的差异gitdiffHEAD显示工作区与当前分支最新提交的区别gitcherry-pickcommit选择一个提交,合并到当前分支以上是一些常用的命令以及关于Gi的详细解释吨。相信可以对Git有一个初步的了解。