Git和GitHub
1.版本控制工具应该具备的功能
- 协同修改
- 多人并行不悖的修改服务端的同一个文件
- 数据备份
- 保存每一提交的历史状态
- 版本管理
- git采取文件系统快照
- 权限控制
- 团队外贡献代码进行审核
- 历史记录
- 可以把本地文件回复到某一个历史状态
- 分支管理
- 允许开发团队在工作过程中多条生产线同时推进任务。
2.Git的优势
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作快捷流畅
- 与linux命令全面兼容
3.Git在本地的结构
- 本地库
- 历史版本存储的地方
- 暂存区
- 临时存储
- 工作区
- 写代码
- 新建修改文件
工作流程
工作区–>git add–> 暂存区–>git commit –>本地库
4.Git和代码托管中心
- 局域网环境下
- GitLab服务器
- 外网环境下
- GitHub
- 码云
4.1 代码托管中心的任务
- 维护远程库
5 本地库和远程库的交互方式
- 团队内部协作
- 跨团队合作
5.1团队内部协作
- 本地库1(初始创建人)
- 代码开始在本地
- 本地库1使用
push命令,把本地文件推到远程库 - 在本地库2把demo提交上去以后,本地库1可以使用
pull命令把代码拉取下载下来
- 本地库2
- 本地库2本来为空
- 对远程库使用
clone命令,把远程项目克隆到自己的本地库- 这个
clone是有初始化作用的 - clone命令,是只用从远程库把所有代码都复制下来的时候才使用
- 这个
- 本地库2在本地写好代码后,要把更新内容同步到远程库
- 先加入本地库1的团队
- 然后使用
push命令把内容传递到远程库
- 远程库
(代码托管中心)
5.2 跨团队协作
A和B为一个团队,C不属于AB的团队,但是C要协助AB完成项目怎么办?
- A使用
fork命令,复制一份内容,这个内容是属于C的 - C使用
clone把文件克隆到本地 - C完成代码以先把文件push到fork过来的远程库内
- 然后使用
pull request命令,向A发起拉去请求 - A检查完C的代码以后,使用
merge命令,将C提供的代码合并到AB的远程库内
6.Git命令行操作
- 本地库操作
- 远程库操作
6.1 本地库操作
6.1.1 本地库初始化
- 命令:git init
- 效果:
- 注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改
6.1.2 设置签名
- 形式
- 用户名:tom
- Emali地址:goodMorning@qq.com
- 作用:区分不同开发人员的身份
- 辨析:这里设置的签明和登录远程库(代码托管中心)的账号、密码没有任何关系
- 命令:
- 项目级别/仓库级别:仅在当前本地库范围内有效
- 比如WeChat这个项目内有效
git configgit config user.email goodMorning_pro@qq.com
- 系统用户级别:登录当前操作系统 的用户范围
git config –globalgit config --global user.email goodMorning_pro@qq.com
- 优先级别
- 就近原则:【项目级别】>【系统用户级别】
- 两个起码得有一个,不能二者都没有
- 项目级别/仓库级别:仅在当前本地库范围内有效
- 项目级别签名保存位置:
cat ./git/config- 当前项目下的
./get/config这个文件
- 当前项目下的
- 系统级别签明保存位置:
~/.gitconfig
6.1.3 添加提交以及查看状态操作
git status:看看暂存工作区、暂存区的状态git add good.txt:把工作区的good.txt这个文件添加到暂存区- 注意:新建文件必须使用add添加
git rm --cached good.txt:把good.txt这个文件从暂存区移出来git commit good.txt:把暂存区good.txt这个文件提交到本地库git commit -m "commit message" [file name]:提交操作,提交信息为commit message
6.1.4 实现版本的前进和后退
6.1.4.1 查看历史版本记录
git log:最完整的版本形式形式- 空格向下翻页
- b向下翻页
- q推出
git log --pretty=oneline:简洁地显示方式git log --oneline:更简洁地显示方式,简化了哈希值- :在oneline的基础上,显示移动到当前的版本需要多少步
git reflog
6.1.4.2 前进后退历史版本操作和本质
本质:移动head指针,head指针指向哈希值
**操作:**
- 基于索引值的操作
git reset --hard [这里写局部的索引值]- 举例:git reset —hard 4ea7816
- 使用^(异或符号):
- 只能后退,不能往前(不能去新版本)
git reset --hard HEAD^- HEAD后面有几个==^==就往后退几个版本
- 使用
~n符号- 代表要后退n个版本
git reset --hard HEAD~3
reset命令的三个参数对比
- —soft参数
- 仅仅在本地库移动指针
- —mixed 参数(凸显工作区)
- 在本地库移动HEAD指针
- 重置暂存区(移动暂存区)
- —hard参数(三个区域同时移动)
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
6.1.5 永久删除文件及已删除文件的召回
注意:这里的删除指的是从本地库删除
删除前,文件存在时的状态提交到了本地库**前提:**
召回:直接跳转到没有被删除的版本就可以了
- git reset —hard [指针位置]
- 删除记录已经提交到本地库:指针位置指向历史记录(还未删除前的记录)
- 删除操作记录没有提交到本地库:指针位置用HEAD
6.1.6 比较文件的差异
git diff [文件名]
- 将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]
- 将工作区中的文件和本地历史记录笔记哦阿
不带文件名的命令
- 比较当前工作区域中的所有文件
6.2 分支概述
6.2.1 什么是分支
在版本控制过程中,使用多条线同时推进多个任务
6.2.2 分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。
失败的分支删除重新开始即可。
6.2.3 分支操作
- 创建分支:
- git branch [分支名]
- 查看分支:
- git branch -v
- 切换分支:
- git checkout [分支名]
- 合并分支:
- 第一步:切换到接受修改的分支(那个分支要被修改被合并,就切换到那个上面)
- git checkout [分支名]
- 第二步:执行
merge命令- git merge [分支名]
- 注意,这个分支名,不是刚才切换过来现在所在分支。而是现在这个分支所想要合并的分支。
- 第一步:切换到接受修改的分支(那个分支要被修改被合并,就切换到那个上面)
产生冲突怎么解决?
什么叫做冲突?
- 不同分支对同一个文件进行了修改,在合并分支的时候会产生冲突,不能合并
解决冲突
get clone url:从git服务器拉取代码get push:将本地库代码推送到服务器上get pull origin 文件路径:从服务器上拉取最新的代码
