git筆記 基本原理

2021-06-16 09:05:53 字數 2469 閱讀 3898

git是乙個分布式版本控制工具。

乙個git專案有三個部分組成:工作目錄,本地倉庫和遠端倉庫。其中工作目錄和本地倉庫都在本地磁碟上,遠端倉庫一般可以理解為另一台電腦上的倉庫。

工作目錄:就是被git管理的那些檔案

本地倉庫:主要包含兩部分:乙個commit樹,和一系列指向commit樹的指標。commit樹是指git記錄的所有提交,指向commit樹的指標有很多態別,包括分支、commit號、tag等,他們的本質都是乙個commit的指標而已,每乙個提交都會在這個樹中產生乙個節點。因為有本地倉庫,所以git除了pull、push、remote等操作之外,都是想本地倉庫提交的,提交好了之後再和遠端倉庫同步。

其中本地倉庫的分支指標還可以分成兩類,一類是本地分支,一類是遠端分支,遠端分支都是《遠端倉庫名》/分支名,舉例說明:假設有乙個本地分支staging,指向乙個提交a,但是其他人又進行了修改b,然後你fetch,這時候把其他人的修改同步到本地的commit樹上,同時把origin/staging指標指向b,所以此時staging和origin/staging是不同的,你可以再通過merge origin/staging來合併別人的**。

遠端倉庫:可以理解為乙個遠端的本地倉庫,沒有什麼大的區別。

使用git時總是要牢記一點:除了remote、pull、push、fetch等幾個操作,其他大部分工作都是在本地完成的,完成工作後只需要同步遠端倉庫即可。

git有個自己的小型檔案系統,git init來初始化乙個倉庫,他會在工作目錄下生成乙個.git的隱藏資料夾,這裡面儲存了git工作所需要的所有資訊(同時還有乙個.gitignore檔案可以指定git忽略某些型別的檔案)。add檔案之後,會把所有檔案的hash記錄下來,然後初始化乙個空的commit樹。此時git status沒有任何待提交的修改,然後自己去修改檔案,再執行git status命令,git會通過比較每個檔案的hash來確定哪些檔案被修改,並列出這些檔案,再執行commit命令的時候會生成乙個commit節點並加在本地倉庫的commie樹上,這個節點記錄了這次提交修改的檔案的快照,然後git把當前分支的指標和head指標都指向這個節點,並且會在分支指標的歷史記錄上記下這個節點。到此為止,一次本地提交就完成了,如果想同步到遠端伺服器,可以使用git push把新的提交推到遠端倉庫上。

這時候如果別人也提交了修改,那麼push會失敗,因為git要求merge操作在本地執行,只能把fast-forward的修改提交上去。那麼就需要先pull別人的**,這時候可以有三個選擇:

1,fetch命令,把遠端倉庫的commit同步到本地倉庫,這個操作會把遠端的commit樹同步到本地,並更新遠端倉庫對應分支的指標,但是工作目錄和本地分支都是不會變的。比如當前分支是master,新commit號是b,你自己的是a,原始的是o,本來有o->a提交,現在會多個o->b,當然,本地的分支不會變,於是:master->a, origin/master->b,於是你可以diff origin/master來檢視有哪些不同的修改,最後需要merge origin/master來合併。會生成乙個新的合併節點 c,當前的master和head都會指向c,然後再push即可

2,pull 命令,相當於上述的fetch 和 merge兩個命令,就是先更新本地倉庫,再merge,最後生成乙個新的c節點。

3,pull --rebase,和上面的pull的區別是:pull會生成乙個新的合併節點c,但是rebase是直接把提交b插到提交a之前,不會生成新的節點,因而合併結果是線性的,一般建議總是使用pull --rebase而不要使用pull。

fetch,把遠端倉庫同步到本地倉庫,但是不會改變工作目錄的檔案

push,把本地倉庫同步到遠端倉庫

merge,把乙個提交的內容合併到當前目錄。

pull,相當於fetch+merge,從遠端倉庫同步到本地倉庫,並且把對應當前分支的內容merge到當前工作目錄,其結果會生成乙個新的提交。

commit,把當前工作目錄的修改提交到本地倉庫。

1,commit號、tag、branch、head本質都是一樣的,是指向本地/遠端倉庫中的commit樹的乙個節點的指標而已,而checkout、diff、merge等命令都是比較兩個commit的,所以在這些命令中可以隨意使用commit號、tag和branch。

2,建立分支,tag都是瞬間完成,因為他們都是新建了乙個指標而已

3,切換分支比建立分支慢,因為它完成了兩個操作:1修改指標,2然後把該指標對應的commit所有的修改都應用到工作目錄(也就是修改檔案),因為修改檔案的時間很慢,所以切換分支比建立分支慢很多,當然主要取決於修改的多少。

4,git鼓勵多用分支和tag,因為他們的代價很小,就是新建了乙個指標而已。

5,什麼是log?log實際就是分支指標的移動記錄,前面說過分支就是乙個指向commit樹的指標,但是每次提交都會使這個指標移動,那麼git把指標的移動歷史記錄下來,就是log

注:實際上commit樹本身是不儲存檔案快照的,檔案快照由另乙個專門的樹物件儲存,commit物件有乙個指標指向這個樹的對應節點,所以commit節點只是間接的儲存了檔案的修改。

todo:加圖,無圖無真相,光有文字說不清啊。

Git 基本原理

一 雜湊 雜湊是乙個系列的加密演算法,各個不同的雜湊演算法雖然加密強度不同,但是有以下幾個共同點 不管輸入資料的資料量有多大,使用同乙個雜湊演算法,得到的加密結果長度固定 雜湊演算法確定,輸入資料確定,輸出結果保證不變 雜湊演算法確定,輸入資料有變化,輸出結果一定有變化,而且通常變化很大 雜湊演算法...

Git基本原理

學習git的基本原理有利於理解git命令背後的執行原理,需要將腦子裡面之前關於其他版本管理工具比如cvs subversion perforce的知識暫時忘掉,因為它們與git的使用是不太相同的 其他版本工具比如vcs認為它們儲存的資訊是由一系列的檔案組成,以及每個檔案上做出的改動,git儲存資料時...

Git基本原理總結

本質上,git是一套內容定址 content addressable 檔案系統,而和我們直接接觸的git介面,只不過是封裝在其之上的乙個應用層。這個關係頗有點類似於計算機網路中應用層和下屬層的關係。在git中,那些和應用層相關的命令 也就是我們最常用的命令,如git commit git push等...