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

一些常用的Git知识点

时间:2023-03-12 02:47:28 科技观察

1。Git基本概念repositoryconfiginitclonefetchpullcommitpushbranchheadtagmergeconflictdifflogshowstatus2.Git工作区和文件状态(1)。工作区左边是工作区,右边是版本库。WorkingDirectory就是在电脑上可以看到的目录,比如learngit文件夹就是一个工作区。仓库(Repository)工作区有一个隐藏目录.git,它是Git的仓库。版本库中标记为index的区域为暂存区,标记为master的区域为Git自动为我们创建的第一个分支,代表目录树。这时候HEAD其实就是一个指向master分支的“游标”,所以图中命令中出现HEAD的地方可以换成master。图中objects标识的区域就是git的对象库,实际上位于.git/objects目录下。当对工作区内修改(或新增)的文件执行gitadd命令时,会更新暂存区的目录树,写入工作区内修改(或新增)文件的内容向其中一个对象库中新建对象,对象的id记录在暂存区的文件索引中。当执行提交操作gitcommit时,会将暂存区的目录树写入版本库(对象库),master分支也会随之更新,即master指向的最新目录树为提交时原暂存区的目录树。当执行gitresetHEAD命令时,暂存区的目录树会被master分支指向的目录树改写替换,但工作区不受影响。当执行gitrm--cached命令时,会直接从暂存区删除文件,不会改变工作区。当gitcheckout时。或执行gitcheckout--命令,将使用暂存区中的所有文件或指定文件替换工作区中的文件。这个操作是危险的,会清除工作区中还没有添加到暂存区的变化。当gitcheckoutHEAD时。或者执行gitcheckoutHEAD命令,HEAD指向的master分支中的全部或部分文件将被用来替换暂存区和工作区中的文件。这个命令也是极其危险的。因为不仅工作区中未提交的更改会被清除,暂存区中未提交的更改也会被清除。(1).文件状态Git有三种状态,您的文件可能处于其中一种状态:提交、修改和暂存。3.git配置系统级,全局,当前仓库用户名,邮箱命令系统级,全局,当前仓库选项为:仓库-system,-global,-local(或者默认留空)gitconfig--globaluser.name”JerryMouse"gitconfig--globaluser.email"jerry@yiibai.com"列出Git设置gitconfig--listgitconfig-l4。gitfetch和pullgitfetch的区别:相当于从远程获取最新版本到本地,不会自动合并。gitpull:相当于从远程拉取最新版本,合并到本地。(1).Gitfetch示例:Gitfetchooriginmastergitlog-pmaster..origin/mastergitmergeorigin/master上面命令的含义:首先从远程origin版本下载最新的master分支到origin/master分支,然后比较本地master分支和origin/master分支,最后合并上面的过程其实可以通过下面更清晰的方式进行:(1).gitpull示例:gitpulloriginmaster上面的命令实际上相当于gitfetch和gitmerge。在实际使用中,gitfetch更安全,因为在merge之前,我们可以检查更新状态,然后再决定是否合并。5、gitreset和revert的区别gitrevert是用一个新的commit回滚之前的commit,而gitreset是直接删除指定的commit。在回滚操作方面,效果类似。但是以后继续合并旧版本的时候就不一样了。因为gitrevert是用reversecommit来“中和”之前的commit,所以以后合并老分支的时候,这部分的变化就不会再出现了,而gitreset是删除某个分支上的一些commit,所以当再次与旧分支合并时,这些回滚的提交仍然应该被引入。gitreset是将HEAD后移,gitrevert是将HEAD前移,但是新commit的内容刚好和要revert的内容相反,可以抵消要revert的内容。gitrevert和gitreset之间最大的区别是gitrevert只是撤消提交。另外说一下gitrevert,gitreset–hard和–softgitreset–mixedid:的区别是改变了git的HEAD(也就是commit记录变了),但是文件没有变,(也就是说,工作树并没有变化)。gitreset–softid:其实在gitreset–mixedid之后,又做了一次gitadd。gitreset–herdid:就是把git的HEAD改了,文件也改了。6、Gitmerge和reabse的异同Merge是合并的意思,rebase是重新设置base的意思,相同点是用来合并分支。不同点:合并操作生成一个新的节点,之前的提交单独显示。rebase操作不会产生新的节点,而是将两个分支合并成一个线性提交。解决冲突时。当合并操作遇到冲突时,当前合并无法继续。手动修改冲突内容后,添加修改并提交。rebase操作会中断rebase,会提示解决冲突。解决冲突后修改add后执行gitrebase--continue继续运行,或者gitrebase--skip忽略冲突。gitpull和gitpull--rebase的区别:gitpull做了两个操作,即“获取”和“合并”。所以添加rebase就是用rebase的方式合并分支,默认是merge。总结:选择merge还是rebase?merge是合并操作,将两个分支的更改合并在一起。默认情况下,会提交合并中修改的内容。merge的commithistory忠实记录了实际发生的事情,重点是真正的commithistoryRebase不进行merge操作,只是提取当前分支的修改,复制到目标分支的最新commit中。rebase的提交历史反映了项目过程中发生的事情。重点是开发过程。Merge和rebase都是非常强大的分支整合命令,没有优劣之分,具体使用哪一个要根据项目和团队的开发需求来决定。merge和rebase有很多强大的选项,可以使用githelp查看7.什么是Gitstash?其相关使用命令gitstash:备份当前工作空间的内容,从最近一次提交中读取相关内容,确保工作空间与上一次提交的内容一致。同时将当前工作区内容保存到Git栈中。gitstashpop:从Git栈中读取上次保存的内容,并恢复工作区中的相关内容。由于Stash的内容可能有多个,所以使用栈来管理,pop会从最近的stash中读取并恢复内容。gitstashpop--indexstash@{0}:恢复0号进度的工作区和暂存区。gitstashapplystash@{1}取出你指定版本号为stash@{1的工作}gitstashdrop[]删除某个进度,默认删除最新的进度gitstashlist:显示Git堆栈中的所有备份,你可以通过这个列表来决定从哪里恢复。gitstashclear:清除Git堆栈。这时候使用gitg等图形化工具会发现原来stash的哪些节点消失了#恢复工作进度gitstashpop[--index][]--index参数:不仅恢复了工作区,还恢复暂存区指定恢复特定进度。如果没有这个参数,默认恢复最新进度#这是gitstash保存进度的完整命令形式gitstash[savemessage][-k|--no-keep-index][--patch]-k和--no-keep-index指定保存进度后,是否重置暂存区--patch会显示工作区和HEAD的差异,通过编辑差异排除不需要保存的内容文件。类似gitadd-p命令,使用save给进度添加注释#gitstashsave"Thisisthesavedprogress"8.Git只从暂存区删除,从工作区删除的命令有哪些?gitrm--cachedgitrmgitcommit9。gitlabel使用#列出已有标签gittag#Tagtaggittag-av1.01-m"Relaseversion1.01"#查看对应标签的版本信息gitshowv1.4-a选项,创建一个标签,注释类型为-m选项,指定对应标签说明9、Git分支的使用#查看本地分支gitbranch#查看远程分支gitbranch-r#创建本地分支(注意创建后新分支不会自动切换到当前分支)gitbranch[name]#切换分支gitcheckout[name]#创建新分支并立即切换到新分支gitcheckout-b[name]#强制删除一个分支gitbranch-D[name]#合并分支(将名为[name]的分支与当前分支合并)gitmerge[name]#查看每个分支的最后一次提交信息gitbr-v#查看已经合并到当前分支的分支gitbr--merged#查看还没有合并到当前分支的分支gitbr--no-merged10.介绍Git冲突处理经验,以及merge和rebase中我们和他们的区别。我们和他们的merge和rebase的定义完全相反。合并时,ours指的是当前分支,theirs代表需要合并的分支。在变基过程中,ours指向修改后的参考分支,而theirs指向当前分支。因为rebase隐含了一个gitcheckoutupstream过程,将HEAD从本地分支更改为上游分支。rebase结束后Git会撤销这个改变,但是这不可避免地影响了冲突的状态,使得rebase中的ours和theirs的定义与merge相反。所以在使用我们的和他们的时请小心。11.Git远程操作相关(一)。clonegitclone<存储库的URL>gitclone<存储库的URL><本地目录名称>#clonejQuery存储库gitclonehttps://github.com/jquery/jquery.gitclone-ojQueryhttps://github.com/jquery/jquery.git(2).remote#列出所有远程主机gitremote#使用-v选项,可以参考远程主机的URLgitremote-v#可以查看主机的详细信息gitremoteshow#addremotehostgitremoteadd#deleteremotehostgitremoterm#modifyremotehostnamegitremoterename(3).fetch#retrieveall更新分支(branch)到本地gitfetch#获取特定分支的更新gitfetch#获取origin主机master分支的更新gitfetchoriginmaster#获取到的更新,在本地主机上以“远程主机名/分支名”的形式读取。比如origin主机的master必须用origin/master来读取。可以使用gitmerge命令或者gitrebase命令将远程分支gitmergeorigin/mastergitrebaseorigin/master合并到本地分支。pullgitpull:#获取originhost的下一个分支,与本地master分支合并gitpulloriginnext:master#如果远程分支与当前分支合并,则冒号后面的部分可以省略。gitpulloriginnext#上面的命令本质上相当于先做gitfetch,再做gitmerge。gitfetchorigingitmergeorigin/next#Merge需要rebase模式gitpull--rebase<远程主机名><远程分支名>:<本地分支名>(5)。pushgitpush:>注意:分支推送顺序写成“:”,所以gitpull就是“:”,而gitpush是“:>”。如果省略远程分支名称,则表示本地分支将被推送到与其有“跟踪关系”的远程分支(通常两者重名)。如果远程分支不存在,则会创建它。如果省略本地分支名称,则表示删除指定的远程分支,因为这相当于将一个空的本地分支推送到远程分支。#将本地master分支推送到源主机的master分支。如果后者不存在,它将被新创建。gitpushoriginmaster#省略本地分支,下面相当于删掉origin主机的master分支。所有分支都可以省略gitpushorigin#如果当前分支只有一个跟踪分支,那么主机名可以省略。gitpush#如果当前分支与多个主机有跟踪关系,可以使用-u选项指定一个默认主机,这样以后可以不带任何参数使用gitpushgitpush-uoriginmaster#不管是否有对应的远程分支,所有本地分支都被推送到远程主机gitpush--allorigin#Forcepushgitpush--forceorigin#gitpush不会推送标签(tags),除非使用--tags选项gitpushorigin--tags12。GitFlow使用介绍就像代码需要代码规范一样,代码管理也需要一个清晰的流程和规范。三个广泛使用的工作流:Git流程Github流程Gitlab流程三个工作流程有一个共同点:它们都使用“特性驱动开发”(简称FDD)。意思是需求是开发的起点,先有需求,再有特性分支或hotfix分支。开发完成后,将分支合并到主分支,然后删除。Gitflow是最早诞生并被广泛采用的工作流之一。它有两个主要特点。首先,项目有两个长期分支,即:主分支master和开发分支develop。其次,项目中存在三个短期分支,分别是:feature分支、hotfix分支、release分支。一旦开发完成,它们将被合并到develop或master中,然后被删除。(1).GitFlow流程图(二)。GitFlow常用的分支是Production分支。也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的Release,这个分支只能从其他分支合并过来,不能直接在这个分支修改。发展支线。这个分支是我们的主开发分支,包含所有要发布到下一个Release的代码。这个分支主要是和其他分支合并,比如Feature分支。功能分支。这个分支主要用来开发一个新的功能。开发完成后,我们合并回Develop分支,进入下一个Release。发布分支。当你需要发布一个新的Release时,我们在Develop分支的基础上创建一个Release分支。Release完成后,我们将其合并到Master和Develop分支中。修补程序分支。当我们在生产中发现新的错误时,我们需要创建一个修补程序。完成Hotfix后,我们再合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release。(3).GitFlow代码示例创建开发分支gitbranchdevelopgitpush-uorigindevelopb。开始新功能开发gitcheckout-bsome-featuredevelop#Optionally,pushbranchtoorigin:gitpush-uoriginsome-feature#Makesomechangesffsome-featuregitpushorigindevelopgitbranch-dsome-feature#Ifyoupushedbranchtoorigin:gitpushorigin--deletesome-featured.beginRelasegitcheckout-brelease-0.1.0develop#Optional:Bumpversionnumber,commit#Preparerrelease,commite.doneReleasegitcheckoutmastergitmerge--no-ffrele1-ffrelease-0.1.0gitpushgitbranch-drelease-0.1.0#Ifyoupushedbranchtoorigin:gitpushorigin--deleterrelease-0.1.0gittag-av0.1.0mastergitpush--tagsf.startHotfixgitcheckout-bhotfix-0.1.1masterg.finishHotfixgitcheckout-masterffgitmerge--no.1gitpushgitcheckoutdevelopgitmerge--no-ffhotfix-0.1.1gitpushgitbranch-dhotfix-0.1.1gittag-av0。1.1掌握gitpush--tags