Git&GitHub
Git&GitHub
-
1、版本控制
-
版本控制工具应该具备的功能
-
协同修改
- 多人并行不悖的修改服务器的同一个文件。
-
数据备份
- 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
-
版本管理
- 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面SVN采用的是增量管理的方式,而Git采用了文件系统快照的方式。
-
权限控制
- 对团队中参与开发的人员进行权限控制。
- 对团队外开发者贡献的代码进行审核--Git独有。
-
历史记录
- 查看修改人、修改时间、修改内容、日志信息。
- 将本地文件恢复到某一历史状态。
-
分支管理
- 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
-
协同修改
-
版本控制简介
- 工程设计领域中使用版本控制管理工程蓝图的设计过程。在IT开发过程中也可以使用版本控制思想管理代码的版本迭代。
-
版本控制工具
- 思想:版本控制
- 实现:版本控制工具
- 集中式版本控制工具:CVS、SVN、VSS......
-
版本控制工具应该具备的功能
-
-
- 分布式版本控制工具:Git、Mercurial、Bazaar、Darcs......
-
-
-
-
2、Git简介
- Git简史
-
- Git官网和Logo
-
-
Git的优势
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与Linux命令全面兼容
-
Git和代码托管中心
- 代码托管中心的任务:维护远程库
-
局域网环境下
- GitLab服务器
-
外网环境下
- GitHub
- 码云
-
本地库和远程库
- 团队内部协作
-
Git的优势
-
-
-
- 跨团队协作
-
-
-
-
Git基本原理
-
哈希
- 哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 1、不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
- 2、哈希算法确定,输入数据确定,输出数据能够保证不变
- 3、哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
- 4、哈希算法不可逆
- 哈希底层采用的是SHA-1算法。
- 哈希算法可以被用来验证文件。原理如下图所示:
-
哈希
-
Git基本原理
-
-
-
- Git就是靠这种机制从根本上保证数据完整性的。
-
-
Git保存版本的机制
-
集中式版本控制工具的文件管理机制
- 以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
- 例如:svn
-
集中式版本控制工具的文件管理机制
-
-
-
-
Git的文件管理机制
- Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流。
- 快照流Git图示:
-
Git的文件管理机制
-
-
-
-
Git文件管理机制细节
- Git的“提交对象”
-
Git文件管理机制细节
-
-
-
-
- 提交对象及其父对象形成的链条
-
-
-
-
Git分支管理机制
- 分支的创建
-
Git分支管理机制
-
-
- 分支的切换
-
-
-
- 3、Git命令行操作
-
本地库操作
-
本地库初始化
- 命令:git init
- 效果:
-
本地库初始化
-
-
- 注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
-
设置签名
- 形式
- 用户名:tom
- Email地址:[email protected]
- 作用:区分不同开发人员的身份
- 辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系
-
命令
-
项目级别/仓库级别:仅在当前本地库范围内有效
- git config user.name tom_pro
- git config user.email [email protected]
- 信息保存位置:./.git/config文件
-
项目级别/仓库级别:仅在当前本地库范围内有效
-
-
-
-
-
系统用户级别:登录当前操作系统的用户范围
- git config --global user.name tom_glb
- git config --global [email protected]
- 信息保存位置:~/.gitconfig文件
-
系统用户级别:登录当前操作系统的用户范围
-
-
-
-
-
-
级别优先级
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有不允许
-
级别优先级
-
-
基本操作
- 命令:git status | git add <file> | git rm --cached <file> | git commit <file> | git log | git log --pretty=oneline | git log --oneline | git reflog |
-
状态查看操作
- git status 查看工作区、暂存区状态
-
添加操作
- git add [file name] 将工作区的“新建/修改”添加到暂存区
-
提交操作
- git commit -m "commit message" [file name] 将暂存区的内容提交到本地库
- 三个区
-
-
-
-
查看历史记录
-
git log
- 多屏显示控制方式:空格向下翻页 b 向上翻页 q 退出
- git log --pretty=oneline
- git log --oneline
-
git reflog
- [email protected]{移动到当前版本需要多少步}
-
git log
-
前进后退
- 本质
-
查看历史记录
-
-
-
-
-
基于索引值操作【推荐】
- git reset --hard 9a9ebe0 |git reset --hard [局部索引值]
-
使用^符号:只能后退
- git reset --hard HEAD^
- 注:一个^表示后退一步,n个表示后退n步
-
使用~符号:只能后退
- git reset -hard HEAD~n
- 注:表示后退n步
-
基于索引值操作【推荐】
-
reset命令的三个参数对比
-
--soft参数
- 仅仅在本地库移动HEAD指针
-
--soft参数
-
-
-
-
-
-
--mixed参数
- 在本地库移动HEAD指针
- 重置暂存区
-
--mixed参数
-
-
-
-
-
-
--hard参数
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
-
--hard参数
-
删除文件并找回
- 前提:删除前,文件存在时的状态提交到了本地库
-
操作:git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
-
比较文件差异
-
git diff [文件名]
- 将工作区中的文件和暂存区进行比较
-
git diff [本地库中历史版本] [文件名] | git diff HEAD^ [文件名]
- 将工作区中的文件和本地库历史记录比较
- 不带文件名,比较多个文件
-
git diff [文件名]
-
-
分支管理
-
什么是分支?
- 在版本控制过程中,使用多条线同时推进多个任务。
-
什么是分支?
-
-
-
-
分支的好处:
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
-
分支操作
- 创建分支 git branch [分支名]
- 查看分支 git branch -v
- 切换分支 git checkout [分支名]
-
合并分支
-
第一步:切换到接受修改的分支(被合并,增加新内容)上
- git checkout [被合并的分支]
-
第二步:执行merge命令
- git merge [有新内容分支名]
-
第一步:切换到接受修改的分支(被合并,增加新内容)上
-
解决冲突
- 冲突的表现
-
分支的好处:
-
-
-
-
-
-
冲突的解决
- 第一步:编辑文件,删除特殊符号
- 第二步:把文件修改到满意的程度,保存退出
- 第三步:git add [文件名]
-
第四步:git commit -m "日志信息"
- 注意:此时commit一定不能带具体文件名
-
冲突的解决
-
-
-
-
远程库操作
-
在本地创建远程库地址别名
- git remote -v
- get remote add 远程库地址
- git remote -v
-
在本地创建远程库地址别名
-
-
推送操作
- git push origin master
-
推送操作
-
-
克隆操作
- 命令:git clone [远程地址]
-
克隆操作
-
-
-
命令的效果:
- 完整的把远程库下载到本地
- 创建origin远程地址库别名
- 初始化本地库
-
命令的效果:
- Windowd凭据会记住用户名密码
- 团队成员邀请
-
-
-
- “岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自已的 Github账号,访问邀请链接
-
-
-
拉取
- pull = fetch + merge
- git fetch [远程库地址别名] [远程分支名]
- git merge [远程库地址别名/远程分支名]
-
解决冲突
-
要点
- 如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉去下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
-
类比
- 债权人:老王
- 债务人:小刘
- 老王说:10天后归还。小刘接受,双方达成一致
- 老王媳妇说:5天后归还。小刘不能接受。老王媳妇需要找老王确认后再执行。
-
要点
-
跨团队协作
- Fork
-
拉取
-
-
- Fork完以后
-
-
-
- clone到本地
- 本地修改,然后推送到远程
- Pull Request
-
-
-
- new pull request
-
-
-
- 岳不群点这里
-
-
-
- 对话
-
-
-
- 审核代码
-
-
-
- 合并代码
-
-
-
- 合并代码时添加日志信息
-
-
-
- 将远程库修改拉取到本地
-
SSH登录
-
进入当前用户的家目录
- cd ~
-
删除.ssh目录
- rm -rvf .ssh
-
运行命令生成.ssh**目录
- ssh-****** -t rsa -C 邮箱
- 【注意:这里-C这个参数是大写的C】
-
进入.ssh目录查看文件列表
- cd .ssh
- ls -lF
-
查看id_rsa.pub文件内容
- cat id_rsa.pub
-
复制id_rsa.pub文件内容,登录GitHub,点击用户头像-->Settings-->SSH and GPG
- key
- New SSH Key
- 输入复制的**信息
-
回到Git bash创建远程地址别名
- git remote add origin-ssh [git的远程地址]
- 推送文件进行测试
-
进入当前用户的家目录
-
-
4、Git图形化界面操作
-
Eclipse操作
-
工程初始化为本地库
- 工程-->右键-->Team-->Share Project-->Git
-
工程初始化为本地库
-
Eclipse操作
-
-
-
-
Eclipse中忽略的文件
-
概念:Eclipse特定文件
- 这些都是Eclipse为了管理我们创建的工程而维护的文件,和开发的代码没有直接关系。最好不要在Git中追踪,也就是把他们忽略。
- .classpath文件
- .project文件
- .settings目录下所有文件
-
在~/.gitconfig文件中引入上述文件
-
[core]
- excludesfile=C:/Users/Lenovo/Java.gitignore
- 【注意:这里路径一定要使用“/”,不能使用“\”】
-
[core]
-
概念:Eclipse特定文件
-
推送到远程库
- 右键--Team--Remote--Push
-
-
-
-
-
- 输入gitHub上的网址,用户名,密码
-
-
-
-
-
- Add predefined specification
-
-
-
-
-
Oxygen Eclipse克隆工程操作
- Import...导入工程
-
Oxygen Eclipse克隆工程操作
-
-
-
-
- 导入完成后转换工程
-
-
- 5、Gitlab服务器环境搭建
-
6、Git工作流
- Git工作流
-
- 分支实战