参考文献:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
1.版本控制
- 版本控制简介
工程设计领域中使用版本控制管理工程蓝图的设计过程。在IT开发过程中也可以使用版本控制思想管理代码的版本迭代。
- 版本控制工具
- 集中式:CVS、SVN、VSS......
- 分布式:Git、Mercurial、Darcs......
- 版本控制工具应该具有的功能:
- 系统修改
- 数据备份
- 版本管理
- 权限控制 --对团队外开发者贡献的代码进行审核--Git独有。
- 历史记录
- 分支管理
2.Git简介
- Git简史
- Git的优势
- 大部分操作在本地完成,不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与Linux命令完全兼容
- Git结构
- 工作区:写代码
- 暂存区:临时存储
- 本地库:历史版本
工作区--git add-->暂存区--git commit-->本地库
- Git和代码托管中心
代码托管中心的任务:维护远程库
- 局域网环境下:GitLab服务器
- 外网环境下:GitHub、码云
3.Git命令行操作
- 本地库初始化
- 命令:git init
- 效果
- 注意:.git目录中存的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
- 设置签名
- 形式
- 用户名:
- Email地址
- 作用:区分不同开发人员的身份
- 命令
- 项目级别/仓库级别:仅在当前本地库范围内有效
- git config user.name tom
- git config user.email tom@qq.com
- 系统用户级别:登录当前操作系统的用户范围
- git config --global user.name tom_glb
- git config --global user.email tom_glb@qq.com
- 项目级别/仓库级别:仅在当前本地库范围内有效
- 基本操作
- 状态查看
- git status
- 查看工作区、暂存区状态
- 添加操作
- git add [file name]
- 将工作区的“新建/修改”添加到暂存区
- 提交操作
- git commit -m "commit message" [file name]
- 将暂存区的内容提交到本地库
- 查看历史记录操作
- git log
- git log --pretty=oneline
- git log --oneline:该命令只能显示HEAD之后的版本
- git reflog:该命令可以显示所有的版本
-
HEAD@{移动到当前版本需要多少步}
- 版本前进后退
- 本质:git维护一个HEAD指针指向当前的工作区的版本,所以实现版本的前进后退就是操作HEAD指针前进后退。
- 基于索引值操作【推荐】
- git reset --hard[局部索引值]
-
$ git reset --hard 892c6d0
- 使用^符号
- 该符号只能后退,一个^表示后退一步
- git reset --hard HEAD^
-
后退一个版本
- 使用~符号
- 该符号只能后退,可以后退多步
- git reset --hard HEAD~3
-
后退三个版本
- reset命令的三个参数对比
- soft
- 仅仅在本地库移动HEAD指针
- mixed
- 在本地库移动HEAD指针
- 重置暂存区
- hard
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区
- soft
- 删除文件并找回
- 前提:删除前,文件存在时的状态提交到了本地库。
- 操作:git reset --hard[指针位置]
- 删除操作已经提交到本地库:指针位置指向文件存在时的历史记录。
- 删除操作尚未提交到本地库:指针位置使用HEAD。
- 比较文件差异
- git diff [文件名]
- 将工作区的文件和暂存区进行比较
- git diff [本地库中的历史版本] [文件名]
- 将工作区的文件和本地库历史记录比较。
- 不带文件名比较多个文件
- git diff [文件名]
- 分支管理
- 什么是分支:在版本控制中,使用多条线同时推进多个任务。
- 分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对分支有任何影响,失败的分支删除重新开始即可。
- 分支操作
- 创建分支:git branch [分支名]
- 查看分支:git branch -v
- 切换分支:git checkout [分支名]
- 合并分支
- 切换到接受修改的分支上:git checkout[分支名]
- 执行merge命令:git merge [要合并的分支名]
- 解决冲突
- 冲突的表现
- 冲突的解决
- 第一步:编辑文件,删除特殊符号。
- 第二步:把文件修改到满意的程度。
- 第三步:git add [文件名]
- 第四步:git commit -m "日志信息" 。 注意:此时commit一定不能带具体的文静名。
- Git基本原理
- 保存版本的机制:以文件变更列表的方式存储信息。这类系统将它们保存的信息看做是一组基本文件和每个文件 随时间逐步累积的差异。
- Git的文件管理机制:Git把数据看作是小型的文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有被修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git的工作方式可以称为快流照。
- Git的分支管理机制: 本质是创建和移动指针。
- 分支的创建:本质创建指针。
- 切换分支:本质是改变HEAD指针的指向。
- 和远程库交互
- 在本地仓库创建远程库的别名
- git remote add [别名] [远程库地址]
- 推送
- git push [别名] [分支名]
- 克隆
- git clone [远程地址]
- 拉取
- pull=fetch+merge
- git fetch [远程库地址别名] [远程分支名]
- git merge [远程地址别名/远程分支名]
- 协同开发时冲突的解决
- 如果不是基于远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉取下来后如果进入冲突状态,则按照“分支冲突”解决即可。
- 场景四的完整演练
- 题目:在Github.com或Gitee.com上新建一个版本库,并实现如下 commit 网络结点示意图,要求 A 和 B 在本地存在过,但并不出现在远程网络图中。
- 第一步;在Gitee上新建版本库myrebase;
- 第二步:将mybase远程库clone到本地:
- 第三步:创建新分支test;
- 第四步:在master分支上提交三次
- 第五步:切换为分支test 并提交两次
-
test分支上的一个版本在本地库中存在过。
- 第六步:使用rebase命令将最后一次提交删除。
-
可以看到b版本已经不在(d and e 版本是之前的c版本,只不过将日志文件改为了d and e)
- 第七步:两分支合并
- 第八步:push到远程库
-
可以看到远程库中并没有d版本,而有d and e版本。