# 创建、修改、暂存和提交
## Git整体流程图
![](./git.png)
## 创建
要将现有的软件程序纳入git管理，首先是创建版本库（或称存储库）：  
选中要管理的工程文件夹，右键选择“Git 在这里创建版本库”，点击“确定”，git就会在工程目录下创建“.git”文件夹，一个空白的版本库就创建成功。 
## 修改  
在工程目录下，右键选择“TortoiseGit”，在“TortoiseGit”下选择“检查已修改”，会打开一个窗口来显示从上次提交到现在的所有修改。  
双击文件可以查看修改的内容。  
上一步创建了空白的版本库，所以这里是工程目录下的所有文件。  
### 忽略
并不是所有的文件都需要纳入Git管理，有些文件与源代码无关，只是编译生成的中间文件或者用户个人的配置，纳入管理反而增加存储库的内存。  
这里拿Keil的工程举例：  
![](./hello_struct.png)  
“./objects”文件夹下编译生成的中间文件（.o、.d、.crf）是用不到版本管理的。但是生成的hex、bin、scf文件**可以选择**记录。“./listing”下的map文件可以纳入管理。  
用户自己的uvguix文件，不会影响编译结果，也没必要管理。  
我们通过创建.gitignore文件，确定工作目录下哪些文件要纳入管理，哪些文件要忽略掉。  
举例：在Hello目录下创建 “.gitignore” 文件，将./objects文件夹下编译生成的中间文件忽略掉，但是保留生成的hex、bin、scf文件。内容如下：
```
#Git管理忽略文件
#忽略objects文件夹下的所有文件
/objects/*
#在上面基础上将hex文件纳入管理
!/objects/*.hex
#在上面基础上将bin文件纳入管理
!/objects/*.bin
#在上面基础上将sct文件纳入管理
!/objects/*.sct
#忽略keil的用户uvguix文件
*.uvguix.*
#忽略单独一个JLinkLog.txt文件
JLinkLog.txt
```
现在回到“检查已修改”窗口，点击“刷新”按钮，./objects文件夹下只剩hex、bin、scf文件，uvguix文件消失，JLinkLog.txt文件消失。  
## 暂存和提交  
### 暂存
在其他Git客户端中可能有暂存的概念，它们提交的过程为：修改 >> 暂存 >> 提交。  
暂存主要用于分批提交，比如已经开发了A、B两个功能，想要把A、B分开提交，可以先把A的文件放在暂存区，然后提交。再把B放到暂存区，然后提交。  
TortoiseGitz支持勾选文件提交，因此用不到暂存功能，它的提交过程为：修改 >> 提交。  
### 提交
紧跟上面的操作，点击“提交”，弹出提交窗口：  
![](./hello_submit.png)  
最上面是选择提交到哪个分支，现在只有“master”分支。  
然后是本次提交的日志信息，日志信息必须写，不写提交不了。日志信息应尽可能详细，和之前的readme.txt一样。
下面选择要提交的文件，这里我们点击“全部”。
最后点击提交。
## 检出
有时候要临时回到之前的版本工作，这时候用到“检出”。  
在工程目录下，右键选择“TortoiseGit”，在“TortoiseGit”下选择“切换/检出”，弹出“切换/检出”窗口，选择“提交”，点击右边三个点，选择要检出的版本，点确定，然后下面注意不需要选创建新分支（不然还得手动删除），点击确定。  
回到最新更新一样操作。  
![](./git_checkout.png)  
## 回退（慎用）
有时候最近的几次变更不想要了。这时候就要回退了。  
在工程目录下，右键选择“TortoiseGit”，在“TortoiseGit”下选择“显示日志”，弹出“日志信息”窗口，选中要回退到的更改，右键选择“重置xxx到此版本”。点击确定，重置类型选择合适的类型：
- 软重置，要删除的更改退回到暂存区
- 混合，要删除的更改退回到修改状态，适用于稍作改动再提交
- 硬重置，彻底删除更改  
  
点击“刷新”，所选版本之后的版本消失了。
## 贮藏更改
有些情况下，正在开发的功能被打断，需要做其他工作,例如紧急修复BUG。这时需要保留已经更改的代码， “检查已修改” >> 贮藏 >> 填写贮藏日志 >> 确定  
其他工作忙完后，弹出贮藏
