你要对训练中开发的应用项目做源代码管理,在训练视频中介绍了具体的方法。要为项目添加一个远程仓库,开始一组训练前可能需要创建一个新的分支(branch),每完成一个任务你都要做一次提交(commit),提交信息必须设置成所完成的任务的名字。
完成当天的训练任务以后,把做的提交要推送(push)到项目的远程仓库的上面(下面会解释相关的概念与具体的方法)。我们会根据你在训练中推送到远程仓库上的代码来判断你是否正确地完成了所有的训练。
相关概念
源代码管理 / 版本控制
源代码管理(Source Control),有时候也叫版本控制(Version Control)。在开发应用的时候,需要对项目做源代码管理,源代码管理主要做的就是使用一些有效的方法,记录项目的每一次变化,现在最常用的源代码管理工具叫 Git,它是开发者的必备工具。
代码仓库(Repository)
对项目做源代码管理,首先要创建一个代码仓库(Repository)。就是初始化一个代码仓库,其实就是在项目的下面创建了一个叫 .git
的目录,里面放的是什么我们不需要担心,因为 Git 这个工具会帮我们去处理。
Repository ,有时简称为 Repo。这个词在不同的地方表示的东西不太一样,我们可以记住它的中文解释:仓库;贮藏室;存放处,总之 Repository 指的就是一个能放东西的地方。
远程仓库
项目在本地开发的时候用的代码仓库可以称为本地代码仓库,我们还可以在一些服务商那里为项目创建远程的代码仓库,比如 github.com 或 coding.net 都提供类似的服务。
有了远程仓库以后,项目的开发者们可以把他们在本地对项目做的修改推送(push)到这个远程仓库的上面,或者从这个远程仓库的上面拉取(pull)其他开发者对项目做的修改(commit)。
提交(Commit)
有了代码仓库以后,项目每一次有变化,比如添加了一个新的功能,修复了一次错误等等,都需要去保存一下,或者叫记录一下项目的变化,这个记录的动作叫 “提交”,英文是 Commit。在做提交之前先要添加要提交的东西,也就是项目的变化,这个变化可以是一个或多个文件,也可以是在一个或多个文件里修改的某几行代码。
Git 可以让你查看项目的每次提交都做了什么,是谁做的。做的每一次提交,存储的就是项目的一个特定的状态,你可以把项目切换或者恢复到任意一次特定的状态上。
Git 是个命令行工具,它提供的所有功能都可以在终端通过输入相应的命令完成。比如 git init
可以为项目初始化一个代码仓库,git add
可以添加要提交的修改,git commit
可以做提交。
在训练中使用的 VSCode 代码编辑器里,集成了源代码管理的功能,有很多动作都可以在这款编辑器上完成,也就是我们不必在命令行界面下通过执行相关的 Git 命令来完成。具体的用法参考:《VS Code:源代码管理》。
提交日志
每一次做提交的时候,可以提供一条日志信息,说明一下为什么做这次提交。以后通过 Git 命令(git log
),可以查看所有的提交日志,每条日志里面包含了提交的 ID 号、作者、日期还有提交信息。
提交日志示例:
commit 2cbb406495a32280f2b6afb0a4510a52b505c697 Author: wanghao8080 <117663444@qq.com> Date: Sun May 5 16:04:23 2019 +0800 存储上传文件相关数据
提交 ID
提交 ID 指的是一次提交的一个唯一的标识,也就是我们可以使用这个 ID 表示某一次具体的提交,在使用这次提交的时候需要提交对应的 ID 号。这个 ID 号挺长的,但一般我们只需要开始的一小部分就可以了。
在查看提交日志的时候,每条提交的 commit 后面的东西就是这次提交的 ID,比如:2cbb406495a32280f2b6afb0a4510a52b505c697
,你可以使用整个字符串表示这次提交,比如查看这次提交都修改了哪些东西,或者我们也可以使用开始的一小部分,比如 2cbb406495
,也可以表示这次提交。
分支(Branch)
对项目做了源代码管理之后,默认会有一个叫 master
的分支,就是主分支。平时的开发工作我们可以单独创建一个开发分支,比如 develop
,做到一定程度以后,比如应用准备要发布了,我们就可以让项目的 master
与 develop
合并一下。不管是 master
分支,自己创建的 develop
分支,或者创建的其它的分支,它们除了名字以外,并没有什么主要的区别。
在开发的时候,如果要为应用开发一个新的功能,想去实验一下某些想法,或者准备去修复一个应用的 bug,都可以在项目里创建新的分支。在这新的分支上,你可以修改应用,然后提交修改。完成了功能的开发,你可以切换到主分支或者开发分支上,再去合并一下在功能分支上做的提交。如果最终你发现在新分支上做的实验并不可行,你可以把这个扔掉这个分支,项目的其它分支不会受到影响。
.gitignore
在项目里有些东西是不需要做源代码管理的,这些文件与目录要在一个叫 .gitignore
的文件里列出。也就是如果项目里的文件或目录的名字在这个文件里出现了(或者它们的名字符合设置的某种特定的格式),Git 就不会理这些文件或目录。
相关命令
初始化项目仓库
只需要在项目所在目录的下面执行一次。
git init
查看当前状态
看一下当前都修改了项目里的哪些文件,有哪些文件已经添加到了待提交的状态。
git status
添加要提交的东西
你修改了项目里的几个地方,打算去做一次提交,你要先添加要提交的东西。
git add 要提交的东西
提交
确定要做提交了,执行的命令是:
git commit -m '说明一下为什么要做这次提交'
创建分支
要创建一个分支,同时把当前分支切换到新创建的这个分支。
git checkout -b 新分支的名字
切换当前分支
要把项目切换到某个特定的分支上。
git checkout 分支名
合并分支
比如要把在 request-response
这个分支上对项目做的提交(修改),合并到项目的 master
(主)分支上,可以先把当前分支切换到 master
分支,然后再去做合并的动作。
git checkout master git merge request-response
添加远程仓库
在 github.com 或 coding.net 上为项目创建了一个远程仓库,我们需要在本地执行一条添加远程仓库的命令,其实就是告诉本地仓库,要添加的远程仓库的名字是什么,对应的地址是什么。
git remote add origin 远程仓库地址
git remote add
就是添加远程仓库的命令,origin
是给即将要添加的远程仓库起的名字,你可以换成其它的名字,不过 origin
是个惯用的名字。远程仓库名字的后面要跟着对应的远程仓库的地址,你在 github.com 或 coding.net 上成功创建了远程仓库以后,它们都会告诉你这个远程仓库的地址是什么。
具体流程
创建本地代码仓库
在 request_response 训练中,一开始我们就会在命令行界面下去创建一个项目,这个项目默认已经初始化了一个代码仓库,也就是我们就不需要在项目所在目录的下面执行 git init
去初始化了。只需要给项目添加一个 .gitignore
文件,在里面列出需要在源代码管理里面忽略的东西,然后再去做一次初始化的提交。这些在训练视频中都有体现。
完成任务以后要做一次提交
如果在训练任务里修改了项目的代码,完成这个训练以后,你必须要对项目做一次提交,提交的东西就是在项目里有变化的文件。提交时输入的提交信息必须使用训练任务的名字。
示例:
比如在 request_response 这组训练中,有一个任务是:任务 4:控制器(Controllers),在这个任务里给项目添加了一个控制器,你完成了这个训练任务以后,要对项目做一次提交(commit)。可以通过 VSCode 的源代码管理功能完成提交,也可以在终端,执行相关的命令完成提交。
如果是输入命令做提交,可以打开终端,先进入到项目所在的目录,比如项目是在桌面上的 ninghao-nestjs
目录的下面:
cd ~/desktop/ninghao-nestjs
查看一下状态,主要就是看看都修改了项目的哪些文件:
git status
确定以后可以添加修改,如果要添加所有的修改,可以执行:
git add .
执行提交:
git commit -m '任务 4:控制器(Controllers)'
完成以后,查看一下提交日志:
git log
开始一组训练前创建一个新的分支
开始一组新的训练,一般 任务1 就是去 “准备项目”,主要做的就是基于上一组训练中做的最后一次提交,去创建一个新的分支,然后在这个新创建的分支上做当前这组训练需要的提交。
示例:
比如你刚刚完成了一组名为 authorization(权限控制) 的训练,做的最后一次提交是 “任务13:用权限控制守卫检查用户是否拥有指定资源”,这次提交的 ID 是 3f801c2
。即将要开始进行的训练是 file(文件上传),我们要基于 authorization
这个分支上做的最后这次提交创建一个叫 file
的分支。
流程大概像这样,先确定项目当前的分支:
git branch
确定是在 authorization
这个分支上,因为这是你前一天完成的一组训练创建的分支,然后检查在这个分支上做的提交:
git log
上一组训练完成最后一个任务以后做的提交是 “任务13:用权限控制守卫检查用户是否拥有指定资源”,提交的 ID 是 3f801c2
,然后可以在 master
分支上做一次合并:
git checkout master git merge authorization
合并之后再检查一下 master
分支上做的提交,最后一次提交应该就是你在 authorization
分支上做的最后一次提交,因为这两个分支合并在一起了,所以你在 master
分支上也会看到它合并的 authorization
分支上的提交。
可以复制一下最后这次提交的 ID,比如是:3f801c2
,基于它再去创建一个新的分支,同时也切换到新创建的这个分支上,执行:
git checkout -b file 3f801c2
完成当天的训练以后要把提交推送到项目的远程
首先你要给项目添加一个远程,具体方法在对应的训练任务视频中可以找到。这个远程仓库可以在 github.com 或 coding.net 上去创建,推荐使用 github.com,如果你无法创建 github.com 的帐号,可以在 coding.net 上创建一个帐号,然后去给项目创建一个远程,并把它添加到项目里面,方法都是一样的。
有了帐号以后,你要在 github.com 或 coding.net 上创建一个名为:ninghao-nestjs 的远程仓库,并且把这个远程仓库添加到项目上。
要注意的是,项目的远程仓库的地址,有两种形式,一种是 HTTPS ,一种是 SSH,下面是我在 github 里的 ninghao 这个帐号里面创建的名为 ninghao-nestjs
的远程仓库的地址。
HTTPS 类型的地址:
https://github.com/ninghao/ninghao-nestjs.git
SSH 类型的地址:
git@github.com:ninghao/ninghao-nestjs.git
如果你在添加远程仓库的时候用的是 HTTPS 类型的仓库地址,以后在往这个远程仓库推送提交的时候,需要输入你在 github 上的用户名与密码来验证一下身份。
如果用的是 SSH 类型的地址,推送的时候需要使用密钥的方式来验证你的身份,这种形式的远程仓库地址需要额外配置一下才能正常把提交推送上去。你需要在本地生成一对密钥,然后把公钥里的内容交给 github.com 或 coding.net,一般就是在个人帐号里配置一下 SSH 密钥。
附录
配置使用 SSH 类型地址的远程仓库
1、在本地生成一对密钥
macOS 用户打开终端,Windows 用户打开下载安装好的完整版的 Cmder,先确定一下你之前是否生成过密钥:
ls ~/.ssh
如果没有返回任何东西,说明还没有生成过密钥,如果你发现在 .ssh 目录的下面,已经有 id_rsa 与 id_rsa.pub 文件,说明之前已经生成过密钥,可以直接使用。
如果还没有生成过密钥,执行:
ssh-keygen
完成以后会生成一对密钥,放在 ~/.ssh 目录的下面,一个是 id_rsa 这是密钥,一个是 id_rsa.pub ,这个是基于密钥生成的一个公钥内容,这个文件里的内容你要把它放到你在 github.com 或 coding.net 申请的帐号的配置里面。
查看生成的公钥文件里的内容,执行:
cat ~/.ssh/id_rsa.pub
应该会输出类似下面这样的东西:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5axxpLJRwi1W2WrahdVuq7mA4RMPRKuq9DbWT3QrEzvNuUu0cPSgdzXsKk8gips6zJrm6GrREraimkbLDLnMS670LGBO6lrR8oKDTYfQD1m8t9q19eR1eLzSpG+O00iQB0eIcSVb9EzDaXuuZz0mgZK9T0kh6sCsFasAzT9w5rUhViv8HjnPc8y641zEUd8aWl87l53ikDJ6qmsVQe1R2JPs6YLvZcw+Q6MUPbB3wKZC4UOIDbvsstdvC8nj1SWExutQy5tp00zQVJygw8spO2Ea7t2TK+K1wWNecmRV8s0aQVOju2WCOpRjNP2wWZzJlupq02GFWSLvrKAt0Y0V3 xiaoxue@iMac.local
复制一下输出的文件内容。
2、配置 github.com / coding.net
用你申请的帐号登录到 github.com,打开帐号的 settings - SSH and GPG keys,点击 “New SSH Key”,把你之前复制的公钥文件里的内容粘贴到这里就行了。
登录到 coding.net,打开帐号的 个人设置 - SSH 公钥,点击 “新增公钥”,把复制的公钥内容粘贴到里面就可以了。
评论
浩哥能否出一套Node部署到服务器的完整教程,现在看哪些Node课程不知道怎么把应用部署到线上~
5 年 5 个月 以前
行啊,可以用 Docker。
5 年 5 个月 以前
期待皓哥一套完整的node部署方案教程,😁
5 年 5 个月 以前