当前位置: 首页 > 后端技术 > Node.js

Git实战指南

时间:2023-04-03 18:40:08 Node.js

亲自整理了一些常用的Git概念和命令合集,方便快速参考和快速解决某些场景下的问题,覆盖了日常开发和协同工作下的部分场景,不只是对Git的介绍命令行。欢迎关注语雀原文,持续更新!精简上手1.克隆仓库克隆的仓库会下载仓库的完整文件、分支和历史记录。gitclone[][--][

]#克隆完整的仓库到./git-learning目录gitclonegit@github.com:x-cold/git-learning.git#只clonedev分支到./dev目录gitclone-bdevgit@github.com:x-cold/git-learning.gitdev2,将文件变更记录写入本地索引库gitadd[][--]...#添加当前目录下的所有文件gitadd.#添加一些文件gitaddsrc/app/index.js3,将更改提交到工作区gitcommit[][--]...#最常见的提交gitcommit-m"feat:supportcanvas"#修改当前commitmessagegitcommit--amend#重置当前commitauthor和messagegitcommit--amend--reset-author4,推送代码到远程仓库gitpush[][[...]]#将本地仓库的当前分支提交到远程仓库的master分支gitpushoriginmaster#将本地仓库的dev分支提交到远程master分支gitpushoriginmaster:devchatdesignimage来自维基百科Git是一个分布式版本控制工具,所以远程和本地可以看成是两个独立的Git仓库。上图是对Git中数据流向和存储层次的经典介绍。存储层面主要包括几个部分:WorkingFiles,指的是我们一直在编辑的文件所在的目录。一般来说,我们修改的文件都在工作区反映出来的暂存区(Stage)中。暂存会在本地修改,然后提交到本地仓库(Local)和远程仓库(Remote)。不难看出整体的数据流向,就是一行:工作区->暂存区->本地仓库->远程仓库的双向数据流通道。常用命令gitinit创建一个空白的git仓库gitinitgitaddgitadd[][--]...gitcommitgitcommit[][--]...gitremoteremote指的是与本地git存储库相关联的远程git存储库。1、查看远程仓库信息gitremote2、查看远程仓库详细信息gitremote-v3、删除远程仓库gitremoteremove#删除名为origin的远程仓库gitremoteremoveorigin4、添加远程仓库gitremoteadd[-t<分支>][-m<主>][-f][--tags|--no-tags][--mirror=]gitremoteorigingit@github.com:x-cold/git-learning.gitgitbranch1,列出本地存在的分支gitbranch2,列出远程分支gitbranch-r3,列出本地和远程分支gitbranch-a4,创建本地分支gitbranch[branchName](remoteBranch)#在远程仓库的dev分支的基础上,创建本地的feature/canvas分支仓库gitbranchfeature/canvasdev5,重命名分支gitbranch[](-m|-M)[]#修改feature/canvas分支命名为feature/canvas2gitbranch-Mfeature/canvasfeature/canvas26,删除本地分支gitbranch-d|-D[branchName]7,删除远程分支gitbranch[][-r](-d|-D).#删除feature/canvas2分支gitbranch-dfeature/canvas28,set默认上游和分支gitbranch--set-upstream/#以后只需要在dev分支上执行gitpush(不带额外参数)可以提交到origin/devgitbranch--set-upstreamdevorigin/devgitcheckoutcheckoutbranch:gitcheckout[]#switchcurrentbranchtodevbranchgitcheckoutdev#创建一个基于当前分支的测试分支,并将当前分支切换到测试分支gitcheckout-btest除了用于分支切换之外,checkout还可以用于恢复还没有添加到本地工作空间但已修改**#将index.js恢复为当前提交的内容gitcheckoutindex.jsgitmergemergebranch:gitmerge[][...]#合并远程的master分支仓库到当前分支gitmergeorigin/mastergitrebasechangesBase是一个常见且有风险的操作,会改变提交历史,谨慎使用!gitrebasewhile(conflictexists){gitstatus找到当前冲突文件,编辑解决冲突gitadd-ugitrebase--continueif(gitrebase--abort)break;}gitcherry-pickmagic-level命令,cherry-pick可以提取N条commit记录并合并到稳定版的分支中。gitcherry-pick[]...#选择371c2单条提交记录并合并到当前分支gitcherry-pick371c2#取出371c2到971209的所有提交记录并合并到当前分支gitcherry-pick371c2...971209gitpush到远程仓库,将本地仓库的提交历史同步到远程仓库gitpush[][[...]]#提交当前本地仓库分支到远程仓库master分支gitpushoriginmaster#提交本地仓库dev分支到远程master分支gitpushoriginmaster:dev#提交单个taggitpushoriginpublish/1.0.0#提交alltaggitpushorigin--tagsgitpull拉取远程分支,将远程仓库的提交历史同步到本地仓库gitpull[][[...]]#一般来说,默认的拉取行为相当于gitfetch+gitmerge#下面这行命令相当于gitfetchoriginmaster&&gitmergeorigin/mastergitpulloriginmaster#代码也可以通过rebase来拉取,这样分支模型不容易受影响#下面的命令相当于gitfetchoriginmaster&&gitrebaseorigin/mastergitpull--rebaseoriginmastergittag1,创建taggittag-av1.1.0-m""2,查看taggittag3,push到远程gitpushorigin--tags4,删除本地taggittag-dv1.0.05,删除远程taggitpushorigin:refs/tags/v1.0.0。git仓库元数据每个git代码仓库目录都会有一个.git文件夹,里面包含以下重要文件:file/folder含义config*configurationfiledescriptiondescription,只针对GitWeb程序HEAD当前Checked-outbranchindex暂存区信息hooks/clientorserver-sidehookscripts(钩子脚本)信息/全局排除(globalexclude)文件,不想被记录在.gitignore文件中的忽略模式(ignoredpatterns)objects/alldata内容refs/data(branch)指向已提交对象的指针高级技巧修改提交历史使用gitrebase修改历史,假设修改了最新的3条历史,操作步骤如下:1.gitrebase-iHEAD~3run这个命令会提供一个列表ofcommits,如下所示,其中commit记录按时间倒序排列;pickf7f3f6dchangedmynameabitpick310154eupdatedREADMEformattingandaddedblamepicka5f4a0daddedcat-file#Rebase710f0f8..a5f4a0donto710f0f8##Commands:#p,pick=usecommit#e,edit=usecommit,但停止修改#s,squash=usecommit,butmeldintopreviouscommit##IfyouremovealinehereTHATCOMMITWILLBELOST.#然而,如果你删除所有内容,rebase将被中止。#2。编辑上面的list文件,在需要更改的commit之前把pick改为edit,如果需要压缩,可以设置为squash,保存退出,进入rebase过程;3、通过gitcommit--amend--author,依次修改history,继续rebase;添加指定文件gitls-files源/|grep'\.css$'|xargsgitadddeletesomefilesinallcommits#删除文件gitfilter-branch--force--index-filter'gitrm--cached--ignore-unmatch-rbuild'--prune-empty--tag-name-filtercat----all#触发GCgitreflogexpire--expire=now--all&&gitgc--prune=now--aggressivegitstash使用stash来临时存储工作区更改时,等待一些git操作(例如asmerge/rebase等),然后把这些改动放回工作区#暂存区,暂存区是一个栈结构,支持多个暂存Store,遵循gitstash的后进先出原则#回到工作区gitstashpop附录github,专为git学习之路设计的游戏awesome-git-addons,git命令行工具扩展集合git-tips,常用场景技巧集合lazygit,git命令lineprogramforlazypeople,otherusesissuecommentgitment,githubissuesocialcommentplugingittalk,githubissuesocialcommentplug-in,感觉好一点