git
学习目标:
1. 掌握git基本概念
2. 熟练描述git工作流程
3. 熟练使用git常用命令
4. 熟悉git托管服务
5. 熟练使用idea操作git
一、git概述
Git是一个免费的,开源的分布式版本控制系统,能够快速高效的解决小型项目/大型项目团队开发问题。
版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统
1.1 为什么使用版本控制器
git是企业团队开发项目的必用神器。
有了他你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却是微乎其微。
1.2 版本控制器分类
版本控制器分为两类:一类是集中化的版本控制系统,一类是分布式的版本控制系统
1.2.1 集中化版本控制系统
集中化的版本控制系统诸如CVS,SVN以及perforce等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法,这种做法带来了许多好处,现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统;要远比在各个客户端上维护本地数据库来的轻松容易。
事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
1.2.2 分布式版本控制系统
由于上面集中化版本控制系统的那些缺点,于是分布式版本控制系统面世了。
在这类系统中,像Git,BitKeeper等,客户端并不只是提起最新版本的文件快照,而是把代码仓库完整的镜像下来。
更进一步,许多这类系统可以指定和若干不同的远端代码仓库进行交互。这样,你就可以在同一个项目中分别和不同工作小组的相互协作。
二、git的下载与安装
2.1 git下载
git官网:http://git-scm.com/
访问官网点击下载
2.2 git 安装
【1】点击安装包
【2】 下一步… 这里勾选第二个, 使用git编辑器操作
【3】都不选,点击完成
【4】打开Git Bash,查看版本信息
三、git 工作流程
3.1 git本地库结构
git的本地库结构如下
- 工作区:写代码的地方
- 暂存区:暂时存储
- 本地仓库:本地存储代码的地方
3.2 git 团队内部协作
git团队内部协作过程如下:
- 项目经理创建本地项目并初始化本地库
- 项目经理创建空的远程库,将本地库项目push到远程库
- 程序员将代码克隆到本地库
- 程序员加入团队,编写代码,将自己编写的代码推送到远程库
- 项目经理把远程库代码拉取到本地库查看进度
3.3 git跨团队协作
git跨团队协作过程如下:
- B公司将代码fork到自己公司的远程库
- B公司进行内部开发
- B公司将开发好的代码向A公司发起拉取请求 pull request
- A公司审核B公司代码,审核通过合并代码 merge
3.4 托管中心
代码托管的服务器叫做托管中心,托管中心分为两种,如下:
- 局域网环境下:可以搭建GitLab服务器作为代码托管中心,GitLab可以自己区搭建。
- 外网环境下:可以由GitHub或者Gitee作为代码托管中心,GitHub或者Gitee是现成的托管中心,不用自己区搭建。
3.5 小结
- 本地库结构
- 团队内部协作
- 跨团队协作
四、本地库操作
在使用git命令的时候,我们会用到一些linux命令,如下:
- ls/ll 查看当前目录
- cd 切换目录命令
- mkdir 目录名字 创建目录
- touch 文件名字 创建文件
4.1 基本配置
在使用git之前需要配置用户信息
【1】打开Git Bash,设置用户信息:用户名和邮箱
【2】查看用户信息,用户名、邮箱
4.2 初始化本地库
【1】创建一个文件夹
【2】打开Git终端:Git Bash Here: 进入以先对字体和编码进行设置
【3】进入到git-repository目录,本地仓库初始化
最终结果如下:
注意:.git隐藏目录不要删除不要修改
4.3 git 常用命令
4.3.1 status、add、commit命令
【1】在 git-repository目录中创建一个文件
【2】查看该文件的状态,输入命令:git status 胖叔讲java.txt
【3】将文件添加到暂存区,并查看状态;输入命令 git add 胖叔讲java.txt
【4】将文件提交到本地库,并查看状态;输入命令 git commit -m ‘提交一个文件’ 胖叔讲java.txt
4.3.2 查看日志信息
日志命令:git reflog
示例
4.3.3 文件/文件内容的增删改
不管是文件的增删改,还是文件内容的增删改操作过程都是一样的;过程如下:
- 操作文件/操作文件内容
- 将文件add到暂存区
- 将文件暂存区代码commit提交到本地库
示例:删除本地库的 胖叔讲java.txt
【1】删除文件 胖叔讲java.txt
【2】将删除文件过程添加到暂存区,查看状态
【3】将删除文件过程提交到本地库,查看状态,日志
4.3.4 版本回退
切换版本的命令 git reset --hard commitID
示例:恢复已经删除的文件
【1】查看 添加文件的commitID
【2】回退到该版本
4.4 分支操作
在版本控制过程中,使用多条线同时推进多个任务。这里面说的多条线,就是多个分支。
项目实战开发中,分支过程如下
上面版本号对应意思
- Master分支:用于版本发布,每一个节点都应该是可发布版本;每次合并到master时,都应添加tag标签作为版本号;严禁从develop分支或feature分支直接合并到master分支;
- Develop分支:作为开发的主分支始终存在;当有功能分支完成,应尽早合并到release分支。
- Release分支:发布新版本前的准备分支,从develop分支创建,创建后develop的更新不再合并到此release分支中, 该分枝只进行bug修复和文档修改,待版本稳定后,将该分支合并到master和develop分支,并删除该分支;
- Feature分支:功能开发分支,从develop分支创建,主要是在本地开发使用的分支,开发周期不宜过长,应尽早处理与服务器的冲突;功能完成后,合并到develop分支,并删除该分支;当存在比较独立或长期或容易与其他任务产生大的冲突的任务,建议check出feature分支,独立开发
- Hotfix分支:生产环境紧急bug修复分支,从master分支创建,完成bug修改后,合并到master和develop分支,并删除该分支;
4.4.1 查看分支
命令:git branch
示例:查看所有分支
4.4.2 创建分支
命令:git branch 分支名
示例:创建分支并查看
4.4.3 切换分支
命令:git checkout 分支名
示例:切换至branch01分支,并查看
4.4.4 合并分支
命令:git merge 分支名称
注意: 将分支合并到哪个分支就要切换到哪个分支,如 git merge branch01 ,将branch01 合并到主分支master中,就要先切换到master分支
示例: 在branch01分支写代码,提交到本地库;接着切换到master分支,查看master分支代码,确认两个分支确实在 并行执行开发任务,互不影响;然后将branch01分支代码合并到master分支
【1】在branch01分支写代码
【2】将代码提交到本地库
【3】切换到master分支,查看master分支代码
我们发现branch01分支的代码并没有影响master分支代码。
【4】将branch01分支代码合并到master分支
将branch01分支合并到主分支,就必须先保证当前分支是master分支。
4.4.5 解决冲突
示例:在master分支写代码,提交到本地库;接着切换到branch01分支写代码提交到本地库;然后将branch01分支代码合并到master分支,解决冲突,并完成合并。
【1】在master分支写代码,提交到本地库
【2】切换至branch01分支写代码提交到本地库
【3】切换到master分支,将branch01分支代码合并到master分支,并解决冲突
切换master分支,将branch01分支代码合并到主分支
接下来,查看文件内容,解决冲突
最后,将解决完冲突的代码提交到本地库
4.4.6 删除分支
不能删除当前分支,只能删除其他分支
命令1:git branch -d 分支名字 删除分支时,需要做各种检查
命令2:git branch -D 分支名字 不做任何检查,强制删除
示例:删除branch01分支,并查看
4.5 小节
- 本地库操作 git add → git commit
- 状态 git status
- 日志 git reflog
- 版本回退 git reset --hard commitID
- 分支
- 查看 git branch
- 创建 git branch 分支名字
- 切换 git checkout 分支名字
- 合并分支 git merge 分支名字
五、远程库操作
本章讲解本地库与远程库之间的操作。
5.1 托管中心介绍
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
gitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名gitHub
码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。
5.2 注册码云账号
想用使用码云搭建远程仓库,首先要注册一个码云账号;访问官网https://gitee.com/ ,注册账号
注意:一定要完善账号的所有信息,今后我们到工作岗位中会长期使用这个账号。
5.3 创建远程库
接下来创建远程库
选择SSH连接远程库
5.4 配置SSH公钥
使用SSH公钥连接的底层原理如下:
配置过程如下:
【1】通过命令ssh-keygen -t rsa 生成 公钥和私钥
【2】进入C:\Users\Administrator.ssh目录查看公钥和私钥
【3】将公钥配置到gitee
【4】输入命令:ssh -T git@gitee.com ,测试公钥是否配置成功
5.5 远程库操作
5.5.1 添加远程库
命令: git remote add <远端名称> <仓库路径>
远端名称,默认是origin,取决于远端服务器设置
仓库路径,从远端服务器获取此URL
示例:参考官网文档,添加远程库
【1】查看官方提示
【2】创建本地库,并完成初始化
【3】创建一个文件提交到本地库
【4】添加远程库连接
5.5.2 查看远程库
命令:git remote
示例:
5.5.3 推送远程库
命令:git push [-f][-u] [远端名称 [本地分支名][:远端分支名] ]
- 如果远程分支名和本地分支名称相同,则可以只写本地分支 git push origin master
- -f 表示强制覆盖
- -u 推送到远端的同时并且建立起和远端分支的关联关系。如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
示例:
查看:
示例2:修改文件 ,将修改后的文件推送到远程库
先修改文件内容,内容任意,在提交本地库,在推送
5.5.4 从远程库克隆
命令: git clone <仓库路径> [本地目录] ;本地目录可以省略,会自动生成一个目录
示例:
注意:克隆的git-test1要和之前的git-test1不在同一目录,否则不便后边的操作
5.5.5 从远程库拉取
拉取 命令:git pull [remote name][branch name]; 拉取指令就是将远端仓库的修改拉到本地并自动进行合并。
如果本地分支名字和远程分支名字一样,可以省略不写
示例1:本地库1添加内容推送到远程库,克隆后的本地库2从远程库拉取内容到本地库
【1】本地库1添加内容推送到远程库
【2】将远程库的内容拉取到本地库2(克隆后的本地库)
5.5.6 解决冲突
在一段时间,本地库1、本地库2修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突 。
示例:本地库1在README.md文件中追加内容本地库1,本地库2在README.md文件中追加内容本地库2,然后解决冲突
【1】本地库1 推送远程库内容
【2】本地库2 推送远程库内容
【3】解决冲突,先把远程库内容拉取到本地,在推送
5.6 小结
- 添加远程库
- 推送远程库
- 克隆远程库
- 拉取远程库
- 解决冲突问题
六、VSCode集成git
6.1 VSCode集成git
1)打开设置面板,搜索gitpath,打开setting.json
2)在setting.json配置git的路径
6.2 在终端输入命令
6.3 综合案例
通过VSCode完成如下案例,
案例1
- 创建前段项目(只建立结构)
- 将项目提交本地推送到远程库(模仿项目经理)
- 将项目克隆在另一个位置中(开发员)
- 编写项目登录页面(开发)
- 创建登录分支(本地)
- 推送远程登录分支(本地推送远程库)
- 将登录分支合并master分支(本地)
- 推送master分支(本地推送远程库)
案例2
- 创建前段项目(只建立结构)
- 将项目提交本地推送到远程库(模仿项目经理)
- 程序员A将项目克隆在另一个位置中(开发员)
- 程序员B将项目克隆在另一个位置中(开发员)
- 程序员A编写注册页面和index.css(内容随便写)
- 程序员B编写登录页面和index.css(内容随便写)
- 程序员A推送内容
- 程序员B推送内容并解决冲突
七、idea集成git操作
7.1 idea集成git
打开setting设置,设置git安装路径并测试
7.2 idea 本地库操作
接下来,我们通过idea创建一个项目,并完成该项目的本地仓库初始化、添加暂存区、提交本地库等操作
7.2.1 将项目提交到本地库
【1】创建idea项目git-demo2
【2】将项目初始化为本地库
然后检查项目
【3】将项目代码添加到暂存区
【4】将暂存区代码提交到本地库
7.2.2 回退历史代码操作
示例:修改代码,提交到本地库,然后在回退到初始化版本
【1】添加内容,提交到本地库
添加内容
然后,添加到暂存区,本地库;注意:只改了一个文件,只选中一个文件进行add→commit操作
【2】查看历史版本,回退到项目初始化版本
选择要回退的版本,点击get
7.2.3 分支操作
分支操作包含查看分支、创建分支、切换分支、合并分支、删除分支等内容;操作如下
【1】创建分支
【2】查看所有分支
【3】切换指定分支
【4】合并分支:在branch01分支编写代码并提交,最后合并到master分支
在branch01分支编写代码并提交,过程略,结果如下
切换到master分支,将branch01分支代码合并到master分支
点击master分支项目合并
【5】删除分支
【6】解决分支冲突
思路:在主分支和branch01分支在同一个类编写一些不同的代码并提交到本地库,最后将branch01分支代码合并到主分支,并解决冲突
首先,在master分支和branch01分支都编写一些代码并提交到本地库
接着,切换主分支,将branch01分支代码合并到主分支
解决冲突
最后添加暂存区,并提交,过程略。
7.3 idea 远程库操作
7.3.1 推送远程库
【1】创建空的远程库,库的名字就是本地项目的名字,保持一样
【2】将本地库推送到远程库
设置远程库路径,并推送项目
7.3.2 克隆项目到本地
刚才已经把项目推送到了远程库,接下来,我们用另一个gitee账号进行项目克隆,模拟团队开发。
【1】创建另一个账号,配置用户信息,配置SSH公钥
创建账号过程略,接下来配置用户信息
删除本地原来的公钥和私钥,过程略
配置新的私钥和公钥
将公钥配置到新的账号
【2】将新创建的账号加入到项目开发员中
【3】查看新账号,查看加入的项目,并克隆到本地
重启idea 克隆项目到本地, 此时的项目是开发员测试号克隆的
7.3.3 将编写代码推送远程库
【1】编写代码,提交本地库,推送远程库
提交本地库过程略,最后推送
最终结果如下:
7.3.4 将项目代码拉取到本地
将账号信息重置为老账号,并拉取项目
【1】重置账号信息,重设置SSH公钥和私钥,过程略
【2】拉取项目到本地
7.3.5 团队开发解决冲突
思路:
- A同学创建项目推送到远程库,然后在项目中加入B同学
- B同学将项目克隆到本地
- A同学和B同时编写项目中的同一个类,同一个方法
- 提交代码解决冲突
根据提示思路自己实现
结论:建议每次向远程库push推送代码时,先做pull拉取动作,这样可以大大降低代码冲突问题。
7.4 小结
- 本地库操作 add → commit
- 远程库操作 push推送、clone克隆、pull拉取、branch分支
八、跨团队协作
跨团队协作开发的大部分内容过程已经讲过,如下所示
我们只有fork开源项目、pull request 请求拉起, 以及审核操作没有讲,接下来我们演示这些操作。
示例:跨团队开发
实现思路:
- 使用账号A创建一个开源项目
- 使用账号BFork开源项目
- 使用账号B 开发项目一些代码
- 账号B发起拉取请求操作
- 账号A审阅账号B的拉取请求,审阅通过,合并代码。
提示:
- 项目必须开源
- fork与pull request
九、总结
- 本地库操作 add → commit
- 远程库操作 push推送、clone克隆、pull拉取、branch分支
- 跨团队操作 fork 、pull request