一、问题场景分析
1.1 场景
大家应该接触过如下场景:
当我们编写文档的时候,有时需要做非常多的修改。
问题1:想删除一个段落,又怕将来想恢复找不回来怎么办?
出于谨慎和可回溯的办事原则,一个好习惯就是保存之前各个版本的备份
但是这又面临新的问题:
问题2:文件太多,因为怕找不到之前删除的内容,又不敢删。
问题3:当这份文件需要交付给某个大佬查看,或者是同学和同时进行协作。如果他要修改。
那在你发文件给他,到他返回文件给你前,你轻易不会操作,因为合并你们两人的操作是一件麻烦的事。
(当然问题2可以使用在线文档解决,但如果没网怎么办,我们的编辑能存放住么?)
1.2 设想
是否存在一种工具,帮助我解决以下问题?
- 记录每次文件的改动,减少文件备份的保存(解决问题1:删除的内容找不到、问题2:文件多又不敢删)
- 可以多人同时协作,由工具处理双方操作的合并问题。
以上问题,就是分布式版本控制解决的问题。
- 分布式:多人多地协作处理数据,每个人,每个节点都拥有全阶段,全版本的数据。
- 版本控制:针对不同版本的存储,记录,对比,合并,回滚等等。。。。。
这样,你可以解放大脑,专注于处理文档内容。
二、Git 简介
Git,是一个分布式版本控制软件(同类软件还有BitKeeper、Mercurial等)
由Linus(linux的创始人)基于C语言开发。
最初目的:linus为了更好地管理Linux内核开发(关于Git问世有一些有趣的插曲,大家可以自行了解)。
功能概述:多人多地协作开发、在线 / 离线版本控制。
功能
- 为每一次变更提交版本更新,备注更新的内容
- 在项目的各个历史版本之间自如切换
- 清晰比较两个版本之间的差异
- 从当前的修改中撤销一些操作
- 创建分支、合并分支
- 多人协作开发
三、基本概念
3.1 工作区域
Git的工作区结构
- 本地
- 工作目录(Working Directory)
- 暂存区(Stage / index)
- 资源库(Repository)
- 远程云端
- 远程仓库(Romete/ Origin)
分区的转换关系
四个分区的转换关系如下(下图中 ,暂且有个印象,清楚大概流程):
- WorkSpace: 工作区,放代码的地方
- Index / Stage: 暂存区,用于存放你你的改动,底层是由文件的形式维护(原理篇讲解)
- Repository: 本地仓库,用于存放提交所有版本的数据(原理篇讲解),
- 有一个指针HEAD只想最新放入仓库的版本。
- Romote: 远程仓库 / Origin
- 简单理解:远程仓库就是托管代码的服务器,可以在上面维护完整开发周期的项目。
- 远程仓库的部署载体,可以自己搭建服务器,也可以使用第三方托管平台:gitee、github
3.2 工作流程
git的工作流程一般是这样的:
- 在工作目录中添加,修改文件; (需要保存的代码 userMapper)
- 将需要进行版本管理的文件放入暂存区;(git add)
- 将暂存区的文件提交到git仓库.(git commit)
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
3.3 忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立".gitignore"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
3.4 分支 Branch
分支 -- > 平行宇宙
检出后的分支不受其他分支的影响,所以在同一个项目里可以通过检出多条分支来实现同时进行多个修改。
分支的出现,提高的是多人同时协作的效率。
- 远程仓库中最初只有一条分支,默认名为 master
- 分支可以检出其他的分支到自身(生成副本)
- 可切换到任意分支,对分支进行CURD
- 修改完成后,将修改的部分加入到缓冲区(add) ,并提交(commit) ,所做的修改将会同步到远程仓库。
- 合并到你要合并的分支,有可能出现冲突。
git分支中常用指令:
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 合并指定分支到当前分支
git merge [branch]
# 删除分支
git branch -d [branch-name]
# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
3.5 冲突 Conflict
单人开发的所有操作,可以在一条分支上按时间进行,除代码本身的问题,不会有其他问题。
多人开发的操作可能出现,多条分支同时操作同一数据,此时在合并的时候,后合并的一方会显示出现冲突,GIt会造成疑惑,应该听谁的呢?就会造成冲突。
如何解决?
查看出现冲突的文件(有对应指令),此时git会在出现冲突的文件内容标识两者出现冲突的部分,供用户修改,修改完成后重新加入到缓冲区,执行commit。
四、实战操作
4.1 准备环境搭建
- 安装Git软件(使用腾讯软件中心即可)
- 教程 (执行到四、远程仓库配置)
- 桌面右键找到 Git Bash Here, 注册GIT账号信息(初始化)
- 要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录
-
git config --global user.name "John Doe" git config --global user.email johndoe@example.com
- 创建 Gitee 账户,创建一个码云 Gitee 账户,拿刚刚注册的邮箱注册
- 官网链接: gitee.com/
- 通过管理员提供的项目链接,加入对应的项目中
- 生成ssh公钥
- 打开cmd,敲命令如下 :
-
ssh-keygen -t rsa -C "自己的邮箱"
-
- 然后连续敲三次回车,出现了一个奇怪的图像,生成你自己的密钥。
- 找到SSH文件,路径在
C:/User/用户/.ssh下,id_rsa为私钥,id_rsa.pub为公钥。
- 打开cmd,敲命令如下 :
- 首次使用需要确认并添加主机到本机SSH可信列表,把公钥放在相应平台上
- ssh -T git@gitee.com
- 若返回
Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.内容,则证明添加成功。
4.2 搭建本地仓库
- 创建全新的仓库
# 进入一个空文件(路径不要有中文) git init # 初始化一个全新的空文件夹,文件夹的名字由你设置 git init <文件夹名> - 克隆远程仓库
# 使用ssh克隆 (下文的“ssh” 由 官方生成的 ssh 替换) git remote add origin ssh #或者git clone git clone https://github.com/xxxxx/xxxx
4.2 常用指令汇总
# 初始化仓库
git init
# 连接仓库(这里的 ssh 是直接复制粘贴官网的 ssh )
git remote add origin ssh
# ※ 获取当前最新版本※
git pull
# 从远程仓库拉 dev 分支,创建dev分支并转到dev分支
git checkout -b dev origin/dev
# 如果提示不能映射dev的话,使用以下两个命令之一拉取远程仓库的分支
# git fetch origin
# git remote update origin --prune
# 获取当前分支及所有分支
git branch
# ※转到某分支
git checkout feature
# 新建分支
git checkout -b feature
# 对文件进行CRUD,进行自己的活动
# ※ 将文件加入到缓冲区(add”和”.“中间有空格)※
git add .
# ※ 提交修改※
git commit -m "完成xxx修改 张三 2021-11-3 00:28"
# ※ 返回dev分支
git checkout dev
# ※ 在上传之前先获取当前最新版本
git pull
# ※ feature与dev分支合并
git merge feature --no-ff
输入“`:wq`”按回车
# ※ 上传
git push
# 如果有冲突,提示中会给出,百度翻译即可定位
# 删除分支
git branch -d 分支名