文章目录
@版本控制工具
集中式版本控制工具
- 如SVN
- 数据集中在服务器
分布式版本控制工具
- 如Git
- 每个客户端都有自己的历史记录
@优势
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分值操作非常快捷流畅
- 与Linux命令全面兼容
@基本原理
Hash校验
- 靠Hash算法校验下载的文件和原始文件是否相同(SHA1)
保存版本的机制
- 集中式版本控制工具的文件管理机制
- 以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异
- 即每次只保存每个文件修改的部分
- 比如回到version3时,FileA = FileA+A1,FileC = FileC+A1+A2,FileB=FileB
- Git的文件管理机制(快照流)
- Git把数据看作是小型文件系统的一组快照
- 每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引
- 为了高效,如果文件没有修改,Git不再重新存储该文件,而是保留一个链接指针指向之前存储的文件
- 内存存储结构及管理机制
- Git提交对象(对象Hash保存在一棵树)
- 提交对象及其父对象形成的链条
- Git提交对象(对象Hash保存在一棵树)
分支管理的本质是创建和移动指针
@三个区域
- 本地库(历史版本)
- 暂存区(临时存储)
- 工作区(写代码)
联系
工作区- git add - 暂存区 - git commit 本地库
暂存区 - git rm --cached good.txt - 工作区
@代码托管中心
- 任务:维护远程库
- 局域网环境下:GitLab服务器
- 外网环境下:GitHub、码云
联系
# 团队内协作
本地库A - push - 远程库 - clone 本地库B
本地库B - push - 远程库
远程库 - pull - 本地库A
# 跨团队协作
远程库A - fork - 远程库C
远程库C - pull request - 审核 - merge - 远程库A
@分支
简介
- 在版本控制过程中,使用多条线同时推进多个任务
优点
- 同时推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果一个分支开发失败,不会对其他分支有任何影响,删除失败的分支重新开始即可
@命令行操作
本地库操作
- 本地库初始化
- 设置签名
- 格式(用户名:Email地址:)
- 作用:区分不同开发人员的身份
- 辨析:这里设置的签名和登录远程库(代码托管中心)的账号密码没关系
# 初始化命令
git init
# 设置签名,必须设置
# 级别优先级:就近原则,即先选项目级别
# 项目级别/仓库级别:尽在当前本地库范围内有效(当前路径)
# 存放路径:cat .git/config
git config user.name zs_pro
git config user.email zs_pro@163.com
# 系统用户级别:当前操作系统的用户范围
# 存放路径:cat ~/.gitconfig
git config --global user.name zs_glo
git config --global user.email zs_glo@163.com
- 基本操作
- 状态
- 添加
- 提交
# 查看当前状态
git status
# 提交一个文件过程
# 工作区 - 缓存区及返回
git add good.txt
git rm --cached good.txt
# 缓存区提交到本地库,必须在第一行打点信息
git commit good.txt
git commit -m "My first commit" good.txt
- 返回历史版本
# 查看版本信息(只显示一行,显示恢复步数:Head@{num})
git log
git log --oneline
git reflog
# 跳到某一版本
git reset --[选项] 版本号
git reset --hard 82b1d30
# 后退3个版本,3个^,或者~3
git reset --hard HEAD^^^
git reset --hard HEAD~3
# 三个选项
--soft 仅仅在本地库移动HEAD指针
--mixed 在本地库移动HEAD指针,重置暂存区
--hard 在本读库移动HEAD指针,重置暂存区和工作区
# 可退回版本以找回删除文件
# 前提:删除前,文在存在时的状态提交到了本地库
- 比较文件差异
# 工作区的和暂存区的比较
git diff file
# 工作区和本地库历史记录
git diff [HEAD位置] file
# 不加文件名可以比较所有文件
- 分支
# 查看当前分支及所有分支
git branch -v
# 创建分支
git branch [分支名]
git branch host_fix
# 切换当前分支
git checkout host_fix
# 合并分支
# 1. 切换到被合并的分支上(增加新内容)
# 2. 执行merge
git checkout master
git merge host_fix
# 合并冲突
# 1. 同个文件,同个地方若增加则合并
# 2. 若同个地方两个分支添加不同内容,则冲突
# 3. 冲突会进入到解决冲突状态
# 4. 查看status,会提示哪些文件冲突
# 5. 编辑这些文件,会提示冲突地方
# 6. 人为修改编辑后(记得删除特殊符号)保存并commit即可
# 删除target 拉取下来之后把target删掉
git rm -r --cached . #删除当前所有缓存
git add .
git commit -m "fixed untracked files"
git push -u origin master
远程库操作
gitHub创建远程库
- 填写仓库名
- 选择public or private
邀请新成员
- 复制链接,并发给接受者
- 接受者登录后接受
命令行
# 为项目网址(远程库地址起别名)
git remote add [别名] [网址]
git remote add firstProject https://github.com/XF-DD/firstProject.git
# 查看别名集合
git remote -v
#--------上传push--------
git push [路径别名] [本地分支名] //如果远程没有master分支则创建一个
git push firstProject master
# 上传旧版本
git push -f -u [路径别名] [分支名]
# 将本地zs分支传到远程master分支
git push [路径别名] [本地分支名]:[远程分支名]
git push origin zs:master
#-------克隆---------
# 1. 完整的把远程库下载到本地
# 2. 自动初始化本地库
# 3. 自动创建别名等
git clone [网址]
git clone https://github.com/XF-DD/firstProject.git
#------拉取pull操作-------
# fetch + merge
# fetch : 获取远程库所有文件,作为一个分支
# merge : 合并分支
git fetch [远程库别名] [要拉取的远程库的分支名]
git merge [远程库别名/远程分支名]
# 解决冲突
# 如果同时push,第一个有效,第二个会冲突
# 第二个pull失败,需要先pull,再解决冲突,commit之后再push
git pull [远程库别名] [要拉取的远程库的分支名]
# C不加入A而修改代码(gitHub上)
# C fork A ,会将A的远程库扒到C的远程库
# C 正常流程修改,push到自己的本地库后
# C 点击 Pull request -> New pull request -> Create pull request
# A 点击Pull request -> 检查 -> Merge pull request
# OK
设置SSH
# 在家目录(~)创建ssh文件
ssh-keygen -t rsa -C [账号邮箱]
ssh-keygen -t rsa -C xxxx@qq.com
# 复制 .ssh/id_rsa.pub 的值
# 到github的设置->SSH And GPG keys
# 黏贴到new SSH key