tic例会 - Git ===
主讲人 : dinglz
Let's start - 单击右下角的向右或者键盘的右方向键
#### 在阅读本ppt前你可能需要知道的 - 一张ppt不仅可以左右滑动,也可以**上下滑动**,比如你现在**向下**可以看到下面几点的详细内容 - 你可以通过键盘上的上下左右键滑动ppt - 如何搜索ppt内容 - 如何预览ppt大纲
搜索: 按 CTRL+Shift+F 可以搜索幻灯片内容。
按Esc或者o键可以看到本ppt的大纲
那么现在,你已经学会了该ppt文档的基本使用方法
Let's continue learning
什么是git
Git是目前世界上**最先进**的分布式版本控制系统!
#### 什么是版本控制系统 - 一个项目,不可能一次完工,需要**反复修改**内容等等,而且有很多文件。 - 版本控制系统可以帮你记录每次修改的内容,这样就可以轻松**回到某个版本**。并查看自己的修改记录。 - 版本控制系统也支持**多人协作**,记录每个人的修改内容,这样项目开发就更加**条理清晰**
#### Git就是一个版本控制系统 - 本次例会的主要内容就是要带大家学会Git的基本操作和协作方式,借助**github**这个平台进行项目管理和多人协作 - 帮助大家摆脱掉用QQ互传代码文件的原始时期~
## 欢迎关注我们的github组织! [https://github.com/TIC-DLUT](https://github.com/TIC-DLUT)
安装Git
前往:
https://git-scm.com/
安装即可
初始化Git仓库
- Git仓库:一个Git仓库其实就是一个目录,目录里的**所有文件**都可以被Git管理 - 所以,我们想创建一个空的git仓库,首先需要创建一个空目录 - **注意!!**如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
## 在空目录下打开命令行 ## 通过`git init`命令把这个目录变成Git可以管理的目录 ``` bash [1] git init ```
- 瞬间Git便把仓库建好了,此时:目录下多了一个.git目录 - .git目录用于让git跟踪管理版本库 - 如果你没有看到.git目录,那是因为这个目录默认是**隐藏**的
## 为仓库添加文件 - 并**不是**在文件夹中放入文件就会被放入仓库 - 我们需要通过`git add`命令把文件**添加**到仓库中 - 比如,让我们新建一个test.txt文件,用`git add test.txt`命令把该文件添加到我们的仓库中 - 如果想一次性把**所有**文件都加入到仓库中,可以使用`git add -A`命令
提交修改
- Git会帮我们记住修改记录,但是,每次完成一次修改我们需要进行一次**提交** - 你可以把提交理解为一次保存(对仓库中的**所有**文件进行保存) - 后面我们会介绍如何回到之前任意一次提交 - 为了记录修改的内容,我们在**每次**提交需要加上**提交信息**,用于记录**本次**提交完成了哪些工作
## 浅谈提交信息 - 提交信息一定要**有意义**,**简洁**记录本次修改的内容 - 提交信息最好有**统一格式**,比如操作:修改内容,例如:feat:增加功能,fix:修复xxBug,等等 - vscode中可以通过`git-commit-plugin`插件来生成每次commit的内容

## 提交命令 - `git commit -m "提交信息"` - 不要堆积很多修改后再commit,尽量每一部分修改后进行一次commit,方便进行回溯等等操作
时光机穿梭
## 查看当前仓库状态 - 你可以通过`git status`查看当前仓库状态 - 比如,你可以新建个文件,修改点内容后用`git status`看看现在是什么状态 - **注意**,想要git管理文件,将文件添加到仓库中的操作是必须的
## 查看提交记录 - 现在让我们多commit几次 - 然后,通过`git log`命令查看提交记录 - 可以看到,从**最近**到**最远**的提交日志出现了 - 我们可以加上`--pretty=oneline`参数来简化日志,即:`git log --pretty=oneline`
## 版本回退 - 当**当前代码**出现问题时,我们可以通过`git reset`命令**回退**到以前的提交 - 刚刚我们通过`git log`可以看到每一次的commit ID,我们通过`git reset --hard commitID`可以退到对应的提交 - `--hard`会回退到上个版本的**已提交**状态,而`--soft`会回退到上个版本的**未提交**状态,`--mixed`会回退到上个版本**未添加**的状态 - 正常来说,使用`--hard`即可
> 值得一提的是:commitID可以用HEAD表示,在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
## 撤销修改 - 当你未进行一次commit时,你可能对一个文件的修改不满意,这个时候无需commit后进行`git reset` - 只需要`git checkout -- 文件名`**撤销**对应文件的修改
远程仓库
## 将代码同步到github 0. github是全世界最大的git代码托管平台,让我们在github上创建一个仓库 1. 把github仓库源添加到本地仓库中 2. 把本地仓库同步到在线仓库
### 把github仓库源添加到本地仓库中 1. 在github打开**空仓库**时可以看到**https链接**或者**ssh链接**,形如:`https://github.com/dingdinglz/learngit.git`,或者点击绿色的Code下拉按钮可以看到 2. 为本地仓库添加远程源:`git remote add origin [https链接]` 3. origin是远程仓库的默认name,用其他名字替代也可
## 把本地仓库同步到在线仓库 - `git push -u origin main`,这句的意思是将main分支推送到远程仓库,我们稍后会介绍分支,main分支通常是一个仓库的**默认分支**,也是主分支 - `-u`参数会把本地的main分支与远程的main分支**关联**起来,这样我们在本地进行修改commit后,只需要通过`git push`就可以推送代码,不需要指定目标和分支
## 克隆远程仓库 - 从github克隆一个仓库,自己或者别人的都可以,`git clone 远程链接`,同样的,https与ssh都可以,例如:`git clone https://github.com/dingdinglz/vivo.git` - 当远程仓库**更新**时,你可以用`git pull`使自己的本地仓库与远程仓库保持一致,也就是保持最新 - 当你clone一个仓库时,自动**绑定**了远程仓库,有commit后直接`git push`即可推送代码
分支管理
## 为什么需要分支 - 通常来说,我们认为一个**并非积极开发中**的仓库的主分支中的代码是完善的 - 开发中,出现未来得及**测试**或者**未完成**的代码是很正常的 - 因此我们就需要维护一套或**几套**代码,分支就可以完成改功能,通过PR我们可以**合并**分支
## 创建分支与切换分支 - 我们通过`git branch 分支名`可以**创建**一个分支 - 通过`git checkout 分支名`可以**切换**到一个分支,`git switch 分支名`也可以 - `git checkout -b 分支名`表示创建并切换分支,**等效于**先branch再checkout - 一个新分支需要用`git push -u origin 分支名`推送并关联
## 分支合并 - 需要将两个分支进行**合并**时,我们可以切换到需要合并到分支,然后`git merge 需要被合并的分支` - 有时,我们可能遇到**冲突**,比如两个分支都修改了某个地方,解决冲突后进行`commit`即可
## pull request - 你可以通过在github上发送PR(即pull request)的方式,**合并**自己仓库的两个分支 - 你也可以fork别人的仓库(即复制一份别人的仓库),修改后,通过PR请求合并到主仓库,从而达到**多人协作**的目的
## Stash - 我们在实际开发中,经常会遇到当前分支没有**修改完毕**,不能提交,但要转头修改另一个分支的情况 - 这个时候,我们可以通过`git stash`**保存**当前工作进度,然后切换到其他分支 - 切换回来后,使用`git stash pop`即可**还原**原工作进度
## 分支使用技巧 - (积极开发时,使用一个默认的main分支即可) - main分支用来存放**稳定**的、经过**测试**的代码 - 当需要开发一个新功能时,开一个feature-xxx分支 - 功能开发结束,将feature-xxx分支合并到test分支,并添加对应的测试用例,经过测试后,合并到dev分支 - 过段时间后,稳定无bug,可合并至main分支
标签管理
- 当我们需要发布一个版本时,我们可以打一个标签(tag)(github要求Release必须有tag) - tag指向一次commit,代表一次阶段性的胜利! - 打tag的方法也比较简单,只需要提交后用`git tag tagName`即可,tagName可以是版本号,形如v1.1.1 - 注意,对标签**更改**后,下次push需要带上`--tags`
## Tag常见操作 - 删除tag:`git tag -d tagName` - 查看tag信息:`git show tagName`
Github特性介绍
## README - github的每个仓库都可以有一个自述文件,以readme.md为名 - readme.md使用markdown语法,在仓库首页展示 - 一个优秀的仓库需要一个**清晰详细**的readme
## 发布 - 你可以发布可执行文件等等
## Github Action - Github Action是一个仓库的一组**自动化**脚本 - Github Action有一个运行的**时机**,然后执行**特定**的操作 - 你可以用来自动部署、自动生成多平台可执行文件并发布等等
## Github Pages - 你部署静态文件 - 支持绑定自定义域名 - 可以结合Github Actions实现自动化部署
多人协作
1. 协商分工、确定每个人负责的功能部分 2. 创建仓库(通常是前端、后端各一个),由每部分负责人创建,或者新建一个组织 3. 指定taskList,即开发计划表,需分清轻重缓急 4. fork对应的仓库,开发 5. PR,技术力高的同学进行`code review`,处理冲突、合并