成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

每天都提交代碼,那你知道.git目錄內部的秘密嗎?

開發 前端
hook 對于程序員來講肯定不陌生,可以看做是一個生命周期的事件處理,例如提交代碼后,觸發某個動作,「提交代碼后」這個節點就是個 Hook,在這個Hook里我們可以加入一些自定義的處理邏輯來達到某些目的。

在每一個 git 倉庫中都有一個隱藏的.git目錄,git 的很多秘密都藏著這里面,包括分支、提交記錄、配置、日志等等。

作為一個有實力有低調的開發者來說,你了解其中每個目錄、每個文件都代表著什么嗎?它們的作用又是什么呢?

圖片圖片

以下是 .git目錄的完整結構,看上去也是比較簡單的,git 就是用這個結構管理這復雜的版本關系。

.git
 |----config
 |----objects
 | |----0d
 | | |----1d218acc58d857329cde3778d7429037079627
 | | |----60436b1116e54b3ed9a4b9fec1f2f9916a73ca
 | |----59
 | | |----a10af7aa35f521b9a41569785d4481850192e3
 | |----92
 | | |----5f4810ed4da9873771f14f2ca1ab97db81283a
 | | |----6c85f1ad90849159b2c616a9744ba62abe8f6a
 | | |----c359f0b8d09e2fc137c865043d4f6951989cdd
 |----HEAD
 |----info
 | |----exclude
 |----logs
 | |----HEAD
 | |----refs
 | | |----heads
 | | | |----main
 | | |----remotes
 | | | |----origin
 | | | | |----main
 |----description
 |----hooks
 | |----commit-msg.sample
 | |----pre-rebase.sample
 | |----pre-commit.sample
 | |----applypatch-msg.sample
 | |----fsmonitor-watchman.sample
 | |----pre-receive.sample
 | |----prepare-commit-msg.sample
 | |----post-update.sample
 | |----pre-merge-commit.sample
 | |----pre-applypatch.sample
 | |----pre-push.sample
 | |----update.sample
 | |----push-to-checkout.sample
 |----refs
 | |----heads
 | | |----main
 | |----tags
 | |----remotes
 | | |----origin
 | | | |----main
 |----index
 |----COMMIT_EDITMSG

HEAD(當前分支)

有一個叫做 HEAD文件,這個文件一聽名字就比較重要,它的作用就是存儲當前倉庫正在使用的分支名稱。

查看其內容,如下面這樣,表示當前正在使用 main 分支。

ref: refs/heads/main

或者下面這樣,表示正在使用 dev 分支。

ref: refs/heads/dev

refs

在 .git/refs 目錄下有 heads、tags、remotes三個子目錄,用來存儲最新的提交記錄引用的。

|----refs
| |----heads
| | |----main
| |----tags
| |----remotes
| | |----origin
| | | |----main

這三個目錄的作用都是用來標示最新一次的提交記錄的。

.git/refs/heads

例如我本地只有 main分支,那就會在這里存在一份.git/refs/heads/mian的文件,文件內容如下:

2ddc65b74a186f4332d7b218be0f18dd404c82ef

這個值就是 main 分支最新一次提交記錄的引用,引用指向 .git/objects這個目錄,這里面記錄了每一次提交的詳情信息。

.git/refs/remotes

.git/refs/heads存的是本地分支提交記錄的引用,而  .git/refs/remotes存的是遠程分支的提交記錄引用,這樣一來,git就能夠在本地跟蹤遠程倉庫的分支變化。

.git/refs/tags

我們在管理代碼的時候,可能在某些時候對當前版本打一個標簽,標記某些重要的版本,這樣就會在 .git/refs/tags目錄下形成記錄,標示某個tag的最新一次提交記錄引用。

.git/refs/stash

除了這三個目錄外,還有可能包含 stash這個目錄,如果你用過「本地暫存」這個功能的話。

什么情況下會用這個功能呢?

  1. 臨時切換到其他分支,當你正在當前分支上進行工作,但需要暫時切換到其他分支,而又不想提交當前工作目錄的改動時,可以使用git stash將改動保存起來,切換分支后再用git stash pop或git stash apply恢復。
  2. 臨時保存,假設你兩天前拉取了某個文件,改了一部分,但是一直沒完成。在這期間呢,你的同事也把這個文件改了,那你提交的時候就會有沖突。這種情況下,你可以先把你本地的暫存起來,然后再拉取最新代碼,之后再把暫存的改動恢復過來。

提交記錄 (.git/objects)

前面介紹 refs時說的最新一次的提交記錄引用,其引用的目標就是.git/objects這個目錄。拿前面那個 main分支的最后一次提交引用來講。

圖片圖片

上面這一串16進制字符串,可以分為兩個部分,前兩位是一個部分,后兩位是一個部分,前兩位作為目錄,后面的是文件名稱。

所以在 .git/objects中存在 .git/objects/2d/dc65b74a186f4332d7b218be0f18dd404c82ef這樣一個文件,里面存的就是某次提交的詳細信息,直接查看的話,只能看到亂碼,要用 git 自己的命令才行。

git cat-file -p 2ddc65b74a186f4332d7b218be0f18dd404c82ef

查看到的提交詳情,主要是提交樹、作者、提交者以及提交message

圖片圖片

通過 tree的記錄值,可以查看本次提交所涉及的所有文件樹。依然是 通過下面的命令查看,后面的一串hash值,就是上圖的 tree 的值。

git cat-file -p f8803d7d049edbbc981da732b855419d039f79ff

得到的結果如下:

圖片圖片

再用 git cat-file -p 命令可以查看上圖類型為 blob的文件的內容。

圖片圖片

日志 (.git/logs)

這里記錄的每一次的提交日志,包括當前使用的分支、本地分支、遠程分支。

|----logs
| |----HEAD
| |----refs
| | |----heads
| | | |----main
| | |----remotes
| | | |----origin
| | | | |----main

以行為單位,每一行都存儲了一次提交的具體信息。

圖片圖片

從左到右分別表示提交之前的hash、提交之后的hash、提交用戶、時間戳、提交的message。

config (配置)

.git/config 是當前倉庫的配置文件,這個文件,大多數開發同學應該還是比較熟悉的。這個配置只對當前倉庫有效。

了解了前面的內容后,再看一下這個配置文件,應該就很好理解了。

[core]
 repositoryformatversion = 0
 filemode = true
 bare = false
 logallrefupdates = true
 ignorecase = true
 precomposeunicode = true
[remote "origin"]
 url = https://github.com/xxxx/xxxx-blog.git
 fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
 remote = origin
 merge = refs/heads/main

index (暫存區)

.git/index 文件是 暫存區。它保存了當前倉庫中所有被 git 跟蹤的文件的狀態信息,包括文件名、文件的權限和位置等。當執行git add命令時,git 將要提交的文件的快照信息暫存到這個索引文件中,而不是直接提交到倉庫。

當執行git commit命令時,git 會將索引文件中的內容提交到版本庫中,從而創建一個新的提交記錄。

hooks (鉤子)

hook 對于程序員來講肯定不陌生,可以看做是一個生命周期的事件處理,例如提交代碼后,觸發某個動作,「提交代碼后」這個節點就是個 Hook,在這個Hook里我們可以加入一些自定義的處理邏輯來達到某些目的。

例如 pre-commit(在執行提交前運行)、post-commit(在提交后運行)、pre-push(在執行推送前運行)等。

怎么樣, 學廢了嗎?

責任編輯:武曉燕 來源: 古時的風箏
相關推薦

2022-04-28 09:02:55

Gitcommitlint配置

2020-11-12 11:55:57

代碼GitJava

2021-01-22 05:55:12

GitAngularJStype

2019-02-22 09:33:32

2020-11-02 08:21:50

Git辦法代碼

2024-01-05 08:30:21

懶加載lazy-initSpring框架

2023-12-12 08:41:01

2023-01-13 16:53:17

Annotation底層元注解

2020-08-07 16:18:38

JavaScriptC++Python

2019-12-12 09:23:29

Hello World操作系統函數庫

2022-03-10 08:25:27

JavaScrip變量作用域

2023-10-10 14:03:47

swap排序解法

2019-03-27 14:20:27

大數據核心價值數據分析

2022-09-23 14:44:31

前端huskyeslint

2009-09-14 09:40:48

微軟Linux代碼

2020-08-13 09:55:37

Stream代碼Java

2020-08-17 09:31:31

Git命令開發

2023-07-04 08:48:24

靜態代碼分析工具

2023-08-29 09:31:01

Scrapy網頁爬蟲

2013-07-22 15:36:48

谷歌秘密項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕在线欧美 | 在线看91| 午夜在线电影网 | 日韩一区二区三区在线视频 | 亚洲精品自在在线观看 | 中国大陆高清aⅴ毛片 | 亚洲人精品午夜 | 亚洲一区二区中文字幕在线观看 | 国产一区二区三区色淫影院 | 国产午夜在线 | 精品久久久久久久 | 九九热在线免费视频 | 久久久精品一区二区 | 黄色成人在线观看 | 亚洲一区二区三区在线 | 精品国产综合 | 作爱视频免费观看 | 国产黄色在线 | 久久久免费观看视频 | 干出白浆视频 | 欧美在线视频一区二区 | 日韩中文字幕第一页 | 国产精品久久久久无码av | 91免费看片 | 欧美成视频 | 一区二区在线免费观看 | 四虎影院在线观看免费视频 | 亚洲精品资源 | 亚洲福利在线观看 | 久久综合一区二区 | 久久久99精品免费观看 | 久久久91精品国产一区二区三区 | 欧美激情精品久久久久久变态 | 日本一区二区不卡 | 成人免费视频网 | 一区二区三区四区在线视频 | 日韩欧美一区二区三区 | 国产成人精品一区二区在线 | 欧美成人不卡 | 日韩精品一区二区三区中文在线 | 色婷婷综合久久久中字幕精品久久 |