>[success] # 获取GIT 仓库
* `Workspace`工作区:工作区编写代码地方
* `Index / Stage`暂存区:暂存区临时存放每一个次修改的代码,此时并没有生成历史版本,**暂存区**可以理解为一个**虚拟工作区**,这个虚拟工作区会跟踪工作区的文件变化(增删改等操作)。这个工作区的位于`.git`文件夹下的`index`目录下。除非是绕过暂存区直接提交,否则Git想把修改提交上去,就必须将修改存入暂存区最后才能`commit`。每次提交的是暂存区所对应的**文件快照**
`git add` 添加的不是文件名,而是**文件的改动内容(集中收集改动以待提交)**,是具体的对改动内容的一个快照,这里使用 `sourceTree `工具更形象的看一下,看到 `b` 文件从来没有被在暂存区标记,`a` 已经在暂存区标记过了,更新对比不是整个文件只是改动内容
* 通过sourceTree 工具来看
![](https://img.kancloud.cn/a5/89/a589ed0b9370c43a88e19305fc204263_583x435.png)
* 命令行看
![](https://img.kancloud.cn/83/12/8312e16cf5f8d8aea4f7e8fc362b23e8_633x218.png)
* **Repository:仓库区(或本地仓库)**、
* **Remote:远程仓库**
**工作原理 / 流程图**
![](https://img.kancloud.cn/42/57/42576ced8f02bbd0418ad88cd59718d6_881x283.png)
1. `git init` 初始化一个本地`git`仓库,执行命令后会创建一个名为` .git` 的子目录
2. `git clone 远程地址`,拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改,会创建一个`.git` 的子目录
* **关于`.git`文件夹**包含项目在版本控制中所需的所有信息以及有关提交,远程存储库地址等的所有信息.所有这些信息都存在于此文件夹中.它还包含一个存储您的提交历史记录的日志,以便您可以回滚到历史记录.
![](https://img.kancloud.cn/c1/1a/c11af436f1cdb74a3fb2d4c87fbbf543_360x46.png)
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 仓库
![](https://img.kancloud.cn/1e/5a/1e5a3b2ba8926ed14f71fc909925df5b_1410x643.png)
![](https://img.kancloud.cn/35/74/3574652220d195b67b2f475d6d158b97_772x362.png)
>[info] ## 完整提交的各个环节(git status 查看状态)
1. 创建了一个 `test` 文件夹,并将里面创建了 `a.js` 文件,此时创建的文件都是未跟踪状态因为新文件
* 命令行。下面命令行的含义
你在 `master branch`
当前 `branch `没有落后于 `origin/master`
你有 `untracked files (未追踪的文件)`,文件名是 test/。
你可以使用 `git add` 来开始追踪文件。
![](https://img.kancloud.cn/07/aa/07aaaa39b1a2ebf926401e23c79c4d11_568x164.png)
* sourceTree
![](https://img.kancloud.cn/39/da/39da62e740b4bf6ea85c93485275483b_481x454.png)
2. 使用 `git add test` 将test 文件暂存并加入状态追踪
* 命令行
`test/a.js`文字变成了绿色,它的前面多了「new file:」的标记,描述也从 "**Untracked files**" 变成了 "**Changes to be commited**",文件的状态从 "**untracked**"(未跟踪)变成了 "**staged**"(已暂存),**这个文件中被改动的部分被记录进了 staging area(暂存区)**
![](https://img.kancloud.cn/1a/d4/1ad4c6e77545d4dda34ad8f89afe9237_412x137.png)
* sourceTree
![](https://img.kancloud.cn/bd/19/bd19e5f5a5febee8586e31ce3844486c_486x429.png)
3. 使用 `git commit -m '提交信息' `(如果不使用-m,那么会进入vim编译器操作提交内容备注)将暂存区文件提交到本地仓库
* 命令行 此时文件已经提交到了本地`git`仓库,并且提示有个提交远程没有
![](https://img.kancloud.cn/84/f4/84f4e43f973199beca0f4c86f4be64dd_412x105.png)
* sourceTree
![](https://img.kancloud.cn/8f/a6/8fa62ee6f9b7790d9d18dc6e0e8ac4e5_623x31.png)
4. 使用 `git push` 推送到远程
* 命令行 推送远程后 显示没有文件
![](https://img.kancloud.cn/d0/52/d05227a3793c95312b044689b8f8372d_414x98.png)
* sourceTree
![](https://img.kancloud.cn/dd/db/dddb4ca972b3858f8b7981b20797f6d4_558x27.png)
>[danger] ##### 对已有记录文件状态提交
1. 对已经追踪的文件进行内容修改后查看当前文件状体
* **命令行**
`test/a.js`变红了,不过这次它左边的文字不是 "New file:" 而是 "modified:",而且上方显示它的状态也不是 "Untracked" 而是 "not staged for commit",意思很明确:Git 已经认识这个文件了,它不是个新文件,但它有了一些改动
![](https://img.kancloud.cn/4e/0b/4e0ba48f96aca2ab0d7da0b27e4758f9_517x177.png)
* **sourceTree**
![](https://img.kancloud.cn/ad/21/ad21cb797d576cefa07a0b90fa75f8df_922x427.png)
2. 剩下步骤都一样进行 `git add` `git commit`
>[danger] ##### git add 说明
假如你修改了文件`a.txt`,然后把它`add`进了暂存区:
~~~csharp
git add a.txt
git status
~~~
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2017/11/22/15fe36e3ee50d1a6~tplv-t2oaga2asx-zoom-in-crop-mark:3024:0:0:0.awebp)
然后你又往`a.txt`里写了几行东西。这时候你再`status`一下的话:
~~~lua
git status
~~~
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2017/11/22/15fe36e3ed9f9877~tplv-t2oaga2asx-zoom-in-crop-mark:3024:0:0:0.awebp)
你会发现你的`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`)
![](https://img.kancloud.cn/90/d0/90d030c6a2951ad10d05370eef8efa06_1185x519.png)
>[info] ## 文章参考
[Git 原理详解及实用指南](https://juejin.cn/book/6844733697996881928)