>[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)