版本控制系统
文件进行更新迭代时通过手动修改会遇到操作麻烦、命名不规范、容易丢失、协作困难等问题
版本控制系统是一个用来记录文件变化,以便查看特定版本的系统
由手动管理文件改为软件管理
使用版本控制软件的好处:
操作简便:只需记住几组简单的终端命令即可快速上手常见的版本控制软件
易于对比:可以对比前后版本的变化细节,而查找出问题
易于回溯:可以选定文件需要回溯到之前的某一个状态
不易丢失:误删的文件可以轻松恢复
协作方便:基于版本控制软件提供的分支功能,可以轻松实现多人协作开发
版本控制系统的分类
本地版本控制系统:
特点:使用软件来记录文件的不同版本,提高了工作效率,降低了手动维护版本的出错率
缺点:单机运行,不支持多人协作开发
版本数据库故障后,所有历史更新记录会丢失
集中化版本控制系统:
特点:基于服务器、客户端的运行模式
服务器保存文件的所有更新记录
客户端只保留最新的文件版本
优点:联网运行,支持多人协作开发
缺点:不支持离线提交版本更新
中心服务器崩溃后,所有人无法正常工作
版本数据库故障后,所有历史更新记录会丢失
典型代表:SVN
分布式版本控制系统:
特点:基于服务器、客户端的运行模式
服务器保存文件的所有更新记录
客户端是服务器的完整备份,并不是只保留最新的文件版本
优点:联网运行,支持多人协作开发
客户端断网后支持离线本地提交版本更新
服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
典型代表:Git
git基础
什么是Git
Git是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统
特点:项目越大,开发者越多,越能体现出Git的高性能和高可用性
Git之所以快速和高效是因为它直接记录快照,而非差异对比,几乎所有操作都是本地执行
差异比较
传统的版本控制系统(例如SVN)是基于差异的版本控制,存储的是一组基本文件和每一个文件随时间逐步积累的差异
好处:节省磁盘空间
缺点:耗时、效率低(因为每次切换版本时,都要在基本文件的基础上,逐步应用每一个版本直到生成最新版本)
Git的记录快照
是在原有文件版本的基础上重新生成一份新的文件,类似于备份,如果没有修改就只保留一个链接指向之前的存储文件
例如:一个项目有abc三个文件,修改了啊文件,a文件就重新生成并被份,而bc两个文件就保留一个链接即可
缺点:占用磁盘空间较大
优点:版本切换时非常快
特点:空间换时间
几乎操作都是在本地进行,大多数操作只需要访问本地文件和资源
Git中的三个区域:工作区、暂存区、Git仓库
Git中的三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
注:
工作区的文件被修改了,但还没有放到暂存区,就是已修改状态
如果文件已修改并放入暂存区,就属于已暂存状态
如果Git仓库中保存着特定版本的文件,就属于已提交状态
基本的Git工作流程如下:
1、在工作区中修改文件
2、将你想要下次提交的更改进行暂存
3、提交更新,找到暂存区的文件,将快照永久性存储到Git仓库
安装并配置Git
下载地址:Git - Downloads
配置用户信息
在桌面是单击鼠标右键,选择Git Bash Here
在弹出的界面中,输入以下代码去配置自己的用户信息
注:因为使用了--global(全局配置),那么该命令只需要运行一次就可以永久生效
通过以上代码配置的用户名和邮箱地址,会被写到c:/Users/用户名文件夹/.gitconfig文件中,用记事本打开即可查看到刚才输入的内容
使用命令快速查看Git的全局配置信息
查看所有的全局配置项
格式:git config --list --global
查看指定的全局配置项
格式:git config user.name / git config user.email
获取帮助信息
格式:git help<verb>
使用命令,就会弹出完整的git-<verb>消息的网页
使用 -h就可在终端获得更简明的“help”输出
格式:git <verb> -h
Git的基本操作
获取Git仓库的两种方式
1、将尚未进行版本控制的本地目录转换为Git仓库
2、从其它服务器克隆一个已存在的Git仓库
在现有的目录中初始化仓库
1、在项目目录中,通过鼠标右键打开“Git Bash”
2、执行git init命令将当前的目录转化为Git仓库
格式:git init
注:git init命令会创建一个名为.git的隐藏目录,这个.git目录就是当前项目的Git仓库,里面包含了初始的必要文件,这些文件是Git仓库的必要组成部分
工作区中的每一个文件可能有4种状态,这种状态分为两大类
未被Git管理:
未跟踪(untracked)--不被Git所管理的文件
已被Git管理:
未修改(unmodified)--工作区中文件的内容和Git仓库中文件的内容保持一致
已修改(modified)--工作区中文件的内容和Git仓库中文件的内容不一致
已暂存(staged)--工作区中被修改的文件已被放到暂存区,准备将修改后的文件保存到Git仓库
Git操作的终极结果就是让工作区中的文件都处于“未修改”的状态
查看文件处于什么状态
格式:git status
如果文件名出现在untracked files(未跟踪的文件)下面,则意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入
如果文件名在changes to be committled下面,说明已被跟踪并处于暂存状态
以精简的方式显示文件的状态
格式:git status --short(-s)
注:--short和-s是等价的可以进行平替
未跟踪的文件前面会有红色的??标记
新添加到暂存区的文件前面有绿色的A的标记
跟踪这个文件(即将文件添加到暂存区中)
格式:git add 文件名
这个命令有三个功效:
1、可以把它开始跟踪新文件
2、把已跟踪的、且已修改的文件放到暂存区
3、把有冲突的文件标记为已解决状态
提交暂存区文件
格式:git commit -m “ 提交内容的注释信息 ”
当有文件进入暂存区就可以使用git commit命令进行提交,其中-m选项后面是对本次的提交消息中的内容进行进一步的描述
跟踪文件被修改
当文件已经被Git跟踪,并且工作区和Git仓库中的文件内容保存一致,当我们修改了文件的内容再次运行git status命令,文件出现在changes not staged for commit下面,说明已跟踪的内容发生了变化,但还没有放入暂存区
使用-s查看,文件名前面会有一个红色的M标记
当我们将已跟踪、已修改的文件放到暂存区,使用git status -s查看该状态文件名前面会出现一个绿色的M标记
撤销对文件的修改
格式:git checked 文件名
指:把工作区中对应文件的修改,还原成Git仓库中所保存的版本
结果:所有的修改会丢失,且无法恢复
本质:用Git仓库中保存的文件,覆盖工作区中指定的文件
向暂存区中一次性添加多个文件
格式:git add .(这是一个英文点)
一次性将所有的新增和修改过的文件加入到暂存区
取消暂存的文件
从暂存区移除对应的文件
格式:git reset HEAD 文件名
从暂存区中移除所有的文件
格式: git reset HEAD .(这是一个英文点)
跳过暂存区
格式:git commit -a
提交时把所有已经跟踪过的文件暂存一并提交,跳过了git add步骤
从Git仓库中移除文件的方式:
从Git仓库和工作区中同时移除该文件
格式: git rm -f 文件名
删除后用git status -s查看状态,该文件名前面出现会绿色的D 标志
只从Git仓库中移除该文件,但保留工作区的该文件
格式: git rm --cached 文件名
删除后用 git status -s 查看状态,出现两个该文件名,一个前面有绿色的D标志,一个前面有红色的??标志,在次使用git commit -m“ ”提交后,使用git status -s查看状态,该文件名只有一个且前面有红色的??标志,说明该文件未被跟踪
忽略文件
当文件无需纳入Git管理,且不希望总出现在未跟踪文件列表时,我们可以创建一个名为 .gitignore的配置文件,列出忽略文件的匹配模式
文件.gitignore的格式规范:
1、以#开头的是注释
2、以/结尾的是目录
3、以/开头防止递归
4、以!开头表示取反
5、可以使用glob模式进行文件和文件夹的匹配
glob模式
glob指简化了的正则表达式:
1、星号* 匹配零个或多个任意字符
2、[abc]匹配任何一个列在方括号中的字符(匹配一个a或者匹配一个b或者匹配一个c)
3、问号?只匹配一个任意字符
4、短划线分隔两个字符表示在这两个字符范围内的都可以匹配(如[0-9]表示匹配所有0到9的数字)
5、两个星号**表示匹配任意中间目录(如a/星号星号/z可以匹配a/z、a/b/z、a/b/c/z等)
查看项目的提交历史
格式: git log
按时间先后顺序列出所有提交历史,最近的提交在最上面(倒序)
git log 使用 q 可以提前结束查看
只展示最新的两条提交历史,数字可以按需填写
格式:git log -2
在一行上展示最近两条提交历史的信息
格式: git log -2 --pretty=oneline
在一行上展示最近两条提交历史的信息,并自定义输出的格式
%h 提交的简写哈希值 %an作者名字 %ar作者修订日期,按多久以前的方式显示 %s提交说明
格式:git log -2 --pretty=format:“%h | %an | %ar | %s”
回退到指定的版本
先在一行上展示所有的提交历史,每一个提交历史前都有一个ID
格式: git log --pretty=oneline
根据指定的提交 ID 回退到指定版本
格式: git reset --hard ID
在旧版本中,查看命令操作的历史
格式: git reflog --pretty=oneline
再次根据最新的提交ID,跳转到最新版本
格式:git reset --hard<commitID>
开源
开源许可协议(Open Source License)
为了限制使用者的使用范围和保护作者的权力,每个开源项目都应该遵守开源许可协议
常见的5种开源许可协议:
BSD(Berkeley Software Distribution)
Apache Licence 2.0
GPL(GNU General Public License)
具有传染性的一种开源协议,不允许修改后和衍生的的代码作为闭源的商业软件发布和销售
使用GPL的最著名的软件项目是:Linux
LGPL(GNU Lesser General Public License)
MIT(Massachusetts Institute of Technology,MIT)
是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
使用MIT的软件项目有:jQuery、node.js
开源项目托管平台
免费存放开源项目源代码的网站,叫做开源项目托管平台。
目前世界上比较出名的有:
Github(全球最牛)
Gitlab(对代码私有性支持较好,企业用户较多)
Gitee(又叫码云,是国产的开源项目托管平台。访问速度快、纯中文界面、使用友好)
注:以上3个只能托管以Git管理的项目源代码
Github
前提需先注册用户,创建空白的远程仓库
远程仓库的两种访问方式(都需先创建本地仓库):
HTTPS
零配置;但是每次访问仓库时,都需要重复输入Github的账号和密码
第二次提交,只需输入 git push即可同步远程和本地仓库
SSH
需要进行额外的配置;但是配置成功后,每次访问就不需要输入Github账号和密码
注:实际开发中推荐使用SSH
SSH key
作用:实现本地仓库和Github之间免登录的加密数据传输
好处:免登录身份认证、数据加密传输
由两部分组成:
1、id_rsa(私钥文件,存放于客户端的电脑中即可)
2、id_rsa.pub(公钥文件,需要配置到Github中)
生成SSH Key
1、打开Git Bash
2、输入ssh-keygen -t rsa -b 4096 -C "注册Github账号时填写的邮箱"
3、连续敲击3次回车,即可在c:\user\用户名文件.ssh目录中生成id_rsa和id_rsa.pub两个文件
配置SSH key
1、使用记事本打开id_rsa.pub文件,复制里面的文本内容
2、登录Github,点击头像--Settings--SSH and GPG Keys--New SSH key
3、将复制的内容粘贴到key对应的文本框中
4、在Title文本框中任意填写一个名称,来标识这个Key从何而来
检测SSH Key是否配置成功
输入ssh -T git@github.com 敲击回车 在弹出内容后输入yes后,如果出现hi 你的用户名即代表你成功
将远程仓库克隆到本地
格式: git clone 远程仓库地址
分支
master主分支
当初始化本地Git仓库时,会默认创建一个master的分支。通常将其称为主分支
作用就是用来保存和记录整个项目已完成的功能代码
功能分支
用来开发新功能的分支,是临时从master主分支上分叉出的,最终需合并到master
查看当前仓库中所有的分支列表
格式: git branch
注:分支名字前面有*号就代表当前处于该分支
基于当前分支,创建新分支(新分支中的代码和当前分支中的完全一致)
格式:git branch 分支名称
注:执行完创建新分支命令后,用户当前还是处于master分支
切换到指定分支
格式: git checkout 分支名称
快速创建和切换分支
-b表示创建一个新分支 checkout表示切换到新建的分支上
表示创建并切换到当前分支
格式:git checkout -b 分支名称
合并分支
先切换到master主分支
将指定分支的代码合并到master主分支上
格式: git merge 分支名称
删除分支
格式:git branch -d 分支名称
注:删除某分支时,不能处于该分支上
遇到冲突时的分支合并
两个不同的分支对同一个文件进行不同的修改,Git无法干净的合并,只能手动解决冲突
在master上使用vscode打开文件,vscode中会有选项,选择不同选项进行操作,最后将所有文件提交 git add . 然后保存git commit -m “ ”
将本地分支推送到远程仓库
-u 表示把本地分支和远程分支进行关联,只在第一次推送的时候需要带 -u 参数
格式:git push -u 远程仓库的别名 本地分支名称:远程分支名称
例:git push -u origin payment :pay
如果希望远程分支的名称和本地分支名称一致,可以对命令简化
格式:git push -u origin payment
查看远程仓库中所有的分支列表
格式:git remote show 远程仓库名称
跟踪分支:从远程仓库中,把远程分支下载到本地仓库
从远程仓库中,把对应的远程分支下载到本地仓库,保持本地分支和远程分支名称相同
格式:git checkout 远程分支名称
从远程仓库中,把对应的远程分支下载到本地仓库,并把下载的本地分支进行重命名
格式:git checkout -b 本地分支名称 远程仓库名称/远程分支名称
拉取远程分支的最新代码
格式:git pull(位于那个分支,就只能更新当前分支的代码)
删除远程仓库中,指定名称的远程分支
格式:git push 远程仓库名称 --delete 远程分支名称