## 开发中关于文件的问题
- 文件丢失问题
- 多人协同开发,项目代码合并问题
- 异地开发,代码提交问题
- 需求不明确导致的版本杂乱
+ 完成了项目的第一个版本
+ 完成了项目的第二个版本,在第一个版本的基础上添加了功能A
+ 完成了项目的第三个版本,在第一个版本的基础上添加了功能B
+ 完成了项目的第四个版本,在第二个版本的基础上添加了功能C
+ 完成了项目的第五个版本,在第三个版本的基础上添加了功能D
+ ...
## git版本管理器
- 可以处理上面的问题,git是管理项目版本的
- git就是一个管理项目文件的工具
- 可以管理项目版本,和回退版本
### gitHub 和gitee
- gitHub
+ 是一个世界级的开源网站,我们可以提价项目代码
+ gitHub也可以看做和 `百度贴吧` 一样,很多人可以在这个网站上交流,但是在gitHub上交流的都是程序员
+ gitHub也可以看做和 `百度网盘` 一样,可以向这个网站提交代码文件
+ gitHub也可以看做 个人履历
+ gitHub只接受git方式提交代码数据
- gitee
+ 就是中国的gitHub,网站都是中文的
+ 其他的都是和gitHub差不多,但是在代码提价的时候会有差异
### 名词解释
- 仓库:被git管理的文件夹
+ 本地仓库:本地被git管理的文件夹
+ 远程仓库:远程电脑(gitHub和gitee)上被git管理的文件夹
- 推送:将本地仓库的文件上传到远程仓库
- 拉取:也叫做同步,将远程仓库的文件下载到本地仓库
## git使用
### git安装
- 安装完毕后,git是在命令行中使用的
### 初始化仓库
- 我们需要让git来管理我们的文件夹中的文件
- 在对应的文件夹目录的命令行中执行:`git init`
- 会在目录中出现一个.git的隐藏目录
- 初始化仓库后会将仓库分为三个区
- 工作区:就是我们写项目源码的文件夹
- 暂存区:需要将项目文件存到历史去之前存放的地方
- 历史区:项目代码压形成历史版本就是在历史区
+ 想要项目中的文件形成历史版本并记录,则需要先添加到暂存区,再将暂存区的内容添加到历史区才能形成历史版本(项目版本)
- 查看仓库的状态:`git status`
- 仓库中两个特殊的文件
- `.gitignore`文件:这个文件就是 git 的`黑名单`,将不想要被git管理的文件或文件夹名写到这个文件中
- `.gitkeep`文件:git默认不会管理仓库中的空文件夹,如果想要被git管理这个空文件夹,则可以在这个空文件夹中添加一个`.gitkeep`
### 将工作区的文件添加到暂存区
- 指令:`git add 文件`
- `git add ./html/index.html` 将index.html文件添加到暂存区
- `git add ./css/*` 将css文件夹添加到暂存区
- `git add --all` 将所有文件都添加到暂存区
+ 简写:`git add .` 将所有文件都添加到暂存区
### 将暂存区文件拿回到工作区
- `git reset HEAD -- ./html/index.html ` 将文件拿回到工作区
- `git reset HEAD -- ./css/*`将css文件夹拿回到工作区
- `git reset HEAD -- .` 将暂存区所有内容拿回到工作区
### 将暂存区的添加到历史区,形成历史版本
- `git commit -m '版本注释'` 添加到历史区形成历史版本
+ 注意:如果是第一个安装git在提交到历史区的时候,会报错
+ 只需要设置一次git的配置,设置用户名和邮箱
+ `git config --global user.email "写你的邮箱"`
+ `git config --global user.name "写你名字"`
- `git log` 查看最近版本的历史记录信息
```js
// 版本号
commit 7b72048b116a8a2b663cb818511ebcec0cea5de0 (HEAD -> master)
// 作者
Author: leon <leoncoder.163.com>
// 提交时间
Date: Thu Mar 3 11:06:56 2022 +0800
// 版本注释
版本1
```
- 当提交到历史区后,修改工作区文件的内容,则git管理这次修改后的文件
- 需要添加到历史区形成版本
+ `git add .` 添加到暂存区
+ `git commit -m '版本二'` 添加到历史区形成版本
- 查看版本信息 `git log`
```js
commit 0dfa531b8c23dfe68a31c59641892beeb7b43a0b (HEAD -> master)
Author: leon <leoncoder.163.com>
Date: Thu Mar 3 11:12:55 2022 +0800
版本二
commit 7b72048b116a8a2b663cb818511ebcec0cea5de0
Author: leon <leoncoder.163.com>
Date: Thu Mar 3 11:06:56 2022 +0800
版本1
```
#### 版本回退
- 将工作区的代码版本回退到历史记录中的某一个版本代码
- 使用指令:`git reset --hard 要回退的版本号` 回退到指定的版本
- `git reset --hard HEAD^` 回退到上一个版本(上一次提价操作的版本)
- 在仓库的.git/logs/HEAD文件中记录了所有版本的变更(可以查看所有的版本号)
## 分支
- 默认打开所在的就是主分支master(main)
+ 分支之间互相不会影响各自版本的代码
- 创建分支
+ `git branch 分支名称`
+ 创建分支默认会将所在的分支代码版本复制到新的分支中
- 查看分支
+ `git branch` 查看所有分支,前面有*号的就是当前所在的分支
- 切换分支
+ `git checkout 分支名称` 切换到指定的分支
- 合并分支
+ `git merge 分支名称` 只能在当前分支合并别的分支
- 删除分支
+ `git branch -d 分支名称`
## 推送
- 将本地仓库的版本上传到远程仓库
- 要有一个远程仓库(gitee或gitHub)
- 添加远程仓库地址
- `git remote add origin 你自己的远程仓库地址`
+ `remote` 远程
+ `add` 添加
+ `origin` 仓库地址(变量)
- 上传(推送)
- `git push -u origin "master"`
+ `push` 推送
+ `-u` 记住密码,下次推送不用填密码
+ `origin` 之前添加的远程仓库地址
- 注意:第一次推送gitee的时候会自动弹出 用户名和密码的校验窗口
+ 如果是第一次推送gitHub则需要用户名和密码的校验和 登录的token的校验(要自己先生成token)
## 克隆和拉取
- 克隆就是下载仓库的项目文件
- 克隆可以克隆别人的公开仓库
- 也可以克隆自己的仓库
- `git clone 远程仓库地址`
+ 克隆下载别人的项目修改之后,不能上传到别人的仓库,但是自己的可以
- 如果之前克隆或上传过,后续需要再下载远程仓库中最新的版本代码则,只需要拉取 git pull
## 冲突
- 在上传到远程仓库的时候
- 本地仓库的历史版本和远程仓库的历史版本不一致 就是发生冲突
- 我们可以拉取远程仓库的最新版本,在和本地比对,解决冲突后再提交上传
- `git pull` 我们在拉取的时候,有可能会覆盖本地的代码版本(有风险)
- 可以通过`git fetch` 来获取远程仓库最新代码到新的分支中
- `git fetch origin master:tmp` 将远程仓库的最新版本代码拉取到本地中临时开的tmp分支中
- `git diff tmp ` 主分支和临时分支tmp比较差异(发现了差异解决冲突)
- `git merge tmp` 将改完后的代码合并到主分支 然后提交上传