Git 什麼是分支

2022-02-17 11:07:19 字數 1615 閱讀 3352

為了理解什麼是分支,我們先要回顧git是如何儲存資料的。

git並不會儲存檔案的差異值或者說變化量,而是直接儲存檔案的快照。

在git中提交時,會儲存乙個commit物件,該物件包含乙個指向暫存內容快照的指標、零個或多個指向該提交物件的父物件的指標(首次提交是沒有父物件的,普通提交有乙個父物件,合併後的提交會有多個父物件)和本次提交的作者等的相關資訊。

為直觀起見,我們假設在工作目錄中有三個檔案,準備將它們暫存後提交。暫存操作會對每乙個檔案計算校驗和,然後把當前版本的檔案快照儲存到 git 倉庫中,並將校驗和加入暫存區域:

$ git add readme test.rb license

$ git commit -m 'initial commit of my project'

當使用 git commit 新建乙個提交物件前,git 會先計算每乙個子目錄(本例中只有專案根目錄)的校驗和,然後在 git 倉庫中將這些目錄儲存為樹(tree)物件。之後 git 建立的提交物件,除了包含相關提交資訊以外,還包含著指向這個樹物件(專案根目錄)的指標,如此它就可以在將來需要的時候,重現此次快照的內容了。

現在,git 倉庫中有五個物件:三個表示檔案快照內容的 blob 物件;乙個記錄著目錄樹內容及其中各個檔案對應 blob 物件索引的 tree 物件;以及乙個包含指向 tree 物件(根目錄)的索引和其他提交資訊元資料的 commit 物件。

做些修改再次提交,那麼這次的提交物件會包含乙個指向上次提交物件的(parent)指標。兩次提交後,倉庫歷史會變成下面的樣子:

每次提交都會新建乙個commit物件,parent指標指向上次提交的結點。

那麼分支是什麼?git中的分支其本質僅僅是乙個指向commit物件的可變指標,git會使用master作為分支的預設名字,每次提交master指標都會指向最近一次提交的commit物件。

分支就是某個物件的提交歷史,當我們建立新分支時實際上是建立了乙個新的分支。

比如建立乙個testing分支:

git branch testing
實際上是建立了乙個分支指標。

因為有多個分支指標,因此git會儲存乙個名為head的特殊指標,它始終指向正在工作的本地分支。當我們用git branch新建乙個分支時,並不會自動切換到這個分支去,要切換當前工作的分支,還需要git checkout命令。

git checkout testing
這樣當我們再提交一次後,會是下面的結果

master指標沒有變化,testing分支向後移動了乙個結點,而head指標始終指向正在工作的分支。此時,如果我們切換到master分支會是下圖的結果

git checkout master
這條命令做了兩件事:

head指標指向master分支。

用master指標指向的快照內容替換工作目錄中的檔案。

如果我們此時做些修改再提交:

我們的專案會產生分叉,就像一棵橫著的樹。我們可以在不同分支裡反覆切換,並在適當的時候合併分支。而所有的這些工作,僅僅需要branchcheckout兩條命令。

什麼是git,為什麼要用git(一)

版本控制是一種記錄乙個或若干檔案內容變化,以便將來查閱特定版本修訂情況的系統。那什麼又是版本?在生活中,我們應該聽過某某的書又出新版本了。蘋果11又出來了,又該換手機了。新書 新手機對於之前的那本書來說就是新版本,以前的就是老版本。在git上通俗點說就是 對檔案進行修改 儲存並提交,則形成乙個版本。...

什麼是Git和Github

1.什麼是git和github git是一版本控制工具,由linux的創始團隊開發維護。github特指 它是基於 版本控制的社交 同時它也是個公司 大家對 版本控制都不會陌生,對社交 更不會陌生。2.如何開始 set up git create a repo fork a repo be soci...

git的遠端分支是幹啥的,和本地的有什麼區別?

不知道大家有沒有經歷過,當我們切換到了乙個新的分支想要提交 的時候,總會遇到這樣的錯誤。我們把日誌裡的英文翻譯過來是說,我們當前的分支沒有設定任何上游分支。然後git提示我們可以執行下面這行 來設定遠端的上游,這樣我們就可以push成功了。當然如果我們push的時候執行的不是git push,而是後...