git管理文件的状态表示
红色的??:未跟踪
绿色的A:已暂存
红色的M:已修改但未放到暂存区中
绿色的M:已修改且已放到暂存区中
绿色的D:已被标记为删除,下一次提交时删除该文件
关于版本控制
优点
操作简单,易于对比,易于回溯,不易丢失,协作方便
版本控制系统的分类
本地版本控制系统:单机运行,使维护文件版本的操作工具化
集中化的版本控制系统:联网运行,支持多人协作开发;性能差,用户体验差
分布式版本控制系统:联网运行,支持多人协作开发;性能优秀,用户体验好
什么是Git
Git是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。
特点:项目越复杂,协作的人越多,越能体现出Git的高性能和高可用性
Git的特性
直接记录快照,而非差异比较
差异比较:
传统的版本控制系统(如SVN)是基于差异的版本控制,他们存储的是一组基本文件和每个文件随时间逐步积累的差异;好处是节省磁盘空间,坏处是耗时,效率低。
记录快照:
Git快照是在原有文件版本的基础上更新生成一份新的文件,类似于备份,为了效率,如果文件没有修改,Git不在重新存储该文件,而是只保留一个链接指向之前存储的文件。优点是再进行版本切换时速度快,坏处是占用空间大。
近乎所有操作都再本地进行
只需要访问本地的文件和资源
断网后依旧可以在本地对项目进行版本管理
联网后,把本地修改的记录同步到云端服务器即可
Git中的三个区域
工作区:处理工作的区域
暂存区:已完成的工作的临时存放区域,等待被提交
Git仓库:最终存放区域
Git中的三种状态
已修改(modified):表示修改了文件,但还没有将修改的结果放到暂存区
已暂存(staged):表示修改的文件已放到了暂存区
已提交(commited):表示文件已经安全的保存在本地的Git仓库中
Git的工作流程
在工作区中修改文件
将下次要提交的更改进行暂存
提交更新,找到暂存区的文件,将快照永久性的存储到Git仓库
Git基础
Git的安装
官网下载地址,速度慢
镜像下载地址,速度快
下载好相应版本后直接一路next,最后install完了之后,鼠标右键后出现了下图所示说明安装好了
配置用户信息
安装完Git之后,要做的第一件事就是设置自己的用户名和邮箱地址,因为通过Git对项目进行管理时,Git需要使用这些信息来记录是谁对项目进行了操作:
注:如果使用了 --global选项,那么该命令只需执行一次,即可永久生效。
Git全局配置文件
通过命令的方式查看配置信息
#查看所有的全局配置项
git config --list --global
# 查看指定的全局配置项
git config user.name
git config user.email
获取帮助信息
打开浏览器中的帮助手册
git help config
打开终端中的帮助手册
git config -h
获取Git仓库的两种方式
- 将尚未进行版本控制的本地目录转换为Git仓库
- 从其他服务器克隆一个已存在的Git仓库
在现有目录中初始化仓库
- 在项目目录中,通过鼠标右键打开“Git Bash”
- 执行git init命令将当前目录转化为Git仓库
注:git init命令会创建一个名为.git的隐藏目录,即当前项目的仓库,里面包含了初始的必要文件,这些文件是Git仓库的必要组成成分。
工作区文件的四种状态
未被Git管理:未跟踪(不被Git所管理的文件)
已被Git管理:未修改,已修改,已暂存
Git操作的最终结果是让工作区中所有文件都处于“未修改”的状态。
检查文件的状态
使用git status 命令查看文件处于什么状态
以精简的方式显示文件的状态
git status -s 或者是 git status --short
跟踪新文件
使用git add +文件名
提交更新
对于暂存区中的即将提交到Git仓库中保存的文件,可以使用git commit命令进行提交,其中可以加-m后缀并在后面添加本次的提交消息,用来对提交的内容做描述
对已提交的文件进行修改
暂存已修改的文件
git add +文件名
- 可以用它开始跟踪新文件
- 把已跟踪、且已修改的文件放到暂存区
- 把有冲突的文件标记为已解决的状态
提交已暂存的文件
git commit -m “提交消息”
撤销对文件的修改(不可恢复,高危操作)
把对工作区中对应文件的修改,还原成Git仓库中所保存的版本。(本质是用Git仓库中保存的文件,覆盖工作区中指定的文件)
修改后:
还原后:
向暂存区中一次性添加多个文件
取消已暂存的文件
移除多个暂存区文件
跳过使用暂存区域
不用git add 这一步,直接提交 git commit -a -m “描述消息”
移除文件
- 从Git仓库和工作区中同时移除对应的文件
移除mvnw文件
移除前
移除后
- 只从Git仓库中移除指定的文件,但保留工作区中对应的文件
移除mvnw.cmd文件
移除后
忽略文件
创建.gitignore文件,列出需要忽略的文件的匹配模式
- 以# 开头的是注释
- 以/结尾的是目录
- 以/开头防止递归
- 以!开头表示取反
- 可以使用glob模式进行文件和文件夹的匹配(glob指简化了的正则表达式)
glob模式
glob模式就是简化了的正则表达式
- 星号*匹配零个或多个任意字符
- [abc]匹配任何一个列在方括号中的字符(此案例匹配一个a或一个b或一个c)
- 问号?只匹配一个任意字符
- 在方括号中使用短划线分割两个字符,表示匹配此区间的任意字符
- 两个星号* * 表示匹配任意中间目录(如a/**/z可以匹配a/z、a/b/z或a/b/c/z等)
查看提交历史
按时间先后顺序列出所有提交历史,最近的提交排在最上面
git log
只显示最新的两条提交历史,数字可以按需进行填写
git log -2
在一行上展示最近两条提交历史的信息
git log -2 --pretty=oneline
在一行上展示最近两条提交历史信息,并自定义输出的格式
%h 提交的简写哈希值 %an作者名字 %ar作者修订日期,按多久以前的方式显示 %s提交说明
git log -2 --pretty=format:“%h | %an | %ar | %s”
回退到指定的版本
在一行上展示所有提交历史
git log --pretty=oneline
使用git reset --hard 命令,根据指定的提交ID回退到指定版本
git reset --hard 唯一标识ID
在就版本中使用git reflog --pretty=oneline命令,查看命令操作的历史
git reflog --pretty=oneline
再次根据更新的提交ID,跳转到最新的版本
git reset --hard 唯一标识ID
Github
什么是开源
指不仅提供程序,还提供程序的源代码,即代码是公开的,任何人都可以去修改,查看和使用开源代码;闭源与之相反。
开源许可协议
限制使用者的适用范围和保护作者的权利
-
BSD(Berkeley Software Distribution)
-
Apache Licence2.0
-
GPL(GNU General Public License)
具有传染性的一种开源协议,不允许修改后和衍生的代码作为闭源的商业软件发布和销售
使用GPL的最著名的软件项目是:Linux -
LGPL(GNU Lesser General Public License)
-
MIT(Massachusetts Institute of Technology,MIT)
是目前限制最少的协议,唯一的条件:在修改后的代码或发行包中,必须包含原作者的许可信息
使用MIT的软件项目有:jquery,Node.js
开源项目托管平台(以下三个都只能托管Git管理的文件)
Github:全球最牛的开源项目托管平台
Gitlab:对代码私有性支持较好,因此企业用户较多
Gitee:码云,是国产的开源项目托管平台
github远程仓库的两种访问方式
HTTPS:零配置;但是每次访问仓库时都需要重复输入Github的账号密码才能成功访问
SSH:需要进行额外的配置,但是配置成功后,每次访问仓库时,不需要重复输入账号密码
将本地管理的软件版本同步到github的空白仓库中
将本地仓库与远程仓库关联,且将项目命名为origin
git remote add origin https://github.com/lytobe/Gitdemo.git
git branch -M main
git push -u origin main
登录成功后出现如下界面
将github空白仓库刷新后显示Git中管理的相应项目
将本地仓库修改的内容同步到远程仓库中
SSH key
作用:实现本地仓库和Github仓库之间的免登录加密数据传输
好处:免登录身份认证、数据加密传输
组成:
- id_rsa(私钥文件,存放于客户端的电脑中即可)
- id_rsa.pub(公钥文件,需要配置到Github中)
生成SSH key
- 打开Git Bash
- 输入命令ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
- 连续敲击三次回车,即可在C:\Users\用户名文件夹.ssh目录中生成id_rsa和id_rsa.pub两个文件
配置SSH key
- 打开id_rsa.pub文件,复制其中内容
- 登录GitHub,点击头像>setting>SSH and GPG Keys>New SSH key
- 将之前复制的内容粘贴到对应文本框中
- 取名称(标识这个key从何而来)
检测github的SSH key是否配置成功
在终端中输入命令ssh -T git@github.com
输入yes后,出现这句话则表示配置成功
基于SSH将本地项目上传到远程仓库
将远程仓库克隆到本地
在终端输入如下命令
git clone 远程仓库的地址(https和ssh都可,但最好是ssh,因为不用重复输入账号密码)
Git分支
分支的概念
类似于平行宇宙
实际开发中分支的应用
在进行多人协作开发时,为了防止相互干扰,提高协同开发的体验,建议每个开发者都基于分支进行项目功能的开发
master主分支
在初始化本地Git仓库的时候,Git默认已经帮我们创建了一个名字叫做master的分支。通常把这个分支叫做主分支。
该分支在实际开发中的作用是用来保存和记录整个项目已完成的功能代码。
功能分支
指专门用来开发新功能的分支,他是临时从master主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到master主分支上
查看分支列表
git branch
带*星号的那一行是目前所处的分支
创建新分支
使用git branch 分支名字,可以基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一样,但用户还是处于当前分支。
切换分支
git checkout 分支名字
分支的快速创建和切换
#-b 表示创建一个新分支
#checkout 表示切换到刚才创建的分支上
git checkout -b 分支名字
合并分支
切换到主分支
git merge 需要合并的分支名称
删除分支
git branch -d 需要删除的分支名称
遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git就不能干净的合并他们,此时,需要打开这些包含冲突的文件手动解决冲突
手动打开并解决冲突文件后
将本地分支推送到远程仓库
如果是第一次将本地分支推送到远程仓库,需要运行如下命令
#-u表示把本地分支和远程分支进行关联,只在第一次推送时需要带-u参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
eg:git push -u origin test:testdemo
#如果希望远程分支的名称和本地分支的名称保持一致,可以对命令进行简化:
git push -u origin test
将test分支推送到远程仓库中,并将其命名为testdemo
查看远程仓库中的所有分支列表
git remote show 远程仓库名字
跟踪分支
指从远程仓库中把远程分支下载到本地仓库中
git checkout 远程分支的名称
eg:git checkout test
#重命名下载的远程分支
git checkout -b 本地分支名称 远程仓库名称/远程分支名称
eg:git checkout -b test origin/testdemo
拉取远程分支的最新代码
git pull (需要在相应的分支运行此命令)
删除远程分支
git push 远程仓库名称 --delete 远程分支名称
eg:
git push origin --delete testdemo
已删除