本文介绍的是git最简易的版本控制(可能是人类历史上最简易的教程),并且充分利用vscode的源代码管理功能。
若要实现更多的git功能,请参照git教程:https://git-scm.com/book/zh/v2/
前言
当开发一个团队项目时,往往会遇到以下的问题:
我该如何得到其他成员对代码的改动
我该如何与另一个成员同时开发一个文件
我对代码作出了改动,我如何把代码分发给其他成员
如果某一次发布出了问题,我该如何将版本倒退回之前的某一个阶段
以上问题的解决办法,是使用版本控制系统,版本控制系统正是为解决以上问题而出现的。
目前,市面上的版本控制系统有很多,它们大致分为两大阵营:
SVN:所有的版本信息、开发者信息、代码全部交由服务器管理。团队成员的本地文件和服务器文件进行同步。它的风险在于服务器一旦毁坏,版本库的所有信息会完全丢失。
git:目前最流行的版本管理系统,使用分布式的方式进行版本控制,团队中的每个成员都拥有完整的版本库,任何一台计算机失效,都无法导致工作丢失。
本文使用git作为版本控制系统。
git的官方网站就是大名鼎鼎的github,但由于其服务器位于国外,可能会遇到网络传输的问题。好在国内有很多基于git原理实现的版本服务器,我们可以在其中选择一个使用。
本文选择使用码云作为版本控制服务器。
1. 建立远程仓库
码云仓库被称之为中国的github,和github一样,它是一个基于git的版本控制系统,
1. 注册账号
进入码云官网:https://gitee.com/,注册一个账号,然后登录。
注册完成后,会提示绑定手机号,该步骤可以忽略:
2. 创建仓库
根据提示,创建一个远程仓库,通常,一个项目对应一个远程仓库。
到目前为止,你已经在远程服务器上创建了一个项目仓库,接下来,你需要在本地安装git,并在本地建立仓库,最后实现本地仓库和远程仓库的同步。
2. 创建本地仓库
1. 安装
双击安装文件,一路默认即可完成安装。
2. 配置
每个安装了git的计算机可以看作是一个项目的开发者,首先,你需要配置你的名字和邮箱,以便让你的团队知道你是谁。
打开控制台,运行以下命令:
git config --global user.name "你的名字" git config --global user.name "你的邮箱"
3. 克隆远程仓库到本地
现在,我们的本地计算机上拥有了git,就可以建立本地仓库了。
本地仓库可以直接使用
git init
命令创建,也可以将远程仓库克隆下来,形成本地仓库。这里,我们选择后一种方式。
请按照下面的步骤完成:
找一个文件夹,在命令行中进入该文件夹,之后,我们将从远程克隆仓库到在该文件夹中。
比如,我现在选择d:\pj作为克隆远程仓库的文件夹,在命令行进入该文件夹后,我可以使用下面的命令完成对远程库的克隆:
git clone https://gitee.com/277739025/maoyan.git
命令中的
https://gitee.com/277739025/maoyan.git
需要替换为你码云上的仓库地址。
如果没有意外,你将看到你的文件夹中多了一个子文件夹,它就是你的工程目录。
接下来,你可以在vscode中打开该文件夹,进行本地项目的开发了。
你会看到文件夹中包含了两个文件:.gitignore和LICENSE,这两个文件暂时不用管它。
现在,我们用express生成器来生成一个工程:
express --no-view
4. 使用VSCODE管理本地仓库
现在,你会发现你的工程跟之前的有点小区别,每个文件后面多了一个符号或者小圆点:
这是什么情况呢?
这是因为该文件夹中的文件处于git版本控制当中,但要注意的是,这种版本控制,与你的远程仓库无关,仅仅是在本地仓库中控制。(还记得之前所说的吗?git是分布式的,每台计算机中的每个仓库,都是一个完整的版本控制系统)
要完成版本控制的各种操作,需要使用各种繁琐的git命令去完成。
好在VSCODE编辑器很智能,它已经将很多常用的简易操作可视化了,因此,我们只需要在VSCODE中动动鼠标即可完成各种操作。
接下来,我们来学习如何使用VSCODE完成版本控制。
提交修改
当我们在工程中作出以下操作时,git均认为是一种修改:
修改文件内容
添加文件
删除文件
注意:一个空的文件夹是不会被版本记录的,版本记录的只有文件!
当修改发生后,我们可以将这些修改一并提交给git,git会将它们记录到仓库中(你可以理解为仓库中新增了一个版本)
实际的过程是要先将修改提交到暂存区,然后将暂存区中的内容再提交到仓库,这样做有诸多好处,但为了简化流程,我们选择直接提交。
点击VSCODE左侧的源代码管理选项:
可以看到,目前有很多修改需要等待你提交,你可以现在提交,也可以等到将来更多的修改完成后再提交。
我们现在就开始提交,一定要注意,现在提交到的是本地仓库,而不是远程。
点击顶部的提交按钮,一次性提交所有修改:
此时,会弹出提交消息,必须要填写!取一个适当的名称来标识这一个版本,输入完成后按下回车即可。
提交结束后,你会看到源代码管理面板中清空了,表示目前没有任何修改需要提交(因为之前的修改已经被记录下来了)
现在,我们再建立一个model文件夹,然后在文件夹中创建一个db.js
现在,我们对工程做一些改动,比如,删除掉默认的静态文件、删除掉默认的routes,修改以下app.js。
你会看到左侧的版本管理器又有了新消息,它在提示你:现在有一些更改需要等待提交:
你可以不用管它,继续你的工作,之后一并提交,也可以现在立即提交。
通常情况下,我们完成一个小功能点后才会进行一次提交,比如:一个函数的实现、一个页面、一个css等等。
不过为了测试,我们现在再提交一次。
查看历史提交记录
目前,我们本地仓库中应该包含了3次版本记录,它们分别是:
从远程克隆并创建工程
用express生成器初始化了工程
删除了一些默认文件
我们可以在控制台中使用命令来查看提交历史:
git log --pretty=oneline
结果为:
最新的提交版本在最上方,每个版本都对应一个hash字符串,用来唯一的标识该版本,你可以把它当作是版本编号。
你也可以用
git log
命令,查看每次提交更加详细的信息
它额外显示了作者和时间,这样你就能够清楚的知道提交的时间和作者是谁了。
版本回退
有的时候,由于某些原因,我们需要将当前版本回退到之前的某一个版本。
使用下面的命令,将版本回退到之前的某个版本:
git reset --hard 版本的hash码
还记得版本的hash码吗?它是用来唯一的标识版本的,你可以用
git log
来查看每个版本的hash码,你不需要写全,一般写前5位就可以了,git会自动帮你补全,例如:
git reset --hard b41b
现在看看,工作目录是不是已经回退到之前的版本了。
现在,再使用
git log
来查看版本,你会发现之前的最新版本已经没有了。
版本前进
如果你在回退后,又想立即前进到之前的最新版本,只要你还记得最新版本的hash值,就可以做到
这里要特别注意,如果你回退后又有新的版本提交,可能你永远也无法找到之前的最新版本了。
使用的命名依旧:
git reset --hard b41b
忽略文件或文件夹
工程中有些东西我们是不希望进行版本控制的,比如node_modules文件夹或一些用户本地测试的文件。
如何通知git不要取跟踪它们的变化呢?
方法是在工程根目录下建立一个.gitignore文件,该文件中记录了哪些文件或文件夹不要被跟踪。
这个文件其实我们已经有了,在里面找找看,看能否找到node_modules文件夹?
现在,使用cnpm install命令安装各种包,这个操作会导致生成node_modules文件夹。
cnpm install
我们可以看到该文件夹是暗色的,表示没有被git跟踪。
3. 本地-远程同步
同步分为拉取和推送:
拉取:从远程仓库中获取最新的版本,如果其他同事发布了一些新的代码,你的开发又需要用到这些代码,你要使用该操作。
推送:将本地仓库中的版本发布到远程仓库,如果你的开发到了一个阶段,完成了一个重要功能,并且通过了测试,你需要用到该操作。
推送
现在,我们把目前的工程推送到远程,其实,推送就是一个同步仓库的操作:
打开VSCODE的源代码管理,点击更多中的推送:
此时,会弹出对话框,让你输入码云的账号和密码,输入即可。
现在到你的码云仓库中刷新页面,就可以看到新的版本了。
目前,服务器的版本和本地的版本就保持了同步:
现在,我们在工程中加入一个新的文件student.js
然后分别:
提交到本地仓库
推送到远程仓库
完成后,到码云仓库可以看到新的版本,目前本地和服务器版本如下:
拉取
准备工作
现在,为了模拟团队协作,你需要找到一个小伙伴,安利他也去注册一个码云账号(当然,你可以用精神分裂的方式自己模拟小伙伴,并且注册一个新的账号)
注册完成后,你的小伙伴并没有你的工程,需要让他克隆一个(克隆操作还记得吗?)
克隆完成后,你的小伙伴只能在本地仓库中控制版本,并不能将其推送到你的远程仓库,如果人人都可以这样做,你的代码一定被搞的乱七八糟了。
所以,你现在需要将他的权限提升为开发者。
将你的邀请链接分享给他,他接受后,就可以推送他的代码到你的远程仓库了。
现在,请他添加一个course.js文件
然后:
提交版本
推送
拉取
再回到你的工程,你工程的版本已经落后于服务器了
现在,你应该从远程仓库拉取最新的版本
在VSCode的源代码管理器中,点击拉取即可。
拉取完成后,你就可以在工程目录中找到course.js了
版本冲突
现在,考虑一个经常遇到的问题。
比如,你先在本地仓库中修改并提交了student.js文件
此时,你的小伙伴修改了course.js,他提交了版本,并且做了推送。
此时,服务器、你、小伙伴的版本状态如下:
仔细观察,你会发现,你本地仓库的最新版本,和远程仓库的最新版本出现了冲突。
此时,你无论作出推送操作、还是作出拉取操作,都会出问题。
我们以推送为例,看如何解决冲突。
在VSCode中点击推送
弹出一个错误:
这个错误明确告诉你,你现在不能推送,否则版本无法统一。你必须要先使用拉取解决冲突后,才能推送。
好吧,我们先拉取
在VSCode中点击拉取
拉取之后,仓库版本如下:
为什么最后会多一个merge呢?那是因为从服务器拉取了hello后,由于你本地多了一个版本(学生路由get请求),而这个版本服务器是没有的,于是,需要将两个版本的操作进行合并,成为一个新的版本merge,来表示最新版本。
在VSCode中再次点击推送
推送成功!
现在版本如下:
总之:推送的时候发生失败,往往是版本不一致,需要先拉取后再推送
接下来,另一个问题,你的小伙伴那里还没有student.js的新内容,他如果也对student.js进行了修改会怎么样呢?
让你的小伙伴修改student.js,然后提交到本地仓库
然后让你的小伙伴进行推送,当然,会报错,会让他先拉取
拉取后,他会发现远程的student.js和自己写的student.js不一样了,VSCode会给出提示,让他去解决这个冲突。
解决后,再进行推送即可。
总结
当团队进行开发时,按照以下纪律进行:
每天打开项目后,拉取最新
完成一个函数、页面、或一段复杂功能代码后,提交本地仓库
完成一个重要功能,并测试无误后,推送
推送失败时,往往是因为版本冲突导致的,拉取最新
拉取时,可能有文件内容上的冲突,解决冲突即可。
领取专属 10元无门槛券
私享最新 技术干货