乙個 git 目錄,領悟 Git 的強大!

2021-10-04 04:22:33 字數 2972 閱讀 6384

git 是乙個強大的工具,但是使用起來卻不是很友好。如果程式設計師們能夠真正花時間去理解 git 的構成,將會避免很多不必要的麻煩。

以下為譯文:

初學 git 就像乙個不懂當地語言的人來到乙個陌生的國家——如果你知道自己在哪,該去**,那還好。一旦你迷路了,那麻煩就大了。

初學者一般都很害怕 git,很難不怕。毫無疑問,git 是乙個強大的工具,但是使用起來卻不是很友好。使用 git 要理解很多新的概念,將檔案作為命令引數和不作為引數兩者的含義大相徑庭。

我認為要想克服這些困難,不僅要學習 git 的 commit 和 push 的用法。如果我們能夠真正花時間去理解 git 的構成,將會避免很多不必要的麻煩。

好的,我們現在開始吧。

當你通過git init建立 git 倉庫時, git  就會建立 .git 目錄。該目錄包含讓 git 能夠正常工作所需的所有資訊。直白點說,如果你不想在專案中繼續使用 git ,直接將 .git 目錄刪除只保留專案檔案即可。但是為什麼這樣做就可以呢?

下面是你第一次提交後 .git 資料夾的樣子:

├── head  

├── branches  

├── config  

├── description  

├── hooks  

│ ├── pre-commit.sample  

│ ├── pre-push.sample  

│ └── ...  

├── info  

│ └── exclude  

├── objects  

│ ├── info  

│ └── pack  

└── refs  

├── heads  

└── tags

每次你建立乙個檔案,並追蹤它,git 都將把檔案進行壓縮並儲存在自己的資料結構中。被壓縮的物件將具有唯一的名稱和 hash 值,並將儲存到物件 (object) 目錄中。

在研究物件目錄之前,我們必須明白一次提交的含義是什麼。你可能會說,一次提交就是當前工作目錄的乙個快照,但事實遠不止如此。

實際上,當你提交時,git 通過下面兩個步驟對你的工作目錄建立快照:

一旦快照被建立出來,它將會被壓縮,以雜湊值命名。那麼這些壓縮的物件存在**呢?他們被存在 object 資料夾中。

├── 4c  

│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash  

├── 86  

│ └── 550c31847e518e1927f95991c949fc14efc711 // hash  

├── e6  

│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash  

├── info // let's ignore that  

└── pack // let's ignore that too

這是我建立了乙個空的檔案  1.txt 並提交後 object 資料夾的樣子。請注意,如果你的檔案雜湊值為 "4cf44f1e…",git 會將其儲存到 "4c"子目錄中,並將其命名為"f44f1…"。這個小技巧,將/objects目錄的數量減少到 255 個以內。

你要記住的是,一次提交包含 4 個部分:

工作目錄快照名稱(乙個雜湊值)。

提交者資訊。

父提交的雜湊值。

如果我們解壓提交的檔案:

// 通過檢視提交歷史,你可以輕鬆地查詢到提交的雜湊值  

// 你都不需要複製完整的雜湊值字串,  

// 複製能夠保證雜湊值的唯一性的前面一段即可。  

git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

得到下面的內容:

tree 86550c31847e518e1927f95991c949fc14efc711  

author pierre de wulf 1455775173 -0500  

committer pierre de wulf <\[[email protected]\](mailto:[email protected])> 1455775173 -0500  

commit a

正如預想的一樣,我們看到了快照的雜湊值、作者資訊和提交的注釋。

有兩個非常重要的事項:

那麼,在快照中存的是啥呢?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711  

100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

我們找到之前儲存的最後乙個物件,也是我們快照中的唯一的乙個物件。它是乙個 blob 物件,這是另外的知識點,不在這裡討論。

cat head  

ref: refs/heads/master

head 不是乙個雜湊,head 可以理解為指向你正在使用的分支的頂端的指標。我們接下來看下 refs/heads/master:

cat refs/heads/master  

4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

所以學到這裡,你應該明白 git 提交就是把你當前工作目錄的檔案「壓縮」,然後將其和其他資訊一起儲存到物件資料夾中。如果你對 git 足夠熟悉,你就會知道哪些檔案會包含在提交中,哪些檔案不會被提交。

我這裡說的提交,並不是指你的工作目錄快照,而是指你要提交的檔案快照。在實際執行之前,git 會在**儲存你要提交的檔案?

它將他們儲存到索引檔案中。不過,我們暫時不打算深入研究它。如果你真的感興趣,可以通過這裡(深入學習。

從乙個git倉庫遷移到另外乙個git倉庫

我們平常可能會遇到git倉庫遷移的問題,現在把遷移方法備忘一下。1 先備份倉庫裸倉庫 git clone bare git bare 建立的轉殖版本庫都不包含工作區,直接就是版本庫的內容。2 在新的 倉庫上新建乙個倉庫。3 然後推送裸倉庫到新建的倉庫上 cd bak.git git push mir...

從乙個git倉庫遷移到另外乙個git倉庫

如果你想從別的 git 託管服務那裡複製乙份源 到新的 git 託管伺服器上的話,可以通過以下步驟來操作。從原位址轉殖乙份裸版本庫,比如原本託管於 github。設定網速 然後到新的 git 伺服器上建立乙個新專案,比如 gitcafe。以映象推送的方式上傳 到 gitcafe 伺服器上。刪除本地 ...

建立乙個git 分支

1 檢視當前的本地分支列表 git branch a 2 新增乙個本地分支test git branch test 3 檢視當前的本地分支列表,會發現多了乙個test分支 git branch a 4 檢視當前的遠端分支列表 沒有test分支 git branch r 5 檢視遠端倉庫名 git r...