Node.js 笔记
个人理解可能存在偏差,仅为参考文档;一切以官方文档为准。
1|0概述
1|1什么是Node.JS
Node.JS是一种JS解释器,这种解释器是在服务端运行的,它的作用是:使JS在服务端运行。从而实现JS前后端开发。
Node.JS基于V8引擎。
1|2JS与Node.JS
1)JS运行在浏览器,存在多款浏览器,有代码兼容性问题;Node.JS运行在服务端,只有一种解释器,不存在代码兼容性问题。
2)都有共同的内置对象、自定义对象,不同的宿主对象。
3)JS用于开发浏览器端交互效果,Node.JS用于服务器端开发,例如操作数据库、调用其它服务器
1|3Node.JS文档
文档 (非官方,个人或组织翻译)
1|4运行模式
1)脚本模式
控制台:
node 文件路径
2)交互模式
控制台:
node
进入,两次ctrl + C
或者输入.exit
退出
1|5全局污染问题
变量或函数的全局检测
Nodejs全局大对象叫global,所有和Node有关系的内容都挂载到这个对象下,而原生JS是window
在浏览器端控制台中,检测全局的关键字是
window
在NodeJS控制台中,检测全局的关键字是
global
在浏览器端,JS存在着全局污染问题
而在Node.JS脚本模式下,每个脚本文件都不是全局的,也就不存在这种全局污染问题
在Node.js交互模式下的变量就是全局的
2|0控制台
console
是控制台对象,用于输出到控制台
该对象为全局对象,在使用的时候无需引入模块
2|1计时
console.time(提示字符);
console.timeEnd(提示字符);
开始和结束的提示字符要一致
3|0进程
用于查看服务器端的进程信息
process.arch
查看CPU架构
process.platform
查看服务器的操作系统
process.pid
查看服务器Node.js的PID
process.version
查看服务器Node.js版本号
process.kill(进程PID)
结束指定PID
nextTick()定时器
nextTick(回调函数)
process.nextTick()
函数的优先级比setImmediate()
的优先级高
4|0缓冲区
所谓缓冲区,也就是内存中一块区域,用于临时存储数据。
Buffer
缓冲、缓存
空间单位为字节,每个字符占1字节,一个汉字占3字节
4|1将指定数据存入Buffer
当数据内容比Buffer空间大时,溢出部分将不能保存
Buffer.alloc(空间大小,目标数据);
4|2将Buffer转为字符串
.toString()
5|0引入模块
引入模块是指引入哪些非全局的模块
像console
、timer
等这种内置的全局模块没必要引入。
NodeJS中引入模块使用require()
方法。
引入模块有两种形式:
以路径开头
不以路径开头
5|1以路径开头
所谓以路径开头文件形式导入,就是导入的路径加上./
或../
开头的形式
在以文件形式导入时,.js
后缀也可以省略
以路径开头又有两种形式
文件形式
目录形式
文件形式导入
require(模块文件路径);
注意:省略.js
后缀的这种引入方式,一定要确保有该文件名的JS文件,
否则这种方式会当作目录形式导入
目录形式导入
承接上面的,如果12model.js
文件不存在,程序就会以目录形式去找寻12model
文件夹。
然后先在该目录寻找一个叫package.json
的JSON对象文件,并在该文件中读取"main"
指定的文件名;
如果没有package.json
这个文件,则会再去找一个叫index.js
的文件。
package.json
文件其实就相当于说明书(在开发中作为项目说明文件)就去找index.js
文件
注意:package.json
中只能有"main"
一个属性指定文件,不能够指定多个文件
5|2不以路径开头
所谓不以路径开头,也就是导入时开头没有使用./
或../
同样的,不以路径开头也分文件形式和目录形式
文件形式导入
用于引入官方提供的核心模块
如querystring
模块等
目录形式导入
这种方法导入,会先在当前目录下寻找一个叫node_modules
的目录,再在里面寻找指定文件;如果当前目录下没有node_modules
目录,则再往上级目录寻找node_modules
,如果没有再上一级......
5|3暴露对象(导出对象)
当模块引入成功后,得到的是暴露对象
暴露的对象默认是一个空对象,如果要暴露哪些内容,只需要将其添加到这个对象即可
可以暴露属性、方法、对象、数组
也可以
上面这种用大括号包起来的,实际是利用了对象进行包装;当如果暴露的内容只有一项,应该直接把暴露内容赋值给module.exports
5|4使用暴露对象
使用require()
方法使用暴露的对象
5|5获取路径
获取当前目录路径
Directory
__dirname
获取当前文件路径
File
__filename
6|0JSON文件
JSON文件里只有两种数据:一种是对象、一种是数组,属性名、值的字符串必须使用双引号""进行包裹,而不可使用单引号
7|0包和npm
包(package):指的是第三方模块,需要下载安装才能使用
npm:用于管理包的工具,例如:下载安装、上传、更新、卸载...
npm在Nodejs安装时已经附带安装
查看npm版本
CommonJS是一套模块化规范,NodeJS的引入、暴露都会基于这个模块规范。
7|1npm换源
由于npm默认镜像源是在国外的,有时可能会出现无法访问或者访问慢的情况,因此可换成国内源
查看镜像地址:
换源:
如:
7|2npm命令
初始化包信息,生成项目描述文件,会记录当前的包
当迁移项目的时候,只需要传这个项目描述文件,迁移的电脑再根据这个描述文件自动下载即可
下载安装包
下载package.js中记录的包到本地
卸载包
8|0字符串查询模块
8|1查询字符串
是客户端向服务器传递参数的一种方式,每一组传递的值分为参数名和参数值两部分
在网页地址中经常见
参数名1=参数值1&参数名2=参数值2
querystring
为字符串查询模块,安全等级3,由于功能单一,目前已弃用
8|2获取字符串的值
获取字符串的值需要先将字符串转成对象,然后再通过访问对象的属性来获取值
使用.parse(字符串)
将字符串转换成对象
8|3对象转成字符串
.stringify(对象)
将对象格式化为查询字符串
9|0URL模块
URL:统一资源定位(网址),互联网上任何资源都有对应的url,用来访问资源。
大多数服务器端口使用的是443
上面这个地址中,协议是http:// 域名/ip地址是www.codeboy.com 端口是9999 资源(文件)的路径是1.html 查询字符串是lid=1 锚点链接是one
9|1URL转对象
使用new URL()
将URL地址转换成对象
通过对象点属性可以访问到各个参数
9|2获取查询字符串部分
10|0定时器
Nodejs定时器有4种,常用两种
无论哪种定时器都是放在任务队列中执行的
定时器模块Timer
该对象为全局对象,在使用的时候无需引入模块
定时器其实也是异步的
10|1一次性定时器
设置定时器
setTimeout(回调函数,延时毫秒);
也就是延时多少毫秒做某件事
清除定时器
clearTimeout(定时器变量)
10|2周期性定时器
设置定时器
setInterval(回调函数,间隔时间)
清除定时器
clearInterval(定时器变量)
10|3立即执行定时器
setImmediate(回调函数)
setImmediate()
函数的优先级比process.nextTick()
的优先级低
同样的,清除用clearImmediate()
函数即可。
10|4定时器的执行机制
第二个参数是要等待的毫秒数,而不是要执行代码的确切时间。JavaScript 是单线程的,所以每次只能执行一段代码。为了调度不同代码的执行,JavaScript 维护了一个任务队列。其中的任务会按照添加到队列的先后顺序执行。setTimeout()的第二个参数只是告诉 JavaScript引擎在指定的毫秒数过后把任务添加到这个队列。如果队列是空的,则会立即执行该代码。如果队列不是空的,则代码必须等待前面的任务执行完才能执行。
------《JS高级程序设计》的描述
上面这个End会当程序等待3秒的时候输出
也就是说一次定时器还是周期定时器都是不阻塞主线程的,在主程序执行到把定时器的时候,继续执行主程序,而定时器部分会在等待够定时的时间后将定时器任务放入任务队列
中,任务队列
每放入一个任务执行一个。
10|5利用定时器计时弹出
一次定时器
周期定时器
10|6秒杀计时器
11|0文件系统模块
文件模块fs
包含文件形式和目录形式
文件模块属于Nodejs独有,所以使用文件模块需要先导入fs
模块
11|1获取文件状态
同步方法
.statSync(文件或文件夹路径)
该方法是同步的,因此会发生阻塞。
注意:当同步方法发生报错时,后续程序将不再执行。
也就是,比如文件夹过大时,计算文件夹大小要耗很长时间,由于该方法是同步的,会阻塞后面代码的执行。
只有同步的方式才使用变量将结果保存,异步方式是不使用变量进行保存的
异步方法
不阻塞主线程的执行。
异步方法第二参数都是回调函数。
.stat(文件或文件夹路径,回调函数)
线程池
由于js是单线程执行的,Nodejs的解决方法是主程序在运行时,执行到异步的操作,会将其放入线程池中,然后继续主程序的执行,线程中的异步执行完的结果是一个回调函数,异步把这个结果放入事件队列,主程序执行到最后,再执行事件队列的结果;所谓线程池,也就是除主线程以外的线程,在需要的时候就去借用一个线程,该借用的线程为独立的线程。
在回调函数中抛异常
也就是实现在回调函数中抛出可能产生的错误
只要在回调函数中传入一个参数即可
.stat(文件或文件夹路径,(错误参数)=>{处理})
.stat(文件或文件夹路径,(错误参数,无错误参数)=>{处理})
11|2是否为文件
.isFile()
11|3是否为目录
.isDirectory()
11|4创建目录
当创建的目录存在时会报错
同步方法
注意:当同步方法发生报错时,后续程序将不再执行。
fs.mkdirSync(目录)
异步方法
fs.mkdir(目录,回调函数)
11|5移除空目录
注意:该方法是空目录,移除非空目录会报错
当移除的目录不存在时会报错
同步方法
注意:当同步方法发生报错时,后续程序将不再执行。
fs.rmdirSync(目录)
异步方法
fs.rmdir(目录,回调函数)
11|6读取目录
同步方法
fs.readdirSync(目录)
异步方法
fs.readdir(目录,回调函数)
11|7写入文件
写入的文件为文本文件。
当文件不存在会进行创建再写入,存在则覆盖。
同步方法
fs.writeFileSync(文件路径,内容)
异步方法
fs.writeFile(文件路径,内容,回调函数)
11|8追加写入文件
同步方法
.appedFileSync(文件名,内容)
异步方法
.appedFile(文件名,内容,回调函数)
11|9读取文件
读取到的是buffer数据,利用toString()
转成字符串即可
同步方法
readFileSync(文件名)
异步方法
readFile(文件名,回调函数)
11|10复制文件
同步方法
fs.copyFileSync(原文件名,复制后文件名)
异步方法
fs.copyFile(原文件名,复制后文件名,回调函数)
11|11删除文件
同步方法
unlinkSync(文件路径)
异步方法
unlink(文件路径,回调函数)
11|12文件是否存在
fs.existsSync(文件名)
11|13文件流
所谓文件流,就是将文件指以流的形式(分段)读写,在读写的时候要创建buffer。
流的形式是异步的。
读取流
创建读取流.createReadStream(文件路径)
事件监听
在读取的过程中还可以使用以下两个事件进行监听以获取一些信息
数据流入监听事件
.on('data',回调函数)
(data字符串是固定的)读取结束监听事件
.on('end',回调函数)
(end字符串是固定的)
实际读取过程中以上两个事件仅是可选的部分。
写入流
创建写入流.createWriteSteam(文件路径)
通过流复制文件
使用读取流的.pipe(写入流)
方法
pipe()
就是管道
12|0HTTP模块
可以用来创建WEB服务器,为客户端提供资源(数据、html、css...)
12|1HTTP协议
超文本传输协议,浏览器(客户端)与WEB服务器间的一种通信协议。
浏览器发出请求(Request),服务器响应(Response)。
协议包含三部分:
General(通用头信息)
Response Headers(响应头信息)
Request Headers(请求头信息)
通用头信息
Request URL:请求的URL,要请求的服务器上的资源
Request Method:请求的方法,对以上资源的操作方式(增删改查)
Status Code:状态代码
100系列接收到请求但未结束
200系列 成功的响应
300系列响应的重定向 也就是发生跳转
400系列的都是客户端请求的错误
500系列服务器端错误
状态码详细参考一文读懂所有HTTP状态码含义
304
:表示向服务器所请求的资源,浏览器本地已经缓存有一份,浏览器会直接取用本地缓存的资源,当服务器资源发生改变的时候才会再次请求。
响应头信息
Location:要跳转的URL
Content-Type:响应的内容类型,解决中文乱码
text/html; charset=utf8
请求头信息
12|2创建WEB服务器
http协议模块需要先引入。
以下为大致步骤:
1.引入模块
2.使用
.createServer()
方法创建服务器3.使用
.listen(端口号,回调函数)
设置端口进行监听
请求监听事件
通过事件监听是否有请求,一旦有请求自动执行回调函数。
回调函数中,第一个是请求的对象,第二个是响应的对象
响应
设置响应头信息
跳转
请求
浏览器在访问服务器之初,默认访问的是/
浏览器端请求不同资源,都会在url后写上具体名称,是以/
开头的,如
12|3原生的异常捕获
此捕获是针对于原生的HTTP模块
服务器应该对每一个错误都进行处理
因此在.createServer()
的时候应该利用回调进行捕获异常
而捕获有两种形式:一种是同步捕获、一种是异步捕获
同步方法
try...catch
异步方法
1)使用Promise().catch()
的方式捕获
2)使用try...catch
时利用await/async
捕获异步异常
13|0express框架
一个基于Node.js平台,快速、开放、极简的第三方WEB开发框架
除此之外还有koa、阿里的egg等
express框架官方文档:官网(expressjs.com.cn)
使用前需要在shell中使用npm下载,然后引用模块
13|1创建服务器
该框架将请求用路由来处理
路由
URL到函数的映射。浏览器向服务器发起请求,服务器会根据请求url做出响应。
路由包含三部分,请求的URL、请求的方法、回调函数。
如果有相同的路由,则只有第一个起作用
发送消息
.send(内容)
在一个路由中.send()方法只能执行一次,如果send()
之后还有要执行的将发生错误:Error [ERR_HTTP_HEADERS_SENT]:Cannot set headers after they are sent to the client,
为了避免这种错误,应该在一定条件send()
之后return
防止往下执行。
跳转
.redirect(跳转页面)
发送文件
.sendFile(文件绝对路径)
注意:是绝对路径,不可以使用相对路径。
如果想简短写,可以联合前面的关键字获取路径
修改响应信息头部
.header('Content-Type','text/html;charset=UTF-8');
URL中的传参
get传参
从浏览器直接输入url访问,就是get请求
这种情况,要获取上面url中keyword的参数值
使用.query
方法获取到该参数对象,再通过对象.方法就能获取该参数名的值
注意:.query
方法只适用此情况
由于get传参这种url是暴露的,一般账号密码等安全等级高(敏感)信息不适用这种方式。
路由传参
路由传参是指url中对参数名进行了隐藏,像下面这样
这种情况,可以先在路由的请求部分指定参数名
再通过req参数的.params
获取到该参数对象,再使用对象点属性来获取值
如果需要多个参数传值,则继续使用/
隔开即可
POST传参
POST请求:需要通过HTML表单发起的请求
POST传递是以流的形式,URL不可见,用于传递大的文件或数据
因为是流的形式,
老旧的写法(已淘汰):所有获取信息可以通过on()
事件来获取
常用写法
常用的写法是使用:请求内容解析 .body
如:
注意:这个.on()
事件是异步的,所以不可在回调外边获取,上面的执行顺序是主线程先.send()
再执行.on()
异步的回调。
所以如果要拿到异步结果,上面应该改成
13|2中间件
简化和隔离基础设施与业务逻辑之间的细节,让开发者更关注业务,提高开发效率
拦截对WEB服务器的请求
可用于作验证身份验证等
也就是请求前被拦截,做一定处理再决定是否继续进行。比如验证是否是管理员身份、商品打折扣等。
共分为5级:
应用级中间件
路由级中间件
内置中间件
第三方中间件
错误处理中间件
中间件使用.use()
方法
应用级中间件
也称为自定义中间件,一旦拦截到请求,就自动调用一个函数。
也就是当访问该资源时,服务器会先拦截请求,执行某个函数,该函数再决定是否继续。
.use(拦截的请求资源URL,拦截后要调的函数)
其中这个要调的函数也有三个参数,分别为:请求,响应,是否继续
路由级中间件
.use(要拦截的URL,路由器)
路由器
在团队协作开发的过程中,如果都往一个里去写,肯定会出现路由混乱的情况,因此就有了路由器。
路由器是用来管理路由,最终路由器被WEB服务器使用。
说白了就是将一系列路由单独放在一个文件中进行管理,避免出现路由重复的混乱情况。
路由器的使用
路由器的使用也就是路由级中间件
1.路由器文件创建
大致步骤:
引入
express
模块使用
.Router()
方法创建路由器使用路由器的
.get()
方法创建路由暴露出去
举例:user.js (用户的路由器模块文件)
2.导入路由器文件
大致步骤:
引入
express
模块创建服务器
引入该暴露的路由器模块
并使用
.use(前缀,引入的路由器模块)
方法引入路由器文件的路由
使用.use()
方法,该方法的这个前缀参数非必须要写(可以省略),添加前缀只是为了区别不同资源而添加的。
比如用户商品都有/list的路由,为了不混乱,加个前缀user,访问的时候就需要/user/list,访问商品就是/product/list
举例:app.js (服务器文件)
404拦截
.use()
方法省略请求资源的参数,只写回调函数即可
注意:404请求的拦截,要把这个路由放在最后面,否则所有都会先被404拦截掉
内置中间件
由于庞大的服务器资源是数不胜数的,不可能每一个资源都去写一个路由,因此对于静态的资源部分,可以使用静态资源托管的方式。
静态资源:包括html,css,js,图形,视频,声音...
托管静态资源
客户端请求静态资源,不需要通过路由响应,而是自动查找资源
.static()
方法
步骤:
创建一个公开的资源目录,里面放有静态的资源文件
使用express框架的
.static(托管的目录路径)
方法指定这个公开的静态资源目录再使用express框架的
.use()
方法设置该目录
请求内容解析
将POST传递的参数转为对象
由于POST是以流的形式传递的,因此获取POST数据需要通过事件进行获取,而获取到的信息又是查询字符串形式,因此,还需要再通过querystring模块的.parse()方法将其转成对象方可使用,过于复杂。
以上是以前的写法,过时了
而在express框架中,只需要express.urlencoded({ extended: false})
指定用原生的querystring还是扩展的第三方模块转换对象。
true
是用第三方qs模块进行处理请求参数,false
是使用内部queryString内置模块处理请求参数。
然后路由中使用.body
获取到对象。
这个.urlencoded( extended: false )
是针对POST请求来的,因为前端页面POST请求的数据要遵循HTTP规定,会对英文和标准符号以外的特殊字符(如:中文)或符号进行编码,服务器需要对其进行解码,.urlencoded( extended: false )
就是告诉服务器使用扩展的模块方法进行解析还是用原生的querystring
。
压缩
除此之外还有很多中间件,参考:
Express 4.x - API Reference - Express 中文文档 | Express 中文网 (expressjs.com.cn)
错误处理中间件
也就是一旦发生错误,将执行指定的中间件,使用next(错误)
14|0nodemon模块
前面我们每次修改服务器文件都需要手动将服务器文件进行停止,再开启。
而使用nodemon就可以帮助我们自动管理这个文件,保存即可自动重新启动服务器
nodemon是第三方工具,使用前需要先用npm安装
然后再通过nodemon 服务器文件路径
15|0mysql模块
需要先使用npm下载安装
15|1创建连接
有两种创建连接方式:
创建连接对象,单独使用连接
创建连接池对象,使用连接池连接
一般使用创建连接池对象这种方式
创建连接对象
创建连接池对象
创建连接对象的方式去连接数据库,在访问量庞大时,开销也会很大;比如在大量的并发访问时,假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。因此就有了连接池的概念。
连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。
简单说就是,连接池就好比生活中的共享单车群,从A地到B地,不需要每个人都买一辆单车,扫个码就能骑,骑到目的地关锁后;别人再扫码也能使用这辆共享单车。连接池的连接也如此,使用完成会归还到连接池中,供再次使用。
如果不进行connectionLimit
设置连接限制,默认连接限制是15个。
一般中小型项目15个连接足够。
因为连接池中的连接只有往数据库中执行命令的时候才会连接;因此创建连接池的方式不需要进行连接测试是否成功
执行SQL命令
MySQL模块的SQL操作,都使用.query(SQL命令字符串,回调函数)
该方法是异步的
查询语句,成功返回的结果(回调函数的result参数)是一个查询的结果
插入语句,成功返回的结果(回调函数的result参数)是一个插入数据信息的对象
注意:这里的SQL语句不需要加;
SQL语句的拼接
SQL注入
所谓SQL注入攻击:就是往SQL命令加入新的命令,会破坏已有SQL命令
例如:
因此
防注入
也就是在查询语句中先用一个占位符占位,等待被替换。
当遇到有攻击性的语句时则会被过滤掉
在MySQL模块中的步骤为:
SQL命令语句中使用
?
作为占位符。使用
.query(SQL命令语句,占位符替换的数组,回调函数)
方法
插入数据
在MySQL模块中,有以下简便写法(该方法仅为MySQL模块提供的简便写法,并非原生的SQL语句):
判断是否成功
可以通过其affectedRows
属性进行判断,0是没有删除,大于0是已删除
删除数据
删除数据时,当删除的数据不存在时,并不会执行删除
因此删除数据时应该进行判断是否删除成功
在mysql模块中删除数据,成功返回的结果是一个删除信息描述的对象
判断是否成功
可以通过其affectedRows
属性进行判断,0是没有删除,大于0是已删除
16|0接口
所谓前后端交互就是指后端给前端的请求响应回来的API(接口),前端再进行渲染。
接口:后端为前端提供的动态资源。
接口有很多种风格很多种规范,其中最流行的是RESful接口。
查看请求后端响应的数据:浏览器开发者模式----网络----Fetch和XHR----响应
接口的五部分:接口地址、返回格式、请求方式、请求示例、接口备注。
我们写的路由其实就是接口
16|1RESTful接口
REST:表述性状态转移
RESTful接口:分布式超媒体架构风格接口
接口地址
上面这种URL是RESTful风格的推荐形式:
使用路由传参的方式
先写版本号
再写资源名称(名称建议是复数,名称不能使用动词)
如果资源的操作在URL中不足以说明,可以继续加一些名词进行描述
因此,之前的路由访问方式都是不推荐的,应该如下
请求方式
对资源的操作方式,分为增删改查
get 获取资源
post 新建资源(插入数据)
put 修改资源
delete 删除资源
过滤数据
使用get传递过滤数据
返回结果
格式为JSON;JSON是一种字符串对象,里边通常是数组或者对象。
其中包含
状态码 code
消息 msg
数据 data
16|2API测试工具
当后端写好了接口,我们需要测试接口通常借助HTML来进行调试,但是接口很多的时候这并不方便,因此可以使用APIPost来进行。
ApiPost:是一款类似Postman可以对网页调试,模拟发送网页HTTP/HTTPS请求的工具。通常我们可以用来很方便的模拟get、post或者其他方式的请求来调试接口。
也就是这个工具是给前端拿来测试后端的端口的。
POST
使用POST时,APIPost的参数传值必须是Body
,而不能是Header
要使用application/x-www-form-urlencoded
PUT
如果PUT路由URL中参数间使用的是&
符号,而不是/
;则,APIPost测试的URL参数间也要使用&
17|0正则表达式
正则表达式验证的是字符串格式,不是固定死字符串内容。
在JS中,正则表达式使用有两种形式
字面量
构造函数
所谓字面量就是直接使用斜杠/
包裹正则表达式。
构造函数则是new RegExp(字符串)
17|1正则表达式的API
.test()
检测是否符合规则(布尔)
.replace()
查找符合规则的字符并使用字符串替换
17|2数字范围
[开始数字-结束数字]
单个数字的匹配范围
[0-9]
可以直接使用\d
17|3字符出现次数
{次数}
量词,用于修饰字符出现的次数
17|4位置匹配
^
指定该字符必须出现在开头的位置
$
指定该字符必须出现在结尾的位置
17|5搜索替换
关键词|
指定匹配文本中出现该关键词
/g
全局查找,匹配文本中所有的
/i
忽略大小写
18|0Git
查看git版本
18|1VCS系统
VSC系统(版本控制系统),用于项目中存储、共享、合并、历史回退、代码追踪等功能
2000年之前,使用的是CVS;2010年之前使用SVN;2010年之后使用的是Git
18|2Git中常见的概念
工作目录:是一个目录,用于保存项目中所有的文件
暂存区:是内存中的一块区域,用于临时保存文件的修改
Git仓库:是一个特殊的目录,保存项目所有的文件以及每次的修改记录
18|3使用Git命令管理项目
在项目目录下右键----Git Bash Here 命令行操作(Git GUI Here:图形化操作,Git Bash Here:命令行操作)
1)(首次安装后)第一次使用Git前,告诉Git系统你是谁
要修改用户名或邮箱,重新执行这语句即可
2)创建Git仓库来管理当前的项目
3)查看当前Git系统的状态
提示:On branch master nothing to commit, working tree clean
表示仓库中所有文件已经提交了,没有需要单独管理的文件
4)将文件添加到暂存区
如:
添加后可通过git status
查看状态
如果需要提交多个文件:
提交全部改变的文件:
注意:删除的文件也算改变,也会被提交
5)将暂存区所有的文件提交到Git仓库
这里的提交说明
是备注
如:
6)查看Git仓库中所有的提交日志
注意:当回退到某一版本时,使用了清屏操作后,git log
将查询不到之前的该回退之后的提交日志。
这时可以使用
git reflog
查询所有的提交日志
7)忽略文件
也就是有些文件或目录不需要提交到仓库,可以设置忽略
在更目录创建一个名为.gitignore
的文件,然后在里面写需要忽略的文件或目录
如:
忽略pic目录和tao.txt文件。.gitignore
内写:
注意:.gitignore
文件也需要上传到仓库中
平时需要忽略的文件有:node_modules
8)历史回退
先用git log
查询到提交的ID,然后再使用即可
如:
9)分支
从主线中分离出来,不影响其它线程的开发,从而实现并行开发
Git下默认只有一个分支master
①创建新的分支
查看所有的分支
②切换分支
切换分支前最好先使用git status
确保当前工作环境是干净的,避免出现管理错误
③在该分支上做该模块的开发(add提交,commit标注。。等)
④合并分支
也就是当所有开发完成之后会进行分支项目合并
注意:需要在主分支下进行
当两个进行合并的时候会出现冲突,只需要将冲突的东西去掉即可
如:index.html
只需要将<<<<<<< HEAD
、=======
、>>>>>>> product
去掉
然后,再次git
上传即可
10)删除分支
删除已合并的分支
强制删除分支(无论是否合并)
18|4远程仓库
代码托管平台GitHub、Gitee、Gitlab等
使用远程仓库
①先创建远程仓库
②使用git push 远程仓库地址 分支名称
命令推送到远程仓库
如:
③输入gitee或者github的账号密码
删除Windows记录的账号
控制面板 -> 凭据管理器 -> Windows凭据,找到凭据删除即可
在项目中添加成员
gitee项目页 -> 管理 -> 仓库成员管理 -> 开发者 -> 邀请成员
克隆远程代码到本地
如:
拉取到本地仓库(有仓库)
拉取建立在使用过克隆远程代码到本地之后
如:
18|5常用命令
清屏
退出
__EOF__

本文链接:https://www.cnblogs.com/myotsuki/p/16773402.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本