>[success] # 获取GIT 仓库
* `Workspace`工作区:工作区编写代码地方
* `Index / Stage`暂存区:暂存区临时存放每一个次修改的代码,此时并没有生成历史版本,**暂存区**可以理解为一个**虚拟工作区**,这个虚拟工作区会跟踪工作区的文件变化(增删改等操作)。这个工作区的位于`.git`文件夹下的`index`目录下。除非是绕过暂存区直接提交,否则Git想把修改提交上去,就必须将修改存入暂存区最后才能`commit`。每次提交的是暂存区所对应的**文件快照**
`git add` 添加的不是文件名,而是**文件的改动内容(集中收集改动以待提交)**,是具体的对改动内容的一个快照,这里使用 `sourceTree `工具更形象的看一下,看到 `b` 文件从来没有被在暂存区标记,`a` 已经在暂存区标记过了,更新对比不是整个文件只是改动内容
* 通过sourceTree 工具来看

* 命令行看

* **Repository:仓库区(或本地仓库)**、
* **Remote:远程仓库**
**工作原理 / 流程图**

1. `git init` 初始化一个本地`git`仓库,执行命令后会创建一个名为` .git` 的子目录
2. `git clone 远程地址`,拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改,会创建一个`.git` 的子目录
* **关于`.git`文件夹**包含项目在版本控制中所需的所有信息以及有关提交,远程存储库地址等的所有信息.所有这些信息都存在于此文件夹中.它还包含一个存储您的提交历史记录的日志,以便您可以回滚到历史记录.

3. 你需要将**某些文件交由这个Git仓库**来管理,之后会在**修改文件的内容**,当达成某一个目标时,想要记录下来这次操作,就会将它**提交到仓库中**,记住这个顺序
* 告诉git 那些文件需要被记录,
* 被记录的文件触发改变的时候进行提交
4. 根据上面的步骤整个代码就可以划分为两种状态
* **未跟踪**:默认情况下,Git仓库下的文件也没有添加到Git仓库管理中,我们需要通过add命令来操作
* **已跟踪**:添加到Git仓库管理的文件处于已跟踪状态,Git可以对其进行各种跟踪管理
>[success] # 仓库流程
1. 需要先将文件状态为**untracked files (未追踪的文件)** 或者**modified(modified 一些改动)** 从工作区提交到暂存区 执行`git add 文件`
2. `git commit –m "提交信息"`将暂存区域的文件提交到**本地仓库**
3. 使用 `git push` 来把你的本地提交发布(即上传到中央仓库)
* git 仓库


>[info] ## 完整提交的各个环节(git status 查看状态)
1. 创建了一个 `test` 文件夹,并将里面创建了 `a.js` 文件,此时创建的文件都是未跟踪状态因为新文件
* 命令行。下面命令行的含义
你在 `master branch`
当前 `branch `没有落后于 `origin/master`
你有 `untracked files (未追踪的文件)`,文件名是 test/。
你可以使用 `git add` 来开始追踪文件。

* sourceTree

2. 使用 `git add test` 将test 文件暂存并加入状态追踪
* 命令行
`test/a.js`文字变成了绿色,它的前面多了「new file:」的标记,描述也从 "**Untracked files**" 变成了 "**Changes to be commited**",文件的状态从 "**untracked**"(未跟踪)变成了 "**staged**"(已暂存),**这个文件中被改动的部分被记录进了 staging area(暂存区)**

* sourceTree

3. 使用 `git commit -m '提交信息' `(如果不使用-m,那么会进入vim编译器操作提交内容备注)将暂存区文件提交到本地仓库
* 命令行 此时文件已经提交到了本地`git`仓库,并且提示有个提交远程没有

* sourceTree

4. 使用 `git push` 推送到远程
* 命令行 推送远程后 显示没有文件

* sourceTree

>[danger] ##### 对已有记录文件状态提交
1. 对已经追踪的文件进行内容修改后查看当前文件状体
* **命令行**
`test/a.js`变红了,不过这次它左边的文字不是 "New file:" 而是 "modified:",而且上方显示它的状态也不是 "Untracked" 而是 "not staged for commit",意思很明确:Git 已经认识这个文件了,它不是个新文件,但它有了一些改动

* **sourceTree**

2. 剩下步骤都一样进行 `git add` `git commit`
>[danger] ##### git add 说明
假如你修改了文件`a.txt`,然后把它`add`进了暂存区:
~~~csharp
git add a.txt
git status
~~~

然后你又往`a.txt`里写了几行东西。这时候你再`status`一下的话:
~~~lua
git status
~~~

你会发现你的`a.txt`既在 "Changes to be commited" 的暂存区,又在 "Changes not staged for commit"。不用觉得奇怪,这是因为通过`add`添加进暂存区的不是文件名,而是具体的文件改动内容。你在`add`时的改动都被添加进了暂存区,但在`add`之后的新改动并不会自动被添加进暂存区。在这时如果你提交:
~~~sql
git commit
~~~
那么你那些新的改动是不会被提交的
>[danger] ##### 总结
**'工作区' =》'暂存区' =》 '历史区' =》'远程仓库'**,新创建的文件都还未被`git` 追踪需要使用`git add` 放入暂存区形成追踪然后依次提交本地仓库在本地仓库,如果是已经追踪的文件当修改的时候,会追踪到修改的部分,需要将修改的部分使用`git add` 放入暂存区,在依次提交本地仓库在本地仓库
1. 整体操作把写完的代码提交(先用`git add 文件名`把文件添加到暂存区,再用`git commit`提交)
* 在这个过程中,可以使用`git status`来随时查看工作目录的状态
* 每个文件有 "changed / unstaged"(已修改), "staged"(已修改并暂存), "commited"(已提交) 三种状态,以及一种特殊状态 "untracked"(未跟踪)
2. 提交一次或多次之后,把本地提交`push`到中央仓库(`git push`)

>[info] ## 文章参考
[Git 原理详解及实用指南](https://juejin.cn/book/6844733697996881928)