版本管理工具-Git
一、版本管理
- 一句话:在开发过程中用于管理对文件、目录或工程等内容的修改历史,方便查看历史记录,备份以便恢复以前的版本的软件工程技术
1. 可以完成哪些功能
- 实现跨域多人协同开发
- 追踪和记载一个或者多个文件的历史记录
- 组织和保护源代码和文档
- 统计工作量
- 并行开发、提高开发效率
- 跟踪记录整个软件的开发过程
- 减轻开发人员负担节省时间,同时降低人为错误
2. 主流版本控制工具/软件
- Git
- SVN (Subversion)
- CVS (Concurrent Version Syatem)
- VSS (Micorosoft Visual SourceSafe)
- TFS (Team Foundation Server)
- Visual Studio Online
3. 版本控制分类
3.1 本地版本控制
解读本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS
3.2 集中版本控制
介绍
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本
所有数据都保存在单一的服务器上,如果这个服务器会损坏(有很大的风险),这样就会丢失所有的数据,需要定期备份
代表产品:SVN、CVS、VSS
示意图
3.3 分布式版本控制
分布式版本控制
所有版本信息仓库全部同步到本地的每一个用户
可以在本地查看所有版本历史,可以离线在本地提交,只需要在联网时push到相应的服务器或其他用户哪里
每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据
更加安全,不会因为服务器损坏或者网络问题,造成不能工作的情况
代表软件:Git
示意图
4. Git VS SVN
4.1 SVN
- SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本
- 完成工作后,需要把自己的代码送到中央服务器,集中式版本控制系统是必须联网才能工作
4.2 Git
- Git是分布式版本控制系统,每个人的电脑就是一个完整的版本库,工作的时间不需要联网了,因为版本都在自己电脑上
- 协同的方法说明:比如自己在电脑上改文件A,其他人也在电脑上改了文件A,这时,你们两之间只需要把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件
二、Git下载和安装
1. 官网
- 国外官方网址:https://git-scm.com/
- 国内官方网址:https://registry.npmmirror.com/binary.html?path=git-for-windows/
2. 卸载
- 卸载步骤:
- 到Windows的设置中,选择应用,再选择安装的应用,然后找到安装的GIt然后删除,也可以去控制面板中删除
- 检查环境变量,如果有和Git相关的,删除即可
- 可以去bilibili.com查询删除的视频
3. 安装
- 直接安装,记住安装到非系统盘
- 细节
- 安装路径不要带中文、空格、特殊字符
4. 验证安装是否成功
查看是否如下两个标识
三、Git资料
1. Git大全
- 学习文档网址:https://gitee.com/all-about-git
1.1 Git常用命令
- 仓库:https://gitee.com/all-about-git#%E4%BB%93%E5%BA%93
- 配置:https://gitee.com/all-about-git#%E9%85%8D%E7%BD%AE
- 增加/删除文件:https://gitee.com/all-about-git#%E5%A2%9E%E5%8A%A0%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6
- 代码提交:https://gitee.com/all-about-git#%E4%BB%A3%E7%A0%81%E6%8F%90%E4%BA%A4
- 分支:https://gitee.com/all-about-git#%E5%88%86%E6%94%AF
- 标签:https://gitee.com/all-about-git#%E6%A0%87%E7%AD%BE
- 查看信息:https://gitee.com/all-about-git#%E6%9F%A5%E7%9C%8B%E4%BF%A1%E6%81%AF
- 远程同步:https://gitee.com/all-about-git#%E8%BF%9C%E7%A8%8B%E5%90%8C%E6%AD%A5
四、Git基本配置
1. 设置用户名与邮箱
- 说明:使用Git前,需要设置你的用户名称和Email地址
1.1 具体操作
安装Git后,首先要设置你的用户名称和e-mail地址,因为每次Git提交都会使用该信息
指令
用户名
git config --global user.name "用户名"
邮箱
git config --global user.email "邮箱"
指令成功执行,会生成C:\Users\admin\ .gitconfig
2. 查看配置
查看所有配置:
git config -l
查看系统配置:
git config --syatem --list
查看当前用户配置:
git config --global --list
3. Git的配置文件
3.1 system 配置文件
- Git安装目录下的
- /etc/gitconfig
3.2 global全局文件
- 在\Users\admin\ .gitconfig,只适用于当前登录用户的配置
五、Git工作原理【重要】
1. 四个工作区域和关系
四个工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果再加上远程的Git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Workspace:工作区,就是你平时存放项目代码的地方
Index/Stage:暂存区,用于临时存放用户的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库区),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器(比如Github/Gitee),可以简单的认为是你项目组中的一台电脑用于远程数据交换
对本地三个区域再说明
Directory:使用 Git 管理的一个目录,也就是一个仓库,包含用户的工作空间和Git的管理空间
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放 Git 管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD只是当前的开发分支(branch)。
Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
2. 工作流程
Git的工作流程说明
在工作目录中添加、修改文件
将需要进行版本管理的文件放入暂存区域
将暂存区域的文件提交到Git本地仓库
因此,Git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
六、Git仓库创建
1. 创建工作目录与常用指令
工作目录(Workspace)一般就是你希望Git帮助用户管理的文件夹(目录),可以是用户项目的目录,也可以是一个空目录,建议不要有中文
6个命令-示意图
2. 本地仓库-创建
2.1 创建全新的仓库
需求:演示在本地创建全新仓库
操作演示
创建一个目录
在目录中右键,选取
执行指令
git init
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录中
2.2 克隆远程仓库
需求:演示在本地克隆远程仓库
操作说明
说明:克隆远程代码仓库,就是将远程服务器上的仓库完全镜像一份至本地
#克隆一个远程代码仓库和它的整个代码历史(版本信息) git clone [url] #url就是远程git项目的地址
创建一个目录
在github或者Gitee找一个项目的地址url
执行克隆指令
git clone https://gitee.com/6tail/lunar-typescript.git
七、Git文件管理
1. 文件四种状态
- 版本控制就是对文件的版本控制,在Git管理中,文件被统一管理,有四个状态
- .Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过 git add状态变为Staged
- Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种处理方式,如果它被修改,变为Modified。如果使用git rm移出版本库,则成为Untracked
- Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这种文件有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态,这个git checkout 即从库中取出文件,覆盖当前修改
- Staged: 暂存状态。 执行git commit 则将修改同步到库中, 这时库中的文件和本地文件又 变为一致, 文件为Unmodify 状态. 执行git reset HEAD filename 取消暂存, 文件状态为Modified
2. 文件操作指令
查看指定文件状态:
git status [filename]
查看所有文件状态:
git status
添加所有文件到暂存区:
git add .
提交暂存区中的内容到本地仓库:
git commit-m "消息内容"
3. 忽略文件
实际需求:我们不想把某些文件纳入版本控制中,如何处理?
忽略文件处理方式
不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,在主目录 下建立”.gitignore"文件(默认就有),此文件有如下规则:
忽略文件中的空行或以井号(#)开始的行
支持Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符, 方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
如果名称的最前面是一个路径分隔符(/),表示忽略.gitignore文件所在的目录,不包括其任何子目录中的dir目录
如果名称的最后面是一个路径分隔符(/),忽略.gitignore文件所在的目录和所有子目录的dir目录
提示:常用规则,掌握一些,其它查看文档
*.java #忽略所有.java结尾的文件 !hsp.java #hsp.java除外
更加细化的规则
网址:https://blog.csdn.net/w8y56f/article/details/103263924?spm=1001.2101.3001.6661.1
实例
八、Gitee创建代码仓库
1. 创建Gitee账号
- gitee官网:https://so.gitee.com
2. 创建仓库
3. 设置本机绑定SSH公钥,实现免密登录
3.1 生成SSH公钥
进入 C:\Users\Administrator.ssh , 没有就手动创建该目录
如果该目录下有相应文件,先删除(第一次操作是没有的)
执行指令 ssh-keygen , 生成文件(说明:直接回车即可)
ssh-keygen 指令更多说明: https://blog.csdn.net/weixin_37335761/article/details/120146098
比如: ssh -keygen -t rsa -C 'hello@qq.com' -f ~/.ssh/github_id_rs
3.2将公钥信息publickey 添加到码云账
4. 将创建的仓库克隆到本地
点击要克隆的仓库,然后在点击克隆下载
在本地输入地址然后克隆
九、IDEA 项目使用Git管理
1. 需求1-说明-实现步骤
说明:将gitee创建的仓库项目拉取IDEA,进行管理
实现步骤
界面操作
创建一个crm 模块,进行测试
添加一个Hi.java
将HI.java add 到 git
说明:将HI.java 加入到暂存
将HI.java commit 到 git
commit 只是将HI.java 提交到本地仓库
并没有push 到远程仓库(即GitHub/Gitee
将HI.java push 到 Gitee, 会输入用户名密码验证(是Gitee的账号)
也可以使用命令行完成
操作指令
2. 需求2-说明-实现步骤
创建了一个IDEA 项目(没有从Gitee拉取), 后面又希望和 Gitee的某个代码仓库关联, 如何操作
实现步骤
还是使用这之前操作的仓库
创建一个springboot/maven 项目 sns
克隆 gitee的之前的学习仓库到自己指定的目录中
将克隆下拉的仓库的文件,拷贝到IDEA对应项目中
刷新,或者重启IDEA 项目
创建Hello.java文件
然后add、commit、push
可以查看到仓库中出现了创建的文件
3. 如何查看操作记录
示意图
切换到之前的版本
4. 需求3-说明-实现步骤
一个 IDEA 项目(从Giteeclone), 后面又希望获取 Gitee的代码仓库最新代码, 如何操作
在开一个窗口然后拉取仓库,然后在之前的哪个窗口创建一个新的文件然后push到仓库中
在新的窗口进行pull,拉取最新的代码
十、Git分支管理
1. 介绍
分支合并示意图
分支可以有多个(根据业务需求)
如果各分支没有交集,始终平行发展,则不需要合并(merge)
如果两个分支,需要合并,则执行merge 操作
2. 创建IDEA Maven项目和Gitee的le-erp代码仓库关联
3. Git分支指令
网址:https://gitee.com/all-about-git#%E5%88%86%E6%94%AF
指令一览
# 列出所有本地分支 $ git branch # 列出所有远程分支 $ git branch -r # 列出所有本地分支和远程分支 $ git branch -a # 新建一个分支,但依然停留在当前分支 $ git branch [branch-name] # 新建一个分支,并切换到该分支 $ git checkout -b [branch] # 新建一个分支,指向指定commit $ git branch [branch] [commit] # 新建一个分支,与指定的远程分支建立追踪关系 $ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工作区 $ git checkout [branch-name] # 切换到上一个分支 $ git checkout - # 建立追踪关系,在现有分支与指定的远程分支之间 $ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支 $ git merge [branch] # 选择一个commit,合并进当前分支 $ git cherry-pick [commit] # 删除分支 $ git branch -d [branch-name] # 删除远程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
需求:克隆 le-erp仓库, 创建分支v1.0, 并提交到远程仓库
指令操作演示
4.IDEA项目创建分支
创建分支
将新创建的分支push到远程仓库
如果在本地没有看到其他分支信息,需要拉取,操作如图
5.IDEA项目切换分支,进行工作
6.IDEA项目分支合并,没有冲突的情况
创建一个分支V3.0
在分支V3.0中添加一个Hi.java文件
然后切换到master分支
然后在进行合并
7.IDEA项目分支合并,有冲突的情况
接受某一方,解决冲突
手动修改,解决冲突
将V2.0合并到master
8.IDEA项目删除分支
彻底删除某个分支
如果要彻底删除某个分支,远程仓库的分支也要删除
只删除本地分支,还可以重新获取
9. 注意实现和细节
- 如果同一文件在合并分支时都被修改了则会引起冲突, 修改冲突文件后重新提交(说明: 这时要决定保留哪个分支代码)
- Master 主分支应该非常稳定,用来发布新版本,一般情况下不要在上面工作,工作一般 在新建的分支(比如dev、v1.0、v2.0)上工作
- 分支代码稳定后,可以合并到主分支Master
- 在进行分支合并时, 最好是各分支都已经处于Committed的状态, 这样可以减小处理合并冲突的难度.
- Push 操作, 是Push已经Committed的代码, 如果修改了一个文件, 但是没有执行 Commit ,那么Push 的其实是上次Committed的状态
- add 、 commit 、push 的操作可以针对单个文件,也可以针对文件夹
- 文件要Commit 前需要先Add 到暂存区 ,以后文件修改了,就可以直接Commit
- 如果要删除文件,可以在本地删除该文件, 然后commit 文件所在文件夹即可,并重新 push 该分支, 那么在远程仓库, 也会删除对应分支的文件。