GIT暫存區-Stage
這是開篇
有人說,暫存區是 Git 最精彩的設計,同時也是最難理解的部分,兩者我都感覺不太明顯,但當我想寫關於暫存區的理解後,發現的確不怎麼好講,這個玩意,有點只可意會的感覺,用 Git 用熟練了,很自然體會到暫存區設計的精彩之處。
在我看來,學習其他命令之前,對暫存區有一個概念和大概理解是非常重要的,因為,很多命令都涉及到了它。
為什麼 commit 之前要先 add 一下呢?
我在剛接觸 Git 命令的時候,對 Git 沒什麼概念,就是趕鴨子上線式的學習,用到什麼,就去 Google 什麼,例如第一天我搜索的就是“git first commit”,然後搜到很多 Git 的初級教程,幾乎都有說先執行 git add ,然後 git commit。在我照著教程一步步 add & commit 的時候,我就在想,commit 就 commit唄,為什麼 commit 之前必須要 add 一下呢?
當時才疏學淺,不敢胡亂嘗試,擔心試錯了整不回來原來的樣子。現在膽子大了些,決定嘗試一下沒有 add 的 commit。
通過 echo 命令給 master.txt 檔案加了一行內容,然後執行提交:
測試結果很明顯,commit 失敗,失敗原因是沒有可以提交的修改,然而奇怪的是,檢視 master.txt 檔案,內容卻已經新增成功。
好在 Git 非常貼心的給了我們詳細的錯誤說明,下面仔細看一下:
On branch master Changes not staged for commit: modified: master.txt no changes added to commit
- 1
- 2
- 3
- 4
- 5
- 6
英語渣的我最近熱衷於翻譯:
在 master 分支
修改沒有被暫存起來以備提交
修改: master.txt
沒有可以提交的修改
- 1
- 2
- 3
- 4
- 5
- 6
從這個提示資訊中,我似乎嗅到了一絲絲的真(jian)相(qing),commit 時檢測是否有修改的 master.txt,好像不是我看到的 master.txt。那我看到 master.txt 是什麼?我沒看到的又是什麼?而且它在哪裡?
答案就比較明顯了,肯定在 Git 的暫存區(不然我為啥要舉這個例子,哈哈)。
git commit 執行時,會提交暫存區的內容。git add 命令會將我們看到的修改新增到暫存區中,這就是為什麼 git commit 之前要先執行 git add 的原因。
接著上面的問題,思維稍微發散一下,還可以問出很多問題,例如,add 將修改放入暫存區,那麼 add 之前資料存放在哪裡?commit 又將儲存區的資料提交到什麼地方了呢?以及為什麼要這麼分為幾個儲存部分?等看完這篇部落格,希望你這些問題,都能找到答案。
Git 可以大概分為三個區
Git 本地資料管理,大概可以分為三個區,工作區,暫存區和版本庫。
- 工作區(Working Directory)
是我們直接編輯的地方,例如 Android Studio 開啟的專案,記事本開啟的文字等,肉眼可見,直接操作。
- 暫存區(Stage 或 Index)
資料暫時存放的區域,可在工作區和版本庫之間進行資料的友好交流。
- 版本庫(commit History)
存放已經提交的資料,push 的時候,就是把這個區的資料 push 到遠端倉庫了。
下面是,當開發者通過 git 修改資料時,各區之間的資料傳遞流程示意圖。
為了驗證以上流程的正確性,我們可以自己動手實驗一下,為了對比三個區之間的資料差別,過程中,可以藉助神奇的 diff 命令。
命令 | 作用 |
---|---|
git diff | 工作區 vs 暫存區 |
git diff head | 工作區 vs 版本庫 |
git diff –cached | 暫存區 vs 版本庫 |
現在三個區的資料是一致的,執行 git diff 命令都為空
命令 | 接果 |
---|---|
(工作區 vs 暫存區)git diff | |
(工作區 vs 版本庫)git diff head | |
(暫存區 vs 版本庫)git diff –cached |
然後給 master.txt 新增一行內容後,現在工作區內容發生變化,暫存區和版本庫內容不變。
命令 | 接果 |
---|---|
(工作區 vs 暫存區)git diff | |
(工作區 vs 版本庫)git diff head | |
(暫存區 vs 版本庫)git diff –cached |
執行git add 操作後,修改同步到暫存區,現在工作區和暫存區資料一致。
命令 | 接果 |
---|---|
(工作區 vs 暫存區)git diff | |
(工作區 vs 版本庫)git diff head | |
(暫存區 vs 版本庫)git diff –cached |
執行 git commit 操作後,修改已經同步到版本庫,三區資料再次保持一致。
命令 | 接果 |
---|---|
(工作區 vs 暫存區)git diff | |
(工作區 vs 版本庫)git diff head | |
(暫存區 vs 版本庫)git diff –cached |
Stage 賦予 Git 更多靈活性
不知道時,你對它可能毫無所感。知道後,你一定會感動地想哭,並十分之膜拜 Git 的開發者- Linus Torvalds ,stage 就是這麼精彩的玩意。以下看起來比較束手無策的場景,只要理解 stage,用好相應命令,都能輕易解決:
- 修改了4個檔案,在不放棄任何修改的情況下,其中一個檔案不想提交,如何操作?(沒add : git add 已經add: git reset –soft )
- 修改到一半的檔案,突然間不需要或者放棄修改了,怎麼恢復未修改前檔案? (git checkout)
- 程式碼寫一半,被打斷去做其他功能開發,未完成程式碼儲存?(git stash)
- 程式碼寫一半,發現忘記切換分支了?(git stash & git checkout)
- 程式碼需要回滾了?(git reset)
- 等等
上面提到的 checkout & stash & reset 等命令,通過不同的引數搭配使用,可以在工作區,暫存區和版本庫之間,輕鬆進行資料的來回切換。
例如前篇 Branch 部落格用到的 git reset 回滾命令,帶上不同引數就有不同的作用,如下:
命令 | 作用 |
---|---|
git reset –soft | 暫存區->工作區 |
git reset –mixed | 版本庫->暫存區 |
git reset –hard | 版本庫->暫存區->工作區 |
完事大家可以自己新建一個測試 Demo,多嘗試一下,相信你會因為暫存區的存在更加地喜歡 Git。
這是結尾
暫存區是介於工作區和版本庫之間的一箇中間儲存狀態,很多命令都會涉及暫存區的狀態,因此理解暫存區這一個存在是至關重要的。
希望這篇文章能給你的 Git 學習帶來幫助,同時,如有錯誤之處還望指出,下篇部落格見,see you next blog!
歡迎訂閱我的Git系列文章
- 01. 請回答:Git是什麼?
- 02. Git常用命令一日遊活動
- 03. Git三大特色之Branch(分支)
- 04. Git三大特色之Stage(暫存區)
- 05. Git三大特色之WorkFlow(工作流)
- 06. Git-你好, HEAD 同學
- 07. Git-用 cherry-pick 挑好看的小櫻桃
- 08. Git-rebase 黑魔法之打造完美的線性歷史
- 09. Git-rebase 黑魔法之打磨 commit 顆粒度
- 10. Git-少年,你想學回滾嗎?想撤銷檔案修改嗎?
- 11. Git-移動記錄儀 & 貼心小棉襖 reflog
- 12. Git-丟失的 commit 是真的消失了嗎?
- 13. Git-歎為觀止的 log 命令 & 其引數
- 14. Git-送娃子們一本關於如何自學 Git 的祕籍
--------------------- 作者:DRPrincess 來源:CSDN 原文:https://blog.csdn.net/qq_32452623/article/details/78417609?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!