git 分支簡介

2021-08-21 06:52:26 字數 3544 閱讀 5436

假設現在有乙個工作目錄,裡面包含了三個將要被暫存和提交的檔案。

$ git add readme test.rb license

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

現在,git 倉庫中有五個物件:三個 blob 物件(儲存著檔案快照)、乙個物件 (記錄著目錄結構和 blob 物件索引)以及乙個提交物件(包含著指向前述樹物件的指標和所有提交資訊)。

做些修改後再次提交,那麼這次產生的提交物件會包含乙個指向上次提交物件(父物件)的指標。

git的分支,其實本質上僅僅是指向提交物件的可變指標。git的預設分支名字是master,在多次提交操作之後,你其實已經有乙個指向最後那個提交物件的master分支。master分支會在每次提交時自動向前移動。

git是怎麼建立新分支的呢?很簡單,它只是為你建立了乙個可以移動的新的指標。比如, 比如,建立乙個 testing 分支, 你需要使用git branch命令:

git branch testing
通常我們會在建立乙個新分支後立即切換過去,這可以用git checkout -b一條命令搞定。

這會在當前所在的提交物件上建立乙個指標。

那麼,git 又是怎麼知道當前在哪乙個分支上呢? 也很簡單,它有乙個名為head的特殊指標,指向當前所在的本地分支 。在本例中,你仍然在master分支上。 因為git branch命令僅僅建立乙個新分支,並不會自動切換到新分支中去。

你可以簡單地使用git log命令檢視各個分支當前所指的物件。 提供這一功能的引數是--decorate

$ git log --oneline --decorate

f30ab (head -> master, testing) add feature #32 - ability to add new formats to the central inte***ce

34ac2 fixed bug #1328 - stack overflow under certain conditions

98ca9 the initial commit of my project

正如你所見,當前mastertesting分支均指向校驗和以f30ab開頭的提交物件。

要切換到乙個已存在的分支,你需要使用git checkout命令。 我們現在切換到新建立的testing分支去:

$ git checkout testing
這樣head就指向testing分支了。

那麼,這樣的實現方式會給我們帶來什麼好處呢? 現在不妨再提交一次:

如圖所示,你的testing分支向前移動了,但是master分支卻沒有,它仍然指向執行git checkout時所指的物件。 這就有意思了,現在我們切換回master分支看看:

這條命令做了兩件事。 一是使 head 指回master分支,二是將工作目錄恢復成master分支所指向的快照內容。 也就是說,你現在做修改的話,專案將始於乙個較舊的版本。 本質上來講,這就是忽略testing分支所做的修改,以便於向另乙個方向進行開發。

在切換分支時,一定要注意你工作目錄裡的檔案會被改變。如果是切換到乙個較舊的分支,你的工作目錄會恢復到該分支最後一次提交時的樣子。 如果 git 不能乾淨利落地完成這個任務,它將禁止切換分支。

我們不妨再稍微做些修改並提交:

$ vim test.rb

$ git commit -a -m 'made other changes'

現在,這個專案的提交歷史已經產生了分叉

你可以在不同分支間不斷地來回切換和工作,並在時機成熟時將它們合併起來。 而所有這些工作,你需要的命令只有branchcheckoutcommit

執行git log --oneline --decorate --graph --all,它會輸出你的提交歷史、各個分支的指向以及專案的分支分叉情況。

$ git log --oneline --decorate --graph --all

* c2b9e (head, master) made other changes

| * 87ab2 (testing) made a change

|/* f30ab add feature #32 - ability to add new formats to the

* 34ac2 fixed bug #1328 - stack overflow under certain conditions

* 98ca9 initial commit of my project

由於 git 的分支實質上僅是包含所指物件校驗和(長度為 40 的 sha-1 值字串)的檔案,所以它的建立和銷毀都異常高效。

Git分支機制簡介

git分支只不過是乙個指向某次提交的輕量級的可移動指標,當你發起提交時,就有了乙個指向最後一次提交的名為master的分支。每次提交時,它都會自動向前移動。git預設的分支名稱為master,master分支其實並 乙個特殊的分支,它與其他分支沒有什麼區別。幾乎每個git倉庫都擁有該分支,這是因為g...

3 1 Git 分支 分支簡介

幾乎所有的版本控制系統都以某種形式支援分支。使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。在很多版本控制系統中,這是乙個略微低效的過程 常常需要完全建立乙個源 目錄的副本。對於大專案來說,這樣的過程會耗費很多時間。有人把 git 的分支模型稱為它的 必殺技特性 也正因為這一特...

Git筆記(11) 分支簡介

使用分支可以把工作從開發主線上分離開來,以免影響開發主線 在很多版本控制系統中,依靠完全建立副本,但這是乙個略微低效的過程 而 git 處理分支的方式超級輕量 建立新分支可瞬間完成,並且在不同分支之間的切換操作也便捷 與許多其它版本控制系統不同 git鼓勵在工作流程中頻繁地使用分支與合併 介紹分支需...