Git 分支的创建与切换 —— Git 学习笔记 14
Git 分支的創(chuàng)建與切換
文章目錄
- Git 分支的創(chuàng)建與切換
- Git 分支的本質(zhì)
- 分支創(chuàng)建
- 分支切換
- 參考資料
幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發(fā)主線上分離開來,以免影響主線的開發(fā)。 在很多版本控制系統(tǒng)中,這是一個略微低效的過程 —— 常常需要完全創(chuàng)建一個源代碼目錄的副本。對于大項(xiàng)目來說,這樣的過程會耗費(fèi)很多時間。
有人把 Git 的分支模型稱為它的“必殺技特性”,也正是因?yàn)檫@一特性,使得 Git 從眾多版本控制系統(tǒng)中脫穎而出。 為何 Git 的分支模型如此出眾呢? Git 處理分支的方式可謂是超級輕量,創(chuàng)建新分支這一操作幾乎能在瞬間完成,并且在不同分支之間切換也是一樣便捷。
與許多其它版本控制系統(tǒng)不同,Git 鼓勵在工作流程中頻繁地使用分支與合并。理解和精通這一特性,你便會意識到 Git 是如此強(qiáng)大而又獨(dú)特,并且從此真正改變你的開發(fā)方式。
Git 分支的本質(zhì)
Git 的分支,其本質(zhì)上僅僅是指向提交對象的可變指針。說它“可變”是因?yàn)樗鼤诿看蔚奶峤徊僮髦凶詣酉蚯耙苿印?Git 的默認(rèn)分支名字是 master。 在多次提交操作之后,你其實(shí)已經(jīng)有一個指向最后那個提交對象的 master 分支。
Git 的 “master” 分支并不是一個特殊分支。 它跟其它分支完全沒有區(qū)別。 之所以幾乎每一個倉庫都有 master 分支,是因?yàn)?git init 命令默認(rèn)創(chuàng)建它,并且大多數(shù)人都懶得去改動它。
分支創(chuàng)建
Git 是怎么創(chuàng)建新分支的呢? 很簡單,它只是為你創(chuàng)建了一個可以移動的新的指針。 比如,創(chuàng)建一個 testing 分支, 你需要使用 git branch 命令:
$ git branch testing這會在當(dāng)前所在的提交對象上創(chuàng)建一個指針。
那么,Git 又是怎么知道當(dāng)前在哪一個分支上呢? 也很簡單,它有一個名為 HEAD 的特殊指針。
請注意它和許多其它版本控制系統(tǒng)(如 Subversion 或 CVS)里的 HEAD 概念完全不同。 在 Git 中,它是一個指針,指向當(dāng)前所在的本地分支(譯注:將 HEAD 想象為當(dāng)前分支的別名)。 在本例中,你仍然在 master 分支上。 因?yàn)?git branch 命令僅僅創(chuàng)建一個新分支,并不會自動切換到新分支上去。
你可以簡單地使用 git log 命令查看各個分支當(dāng)前所指的對象。 提供這一功能的參數(shù)是 --decorate。
$ git log --oneline --decoratef30ab (HEAD -> master, testing) add feature #32 - ability to add new 34ac2 fixed bug #1328 - stack overflow under certain conditions 98ca9 initial commit of my project正如你所見,當(dāng)前 “master” 和 “testing” 分支均指向校驗(yàn)和以 f30ab 開頭的提交對象,且當(dāng)前在 master 分支(因?yàn)?HEAD 指向 master)。
分支切換
要切換到一個已存在的分支,你需要使用 git checkout 命令。 現(xiàn)在切換到新創(chuàng)建的 testing 分支去:
$ git checkout testing這樣 HEAD 就指向 testing 分支了。
那么,切換分支會給我們帶來什么影響呢? 現(xiàn)在不妨再提交一次:
$ vim test.rb $ git commit -a -m 'made a change'提交后的示意圖如下:
看到了嗎?你的 testing 分支向前移動了,但是 master 分支卻沒有,它仍然指向運(yùn)行 git checkout 時所指的對象。 這就有意思了,現(xiàn)在我們切換回 master 分支看看:
$ git checkout master這條命令做了兩件事。 一是使 HEAD 指回 master 分支,二是將工作目錄恢復(fù)成 master 分支所指向的快照內(nèi)容。 也就是說,你現(xiàn)在做修改的話,項(xiàng)目將始于一個較舊的版本(f30ab)。 本質(zhì)上來講,這就是忽略 testing 分支所做的修改,以便于向另一個方向進(jìn)行開發(fā)。
分支切換會改變你工作目錄中的文件
在切換分支時,一定要注意你工作目錄里的文件會被改變。 如果是切換到一個較舊的分支,你的工作目錄會恢復(fù)到該分支最后一次提交時的樣子。 如果 Git 不能干凈利落地完成這個任務(wù),它將禁止切換分支。
我們不妨再做些修改并提交:
$ vim test.rb $ git commit -a -m 'made other changes'現(xiàn)在,這個項(xiàng)目的提交歷史已經(jīng)產(chǎn)生了分叉。 因?yàn)閯偛拍銊?chuàng)建了一個新分支,并切換過去進(jìn)行了一些工作,隨后又切換回 master 分支進(jìn)行了另外一些工作。
你可以簡單地使用 git log 命令查看分叉歷史。 運(yùn)行g(shù)it log --oneline --decorate --graph--all ,它會輸出你的提交歷史、各個分支的指向以及項(xiàng)目的分支分叉情況。
$ 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 的分支實(shí)質(zhì)上僅是包含所指對象校驗(yàn)和(長度為 40 的 SHA-1 值字符串)的文件,所以它的創(chuàng)建和銷毀都非常高效。 創(chuàng)建一個新分支就相當(dāng)于往一個文件中寫入 41 個字節(jié)(40 個字符和 1 個換行符),如此之簡單能不快嗎?
這與過去大多數(shù)版本控制系統(tǒng)形成了鮮明的對比:它們在創(chuàng)建分支時,將所有的項(xiàng)目文件都復(fù)制一遍,并保存到一個特定的目錄。 完成這樣繁瑣的過程通常需要好幾秒鐘,有時甚至需要好幾分鐘。所需時間的長短,完全取決于項(xiàng)目的規(guī)模。而在 Git 中,任何規(guī)模的項(xiàng)目都能在瞬間創(chuàng)建新分支。
參考資料
《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)
總結(jié)
以上是生活随笔為你收集整理的Git 分支的创建与切换 —— Git 学习笔记 14的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git 中的对象模型和文件的详细视图 —
- 下一篇: php html转成数组,PHP_php