Git學習2:為什麼工作區目錄下有.git目錄
SVN等版本控制系統的缺陷
在通過git init
命令後在當前目錄出現.git目錄,該目錄預設是隱藏的,需要關閉顯示隱藏檔案才能看到。實際上執行git init
命令後,當前目錄就成為了工作區(工作區可以理解為操作本地倉庫的車間),而且,可以發現如果繼續在工作區進行建立其他的資料夾檔案等操作,.git
目錄只有一個。
不同於SVN、CVS等版本控制系統,以SVN為例,SVN會在每個子目錄下面建立.svn
資料夾,該資料夾包含一些配置檔案,這些配置檔案可以建立對版本庫的跟蹤(實際上這是版本控制系統的共性)。這些配置檔案會記錄工作區的檔名稱、修改時間和版本等資訊,通過時間戳的對比可以快速掃描工作區的改動。在.svn
資料夾下還包括原始檔案的拷貝,這些拷貝檔案可以脫離版本庫獨立操作。此外,SVN的版本庫與工作區是分離的。
注:
.svn
目錄並不是本地倉庫,而是為了建立與遠端版本倉庫的關聯而引入的配置檔案,所以SVN的版本庫與工作區是分離的。
SVN這樣的設計的好處是在提交的時候可以只針對差異部分進行提交,因為改動的檔案可以與原始檔案的拷貝進行差異比較。然而,缺點就是會加倍佔用工作區的空間,而且當在工作區目錄下針對檔案內容進行搜尋的時候,會因為.svn
目錄還有原始檔案的拷貝使得搜尋結果加倍,混淆真正的搜尋結果。
Git的設計
Git將版本庫放在本地的做法可以讓除了與遠端倉庫的互動操作外的所有操作都可以在本地實現。由於Git本身的分散式設計,使得Git的同步與更新在網際網路下實現,而SVN只能只能在限定的網路內(往往是區域網)才能使用,所以在需要頻繁更換工作環境(假設網路也發生了變化)的情況下,使用SVN簡直是一個災難。除了不會在搜尋內容時出現加倍的搜尋結果外,Git還可以使用一個簡單的命令完成工作區檔案內容的搜尋——git grep
。
git grep “工作區檔案內容”
雖然Git將倉庫放在本地使得操作非常簡便,但是從安全的角度分析,是不是很不安全呢?因為如果因為某個錯誤的操作將工作區所在的資料夾整個刪除了,那麼這樣是危險的。事物總有其兩面性,但是考慮到之前SVN等版本控制系統將版本庫與工作區分離的設計,因為兩者是分離的,那麼就必須引入第三方的配置檔案等機制實現對工作區檔案的跟蹤,這樣的機制勢必就會出現類似SVN的問題。這讓我想起一句話:“進步是需要付出代價的。”
然而,Git針對儲存安全的問題並不是無所作為,Git引入了克隆操作降低了因為版本庫和工作區放在一起導致被破壞的危險。當在工作區發生了修改,只需要手動使用git push
或在克隆的工作區使用git pull
就可以輕鬆實現兩個工作區的同步與更新。
相關文章
- git checkout 對工作目錄的影響 —— Git 學習筆記 21Git筆記
- Git Step by Step (4):探索.git目錄Git
- 探索 .git 目錄,讓你真正理解 gitGit
- 探索 .git 目錄,讓你真正了理解gitGit
- git clone到指定的目錄Git
- git切換到指定目錄Git
- 目錄:SpringBoot學習目錄Spring Boot
- git下載倉庫指定目錄Git
- Git對新增目錄的處理Git
- git 提交vendor目錄至專案Git
- git 不同目錄用不同的配置Git
- 學習目錄
- [Note] git清空.git目錄後,重新再git init & git remote的討論GitREM
- git 學習筆錄Git
- git獲取當前所在的目錄Git
- redis學習——目錄Redis
- Flutter學習目錄Flutter
- react學習目錄React
- oracle 學習目錄Oracle
- Linux學習——2 目錄結構Linux
- 容器 工作目錄
- git 命令建立一個資料夾目錄Git
- Python學習目錄Python
- [總結]學習目錄
- UWP學習目錄整理
- autosar學習總目錄
- /opt目錄和/usr目錄的區別
- 【Git】取消追蹤多個檔案或目錄Git
- Git是什麼?Git基本命令+工作區命令Git
- 【目錄】JVM目錄JVM
- 深度學習——學習目錄——學習中……深度學習
- Spring Boot 學習目錄Spring Boot
- java基礎學習(目錄)Java
- 0、Linux學習 - 目錄Linux
- 大資料學習目錄大資料
- Linux命令學習---目錄Linux
- 移動端學習目錄
- SQLite學習手冊(目錄)SQLite