一、版本控制介绍
1、 目前主流版本控制工具
SVN : 集中式版本控制工具的代表
Git : 分布式版本控制工具的代表
2、Git&GitHub_为什么要使用版本控制
协同修改
多人并行不悖的修改服务器端的同一个文件。
数据备份
不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。
这方面 SVN 采用的是增量式管理的方式,
而 Git 采取了文件系统快照的方式。
权限控制
对团队中参与开发的人员进行权限控制。
对团队外开发者贡献的代码进行审核——Git 独有。
历史记录
查看修改人、修改时间、修改内容、日志信息。
将本地文件恢复到某一个历史状态。
分支管理
允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
二、版本控制简介
1、版本控制
工程设计领域中使用版本控制管理工程蓝图的设计过程。在 IT 开发过程中也可以使用版本控制思想管理
代码的版本迭代。
2.2版本控制工具
思想:版本控制
实现:版本控制工具
集中式版本控制工具:
CVS、SVN、VSS……
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs
三、Git 简史
1、Linu系统版本控制历史
1991年
Linus本人手动合并代码
2002年
使用 商业软件:Bitkeeper
BitKeeper的东家 BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。但是要求不能进行破解。
2005年
Linux社区无法向商业公司那样对参与开发者进行强有力的约束
开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现,要回收Linux社区的免费使用权
因此 Linus自己用C语言开发了一个分布式版本控制系统:Git
主体程序开发完成只用了两周,一个月后Linux系统代码管理有Git管理
2008年
GitHub上线很多开源项目都迁移至上面:
jQuery、PHP、Ruby、……
2、Git 官网和 Logo
官网地址:https://git-scm.com/
3、Git 的优势
大部分操作在本地完成,不需要联网
完整性保证
尽可能添加数据而不是删除或修改数据
分支操作非常快捷流畅
与 Linux 命令全面兼容
分布式的版本控制相对于集中式的版本控制的优点式,有效的避免了单点故障问题
(单点故障是:当远程服务器损坏了,那相应的版本历史数据,就没有了,如果拿其他人的代码在上传就当前版本就以上传的版本为基准,以前的历史数据就没有了)。
4、Git 安装
去下载如下exe应用双击运行
Git-2.19.1-64-bit.exe
5、Git概念
6、Git 和代码托管中心
代码托管中心的任务:维护远程库
局域网环境下
GitLab 服务器
外网环境下
GitHub https://github.com/
7、本地库和远程库
(1)、 团队内部协作
(2)跨团队
四、Git 命令行操作
1、本地库初始化
命令: 初始化创git创库: git init
效果
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修
2、设置签名
形式
用户名:tom
Email 地址:goodMorning@atguigu.com
作用:区分不同开发人员的身份
辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
命令
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name tom_pro
git config user.email goodMorning_pro@atguigu.com
信息保存位置:./.git/config 文件
系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_glb
git config --global goodMorning_pro@atguigu.com
信息保存位置:~/.gitconfig
在当前用户的家目录下的.gitconfig : cd ~
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不
3、基本操作
(1)状态查看
git status
查看工作区、暂存区状态
(2)添加
git add [file name]
将工作区的“新建/修改”添加到暂存区
删除暂存区的文件 git rm --cached goot.txt
给vim设置行号 :set nu
(3) 提交
git commit -m "commit message" [file name]
将暂存区的内容提交到本地库
(4)查看历史记录
git log
多屏显示控制方式:
空格向下翻页
b 向上翻页
q 退出
git log --pretty=oneline
git log --oneline (只能显示以前的记录)
git reflog (显示全部的记录)
HEAD@{移动到当前版本需要多少步}
(5)前进后退
本质
基于索引值操作[推荐]
git reset --hard [局部索引值]
git reset --hard a6ace91
使用^符号:只能后退
git reset --hard HEAD^
注:一个^表示后退一步,n 个表示后退 n 步
只显示指定行的内容: tail -n 3 goods.txt
使用~符号:只能后退
git reset --hard HEAD~n
注:表示后退 n步
(6) reset 命令的三个参数对比
当我们想要查看一个命令的用法时可以打开git的文档查看,使用命令为:
git help [命令]
git help reset
--soft 参数
仅仅在本地库移动 HEAD 指针
--mixed 参数
在本地库移动 HEAD 指针
重置暂存区
--hard 参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区
(7) 删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库。
git reset --hard :重置到当前指针(它拿到本地库的指针,将暂存区和工作区都重置到和本地库的指针一样的位置)
查看位置: git reflog
操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
(8)比较文件差异
git diff [文件名]
将工作区中的文件和暂存区进行比较
和本地库进行比较:
git diff HEAD aa.txt
git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
和 本地仓库的前一个版本比较: git diff HEAD^ aa.txt
不带文件名比较多个文件(不指定文件名,默认当前文件全部比较)
添加到暂存区的删除文件找回
git reset --hard : 刷新暂存区,和工作区
4、分支管理
(1)什么是分支?
在版本控制过程中,使用多条线同时推进多个任务
(2)分支的好处?
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
(3)分支操作
创建分支
git branch [分支名]
查看分支
git branch -v
切换分支
git checkout [分支名]
合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
第二步:执行 merge 命令
git merge [有新内容分支名]
解决冲突
冲突的表现
没有产生额外的文件
冲突的解决
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此时 commit 一定不能带具体文件名
五、 Git 基本原理
1、哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下
几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:
Git 就是靠这种机制来从根本上保证数据完整性的
2、Git 保存版本的机制
(1) 集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基文件
和每个文件随时间逐步累积的差
(2)Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这
个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的
文件。所以 Git 的工作方式可以称之为快照流。
(3) Git 文件管理机制细节
Git 的“提交对象"
提交对象及其父对象形成的链条
3、Git 分支管理机制
(1)分支的创建
(2) 分支的切换
六、GitHub
1、账号信息
GitHub 首页就是注册页面:https://github.com/
登录到GuiHub
2、创建远程库
3、创建远程库地址别名
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
4、推送
git push [别名] [分支]
在推送的过程中会有登录界面弹出,登录即可
5、克隆
命令
git clone [远程地]
效果
完整的把远程库下载到本地
创建 origin 远程地址别名
初始化本地库
小知识:
在git bash 中执行
设置记住密码(默认15分钟):
git config –global credential.helper cache
如果想自己设置时间,可以这样做:
git config credential.helper ‘cache –timeout=3600’
这样就设置一个小时之后失效
长期存储密码:
git config –global credential.helper store
6、团队成员邀请
关于记住密码的原因:
http 本身没有记住密码的功能,能记住密码是因为window系统中的凭据。
如果要输入其他gitHub账号需要删除凭据才能再次登录。
7、拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
注: pull = fetch+merge
8、解决冲突
要点
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
9、跨团队协作
Fork
如果想要一个项目功能想要外人帮助就需要借助git的跨团队协助的功能
1、需要将项目的clone 地址给你帮助你的那个人
2、让帮助你的那个人访问你的项目,然后点击 fork
正在fork...
fork 完成
本地修改,然后推送到远程
Pull Request
1、
2、
3、外来协助者提交,给项目的所有者审核。
4、 项目所有者的操作
5、如果有疑问gitHub上还可以发消息,询问对方
6、对代码进行审核
7、合并代码
添加合并的日志信息:
8、将项目所有者将远程库的代码拉取到本地
10、SSH 登录
进入当前用户的家目录
$ cd ~
删除.ssh 目录
$ rm -rvf .ssh
运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C atguigu2018ybuq@aliyun.com
[注意:这里-C 这个参数是大写的 C]
进入.ssh 目录查看文件列表
$ cd .ssh
$ ls -lF
查看 id_rsa.pub 文件内容
$ cat id_rsa.pub
复制 id_ rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG
keys
New SSH Key
输入复制的密钥信息
回到 Git bash 创建远程地址别名
git remote add origin_ssh git@github.com:atguigu2018ybuq/huashan.git
推送文件进行
admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd ~
admin@DESKTOP-L1ORG9F MINGW64 ~
$ rm -rvf .ssh
admin@DESKTOP-L1ORG9F MINGW64 ~
$ ssh-keygen -t rsa -C 675015048@qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/admin/.ssh/id_rsa):
Created directory '/c/Users/admin/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/admin/.ssh/id_rsa.
Your public key has been saved in /c/Users/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:E67n8hLzq5XNffuX56FgU0M6CML1x32BdYj7Z6zlwtA 675015048@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| . .o+.|
| . . . . o.. o|
| o ... o + . |
| ....o + . |
| S. o = . |
| o. = .+ E =|
| .++ o+.o.B.|
| o+. . o.=o=|
| .=+. ..+=|
+----[SHA256]-----+
admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .s
.soapuios/ .spyder-py3/ .ssh/ .SwitchHosts/ .swt/
admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .s
.soapuios/ .spyder-py3/ .ssh/ .SwitchHosts/ .swt/
admin@DESKTOP-L1ORG9F MINGW64 ~
$ cd .ssh/
admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ ll
total 5
-rw-r--r-- 1 admin 197121 1679 10月 21 15:56 id_rsa
-rw-r--r-- 1 admin 197121 398 10月 21 15:56 id_rsa.pub
admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMr8N3zpLEBpLy+IbrpZ2kz2ywaeIz2AeKVEIi2zzNnsy+AeCdlLjooEZ9tW6dfQHjBTrEMCS3KXM5oSX+rEx7jL9aGmYFAfwbqZdxfeipQKUUMKE0K1UN+jz7Mn800pS+p0sR5P9SiUco/GLAhGVvbRMAVwmfwg1Tqyn3ZpAjD4MsG7sDpJJDcRYJbhdRRuU+CBK0WeXWEq4H1E4ozzfC2Br1THQBAvUQ4FBCLFV1OCKYPORYJb2vy5TluJugVyoV2Wj+7XVVru5CwxjAgA0C9NLKJmYXs6cZwM94xvN3AOsxs9Zx423q2+CSs7gp/6nj226Nxu9sfRfkyi09RqAJ 675015048@qq.com
admin@DESKTOP-L1ORG9F MINGW64 ~/.ssh
$ cd f:/Git/
admin@DESKTOP-L1ORG9F MINGW64 /f/Git
$ cd huashan
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ vim huashanjianfa.txt
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git commit -m " test ssh login" huashanjianfa.txt
[master 4eed0a3] test ssh login
1 file changed, 8 insertions(+), 9 deletions(-)
rewrite huashanjianfa.txt (88%)
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git remote add origin_ssh git@github.com:yaojun1234/huashan.git
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git remote -v
origin https://github.com/yaojun1234/huashan.git (fetch)
origin https://github.com/yaojun1234/huashan.git (push)
origin_ssh git@github.com:yaojun1234/huashan.git (fetch)
origin_ssh git@github.com:yaojun1234/huashan.git (push)
admin@DESKTOP-L1ORG9F MINGW64 /f/Git/huashan (master)
$ git push origin_ssh master
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:yaojun1234/huashan.git
0787145..4eed0a3 master -> master