Git 分布式版本控制工具
1、概述
1.1、什么是版本控制软件?
版本迭代—>新的版本–>版本管理器
版本控制( Revision control )版件是一个用来记录文件变化,以便将来查阅特定版本修订情况的系统,因此有时也叫做“版本控制系统”实现跨区域多人协同开发
把手工管理文件版本的方式,改为由软件管理文件的版本;这个负责管理文件版本的软件,叫做“版本控制软件“
版本控制软件的优势
- 协作方便:减轻开发人员的负担,节省时间,同时降低人为错误
- 不易丢失:在版本控制软件中,被用户误删除的文件,可以轻松的恢复回来
- 操作简便:只需记住几组简单的终端命令,即可快速上手常见的版本控制软件
- 易于对比:基于版本控制软件提供的功能,能够方便地比较文件的变化细节,从而查找出导致问题的原因
- 易于回溯:追踪和记载一个或者多个文件的历史记录,可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态
简而言之就是用于管理多人协同开发项目的技术
没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题
多人开发就必须要使用版本控制,否则代价会比较大
1.2、常见的版本控制工具
- GIT
- SVN(Subversion)
- CVS(Concurrent Version System)
1.2.1、版本控制系统分类
- 本地版本控制系统:单机运行,使维护文件版本的操作工具化
- 集中化的版本控制系统:联网运行,支持多人协作开发;性能差、用户体验不好
- 分布式版本控制系统:联网运行,支持多人协作开发;性能优秀、用户体验好
本地版本控制系统
特点:使用软件来记录文件的不同版本,提高了工作效率,降低了手动维护版本的出错率
缺点: ① 单机运行,不支持多人协作开发 ② 版本数据库故障后,所有历史更新记录会丢失
集中化的版本控制系统
特点:基于服务器、客户端的运行模式 ① 服务器保存文件的所有更新记录 ② 客户端只保留最新的文件版本
优点:联网运行,支持多人协作开发
缺点: ① 不支持离线提交版本更新 ② 中心服务器崩溃后,所有人无法正常工作 ③ 版本数据库故障后,所有历史更新记录会丢失
典型应用:SVN
分布式版本控制系统
特点:基于服务器、客户端的运行模式 ① 服务器保存文件的所有更新版本 ② 客户端是服务器的完整备份,并不是只保留文件的最新版本
优点: ① 联网运行,支持多人协作开发 ② 客户端断网后支持离线本地提交版本更新 ③ 服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
典型应用:Git
2、初识Git
Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理
创始人:Linux和Git之父林纳斯托瓦兹( Linus Benedict Torvalds) 1969、芬兰赫尔辛基人
2.1、Git基本概念
Git有四个工作区域:工作区(Working Directory)、暂存区(Stage/Index)、版本库(Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:
- Workspace: 工作区,就是你平时存放项目代码的地方
- Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository: 版本库,就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git本地仓库
4、将本地仓库中的文件推送到远程仓库
2.2、Git安装
软件下载:打开git官网,下载对应操作系统的版本
官网下载太慢,推荐使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
选择对应的电脑版本下载,下一步安装即可
启动Git
安装成功后在开始菜单中会有Git项,菜单下有3个程序:任意文件夹下右键也可以看到对应的程序
Git Bash:Unix与Linux风格的命令行,使用最多
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
2.3、Git配置
配置用户信息
安装完 Git 之后,要做的第一件事就是设置自己的用户名和邮件地址。这是非常重要的,因为每次Git提交都会使用该信息,来记录是谁对项目进行了操作。它被永远的嵌入到了你的提交中:
git config --global user.name "Mr zhang"
git config --global user.email "xxxxx@qq.com"
注:如果使用了 --global 选项,那么该命令只需要运行一次,即可永久生效!
通过 git config --global user.name 和 git config --global user.email
配置的用户名和邮箱地址,会被写入到 C:/Users/用户名文件夹/.gitconfig
文件中。这个文件是 Git 的全局配置文件,配置一次即可永久生效
检查配置信息
除了使用记事本查看全局的配置信息之外,还可以运行如下的终端命令,快速的查看Git 的全局配置信息:
# 查看所有的全局配置项
git config --list --global
# 查看指定全局配置项
git config user.name
git config user.email
2.4、Git仓库搭建
获取 Git 仓库的两种方式
- 将尚未进行版本控制的本地目录转换为 Git 仓库
- 从其它服务器克隆一个已存在的 Git 仓库
将本地目录转换为 Git 仓库
如果自己有一个尚未进行版本控制的项目目录,想要用 Git 来控制它,需要执行如下两个步骤:
- 在项目目录中,通过鼠标右键打开“Git Bash”
- 执行
git init
命令将当前的目录转化为 Git 仓库
注:git init 命令会创建一个名为 .git 的隐藏目录,这个 .git 目录就是当前项目的 Git 仓库,里面包含了初始的必要文件,这些文件是 Git 仓库的必要组成部分
克隆远程仓库
# 克隆一个项目和它的整个代码历史(版本信息)
git clone '远程仓库地址 HTTPS/SSH' https://gitee.com/baomidou/MybatisX.git
去gitee
或者github
上克隆一个测试!
2.5、工作区文件状态
文件状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上,所以了解文件在什么状态就显得尤为重要了
- Untracked:未跟踪,(未被纳入版本控制)
- Tracked:已跟踪,(已被纳入版本控制)
- Unmodify:未修改,工作区中文件的内容和Git 仓库中文件的内容保持一致
- Modified:已修改,工作区中文件的内容和Git 仓库中文件的内容不一致
- Staged:暂存状态,工作区中被修改的文件已被放到暂存区,准备将修改后的文件保存到Git仓库中
注:这些文件的状态会随着我们执行git的命令从而发生变化
本地仓库操作
常用命令
- git status:查看文件状态
- git add:将文件的修改加入暂存区
- git reset:将暂存区的文件取消暂存或者是切换到指定版本
- git commit:将暂存区的文件修改提交到版本库
- git log:查看日志
上面文件的发生的几种状态,通过如下命令可以查看到文件的状态:
# 1.检查文件的状态
# 查看指定文件状态
git status [filename]
# 查看所有文件状态
git status
# 以精简的方式查看文件状态
git status --short
git status -s
# 2.跟踪新文件
# 添加指定文件到暂存区
git add index.html
# 添加所有文件到暂存区
git add *
# 3.提交更新
# 提交暂存区的内容到本地仓库 -m 提交信息
git commit -m "消息内容"
# 4.撤销对文件的修改 注:危险性比较高,请慎用!
git checkout -- index.html
# 5.取消暂存的文件
git reset '文件名称'
# 6.跳过使用暂存区直接提交到仓库
git commit -a -m '描述消息'
# 7.移除文件
# 从Git仓库和工作区同时移除 index.html 文件
git rm -f index.html
# 只从Git仓库移除 index.html 文件,但保留工作区的 index.html 文件
git rm --cached index.html
# 8.查看提交历史
# 按时间先后顺序列出所有的提交历史,最近的提交排在最上面
git log
# 查看前几条提交历史
git log -2
# 在一行显示查看前几天提交历史
git log -2 --pretty=oneline
# 9.回退到指定版本(会丢失历史版本号记录)
git reset --hard '版本标识'
# 恢复到指定版本(保留历史版本号记录)
git revert '版本标识'
# 查看版本回退操作的历史
git log --reflog --pretty=oneline
忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。在这种情况下,我们可以创建一个名为 .gitignore
的配置文件,列出要忽略的文件的匹配模式
在主目录下建立".gitignore
"文件,此文件有如下规则:
- 以 # 开头的是注释
- 以 / 结尾的是目录
- 以 / 开头防止递归
- 以 ! 开头表示取反
- 可以使用 glob 模式进行文件和文件夹的匹配(glob 指的是简化了的正则表达式)
2.6、开源
何为开源?
开源是指不仅提供程序还提供程序的源代码, 闭源是只提供程序,不提供源代码
什么是开源许可协议?
开源并不意味着完全没有限制,为了限制使用者的使用范围和保护作者的权利,每个开源项目都应该遵守开源许可协议( 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
为什么要拥抱开源?
开源的核心思想是“我为人人,人人为我”,人们越来越喜欢开源大致是出于以下 3 个原因:
- 开源给使用者更多的控制权
- 开源让学习变得容易
- 开源才有真正的安全
开源是软件开发领域的大趋势,拥抱开源就像站在了巨人的肩膀上,不用自己重复造轮子,让开发越来越容易!
开源项目托管平台
专门用于免费存放开源项目源代码的网站,叫做开源项目托管平台。目前世界上比较出名的开源项目托管平台主要有以下 3 个:
- Github(全球最牛的开源项目托管平台,没有之一)
- Gitlab(对代码私有性支持较好,因此企业用户较多)
- Gitee(又叫做码云,是国产的开源项目托管平台。访问速度快、纯中文界面、使用友好)
注:以上 3 个开源项目托管平台,只能托管以 Git 管理的项目源代码,因此,它们的名字都以Git 开头
2.7、使用码云
1、注册登录码云,完善个人信息
远程仓库的两种访问方式
Gitee 远程仓库,有两种访问方式,分别是 HTTPS 和 SSH。它们的区别是:
- HTTPS:零配置;但是每次访问仓库时,需要重复输入 Gitee 的账号和密码才能访问成功
- SSH:需要进行额外的配置;但是配置成功后,每次访问仓库时,不需重复输入 Gitee 的账号和密码
注:在实际开发中,推荐使用 SSH 的方式访问远程仓库
SSH key 的作用:实现本地仓库和 Gitee 之间免登录的加密数据传输
SSH key 的好处:免登录身份认证、数据加密传输
SSH key 由两部分组成,分别是:
- id_rsa(私钥文件,存放于客户端的电脑中即可)
- id_rsa.pub(公钥文件,需要配置到 Gitee 中)
2、设置本机绑定SSH公钥,实现免密登录
# 公钥生成在 C:\users\86186\.ssh 目录
# 生成公钥
ssh-keygen -t ed25519
# 中途敲击三次回车
# 查看生成公钥
cat ~/.ssh/id_ed25519.pub
# 首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功
ssh -T git@gitee.com
# 输入 yes 即可
3、将公钥信息public key添加到码云账户中即可
4、使用码云创建自己的仓库
新建仓库填写相关信息即可
2.8、操作远程仓库
常用命令
- git remote:查看远程仓库
- git remote add:添加远程仓库
- git clone:从远程仓库克隆
- git pull:从远程仓库拉取
- git push:推送到远程仓库
添加远程仓库
先初始化本地库,然后与已创建的远程库进行对接
# 链接远程仓库,创建主分支
git remote add origin 远程仓库地址
远程名称:默认是origin,取决于远端服务器设置
仓库路径:从远端服务器获取此URL
查看远程仓库
git remote
推送到远程仓库
# 推送到远端的同时并且建立起和远端分支的关联关系
git push --set-upstream origin master
# 把本地仓库的变化连接到远程仓库主分支
git push origin master
2.9、Git分支
在进行多人协作开发的时候,为了防止互相干扰,提高协同开发的效率,建议每个开发者都基于分支进行项目功能的开发,使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。同一个仓库可以有多个分支,各个分支相互独立,互不干扰
在初始化本地 Git 仓库的时候,Git 默认已经帮我们创建了一个名字叫做 master 的分支。通常我们把这个master 分支叫做主分支
在实际工作中,master 主分支的作用是:用来保存和记录整个项目已完成的功能代码
因此,是不允许程序员直接在 master 分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃
由于程序员不能直接在 master 分支上进行功能的开发,所以就有了功能分支的概念
功能分支指的是专门用来开发新功能的分支,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上
常用命令
- git branch:查看分支
- git branch [name]:创建分支
- git checkout [name]:切换分支
- git checkout -b [name]:创建并切换到该分支
- git push [shortname] [name]:推送到远程仓库分支
- git merge [name]:合并分支
- git branch -d [name]:删除分支
- git branch -r:查看所有远程分支
- git branch -a:查看所有本地及远程分支
本地分支操作
# 1.查看分支列表
git branch
# 查看分支详细列表
git branch -v
# 2.新建一个分支
git branch payModule
# 3.切换到指定分支
git checkout payModule
# 4.新建一个分支,并切换到该分支
# -b 表示创建一个新分支
# checkout 表示切换到刚才新建的分支上
git checkout -b login
# 5.合并指定分支到当前分支
# 注:合并前需要先切换到主分支上,再进行合并
git checkout master
git merge payModule
# 6.删除一个分支
# 注:删除分支前需要先切换到不是将要删除的分支上 否则删除失败!
git branch -d '分支名称'
遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git 就没法干净的合并它们。此时,需要打开这些包含冲突的文件然后手动解决冲突
2.10、Git标签
常用命令
- git tag:列出已有的标签
- git tag [name]:创建标签
- git push [shortname] [name]:将标签推送至远程仓库
- git checkout -b [branch] [name]:检出标签
- git tag -d [name]:删除标签
Git 标签是 Git 版本库的一个快照,指向某个 commit 的指针。使用 tag 的好处是可以方便地标记某个特定的提交(commit),以便于后续的开发和维护
# 创建两个文件
touch index.js
touch index.html
# 添加到暂存区并提交到本地仓库
git add *
git commit -m '原始方式实现'
# 再次创建一个文件
touch index.vue
# 添加到暂存区并提交到本地仓库
git add *
git commit -m '引入框架实现'
# 创建标签
git tag v1.0
# 查看标签
git tag
# 推动至远端仓库
git push origin v1.0
# 查看指定标签中的内容(需要检出到一个分支中)
git checkout -b orderV1.0 v1.0
# 删除标签
git tag -d '标签名'
# 查看提交版本号和历史记录
git log --oneline