Git 分支 - 分支簡介

分支簡介

在進(jìn)行提交操作時(shí),Git 會(huì)保存一個(gè)提交對(duì)象(commit object)荡灾。知道了 Git 保存數(shù)據(jù)的方式,我們可以很自然的想到——該提交對(duì)象會(huì)包含一個(gè)指向暫存內(nèi)容快照的指針哮内。 但不僅僅是這樣黍少,該提交對(duì)象還包含了作者的姓名和郵箱、提交時(shí)輸入的信息以及指向它的父對(duì)象的指針航徙。首次提交產(chǎn)生的提交對(duì)象沒有父對(duì)象如贷,普通提交操作產(chǎn)生的提交對(duì)象有一個(gè)父對(duì)象,而由多個(gè)分支合并產(chǎn)生的提交對(duì)象有多個(gè)父對(duì)象到踏,

Git 倉庫中有五個(gè)對(duì)象:三個(gè) blob 對(duì)象(保存著文件快照)杠袱、一個(gè)樹對(duì)象(記錄著目錄結(jié)構(gòu)和 blob 對(duì)象索引)以及一個(gè)提交對(duì)象(包含著指向前述樹對(duì)象的指針和所有提交信息)

image.png
首次提交對(duì)象及其樹結(jié)構(gòu)

做些修改后再次提交,那么這次產(chǎn)生的提交對(duì)象會(huì)包含一個(gè)指向上次提交對(duì)象(父對(duì)象)的指針窝稿。

提交對(duì)象及其父對(duì)象楣富。
提交對(duì)象及其父對(duì)象

Git 的分支,其實(shí)本質(zhì)上僅僅是指向提交對(duì)象的可變指針伴榔。 Git 的默認(rèn)分支名字是 master纹蝴。 在多次提交操作之后,你其實(shí)已經(jīng)有一個(gè)指向最后那個(gè)提交對(duì)象的 master 分支踪少。 它會(huì)在每次的提交操作中自動(dòng)向前移動(dòng)塘安。

Git 的 “master” 分支并不是一個(gè)特殊分支。 它就跟其它分支完全沒有區(qū)別援奢。 之所以幾乎每一個(gè)倉庫都有 master 分支兼犯,是因?yàn)?git init 命令默認(rèn)創(chuàng)建它,并且大多數(shù)人都懶得去改動(dòng)它。

分支及其提交歷史切黔。

分支創(chuàng)建

分支及其提交歷史

Git 是怎么創(chuàng)建新分支的呢砸脊? 很簡單,它只是為你創(chuàng)建了一個(gè)可以移動(dòng)的新的指針纬霞。 比如凌埂,創(chuàng)建一個(gè) testing 分支, 你需要使用 git branch 命令:

$ git branch testing

這會(huì)在當(dāng)前所在的提交對(duì)象上創(chuàng)建一個(gè)指針诗芜。

兩個(gè)指向相同提交歷史的分支瞳抓。
兩個(gè)指向相同提交歷史的分支

那么,Git 又是怎么知道當(dāng)前在哪一個(gè)分支上呢绢陌? 也很簡單挨下,它有一個(gè)名為 HEAD 的特殊指針。 請(qǐng)注意它和許多其它版本控制系統(tǒng)(如 Subversion 或 CVS)里的 HEAD 概念完全不同脐湾。 在 Git 中臭笆,它是一個(gè)指針,指向當(dāng)前所在的本地分支(譯注:將 HEAD 想象為當(dāng)前分支的別名)秤掌。 在本例中愁铺,你仍然在 master 分支上。 因?yàn)?git branch 命令僅僅 創(chuàng)建 一個(gè)新分支闻鉴,并不會(huì)自動(dòng)切換到新分支中去茵乱。

HEAD 指向當(dāng)前所在的分支。
HEAD 指向當(dāng)前所在的分支

你可以簡單地使用 git log 命令查看各個(gè)分支當(dāng)前所指的對(duì)象孟岛。 提供這一功能的參數(shù)是 --decorate瓶竭。

$ git log --oneline --decorate
f30ab (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 開頭的提交對(duì)象渠羞。

分支切換

要切換到一個(gè)已存在的分支斤贰,你需要使用 git checkout 命令。 我們現(xiàn)在切換到新創(chuàng)建的 testing 分支去:

$ git checkout testing

這樣 HEAD 就指向 testing 分支了次询。

HEAD 指向當(dāng)前所在的分支荧恍。
HEAD 指向當(dāng)前所在的分支

那么,這樣的實(shí)現(xiàn)方式會(huì)給我們帶來什么好處呢屯吊? 現(xiàn)在不妨再提交一次:

$ vim test.rb
$ git commit -a -m 'made a change'
HEAD 分支隨著提交操作自動(dòng)向前移動(dòng)送巡。

Figure 15. HEAD 分支隨著提交操作自動(dòng)向前移動(dòng)

如圖所示,你的 testing 分支向前移動(dòng)了盒卸,但是 master 分支卻沒有骗爆,它仍然指向運(yùn)行 git checkout 時(shí)所指的對(duì)象。 這就有意思了蔽介,現(xiàn)在我們切換回 master 分支看看:

$ git checkout master
檢出時(shí) HEAD 隨之移動(dòng)淮腾。
檢出時(shí) HEAD 隨之移動(dòng)

這條命令做了兩件事糟需。 一是使 HEAD 指回 master 分支,二是將工作目錄恢復(fù)成 master 分支所指向的快照內(nèi)容谷朝。 也就是說,你現(xiàn)在做修改的話武花,項(xiàng)目將始于一個(gè)較舊的版本圆凰。 本質(zhì)上來講,這就是忽略 testing分支所做的修改体箕,以便于向另一個(gè)方向進(jìn)行開發(fā)专钉。

分支切換會(huì)改變你工作目錄中的文件

在切換分支時(shí),一定要注意你工作目錄里的文件會(huì)被改變累铅。 如果是切換到一個(gè)較舊的分支跃须,你的工作目錄會(huì)恢復(fù)到該分支最后一次提交時(shí)的樣子。 如果 Git 不能干凈利落地完成這個(gè)任務(wù)娃兽,它將禁止切換分支菇民。

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

$ vim test.rb
$ git commit -a -m 'made other changes'

現(xiàn)在,這個(gè)項(xiàng)目的提交歷史已經(jīng)產(chǎn)生了分叉(參見 項(xiàng)目分叉歷史)投储。 因?yàn)閯偛拍銊?chuàng)建了一個(gè)新分支第练,并切換過去進(jìn)行了一些工作,隨后又切換回 master 分支進(jìn)行了另外一些工作玛荞。 上述兩次改動(dòng)針對(duì)的是不同分支:你可以在不同分支間不斷地來回切換和工作娇掏,并在時(shí)機(jī)成熟時(shí)將它們合并起來。 而所有這些工作勋眯,你需要的命令只有 branch婴梧、checkoutcommit

項(xiàng)目分叉歷史客蹋。
項(xiàng)目分叉歷史

你可以簡單地使用 git log 命令查看分叉歷史塞蹭。 運(yùn)行 git log --oneline --decorate --graph --all ,它會(huì)輸出你的提交歷史嚼酝、各個(gè)分支的指向以及項(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ì)上僅是包含所指對(duì)象校驗(yàn)和(長度為 40 的 SHA-1 值字符串)的文件,所以它的創(chuàng)建和銷毀都異常高效闽巩。 創(chuàng)建一個(gè)新分支就相當(dāng)于往一個(gè)文件中寫入 41 個(gè)字節(jié)(40 個(gè)字符和 1 個(gè)換行符)钧舌,如此的簡單能不快嗎?

這與過去大多數(shù)版本控制系統(tǒng)形成了鮮明的對(duì)比涎跨,它們?cè)趧?chuàng)建分支時(shí)洼冻,將所有的項(xiàng)目文件都復(fù)制一遍,并保存到一個(gè)特定的目錄隅很。 完成這樣繁瑣的過程通常需要好幾秒鐘撞牢,有時(shí)甚至需要好幾分鐘。所需時(shí)間的長短,完全取決于項(xiàng)目的規(guī)模屋彪。而在 Git 中所宰,任何規(guī)模的項(xiàng)目都能在瞬間創(chuàng)建新分支。 同時(shí)畜挥,由于每次提交都會(huì)記錄父對(duì)象仔粥,所以尋找恰當(dāng)?shù)暮喜⒒A(chǔ)(譯注:即共同祖先)也是同樣的簡單和高效。 這些高效的特性使得 Git 鼓勵(lì)開發(fā)人員頻繁地創(chuàng)建和使用分支蟹但。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躯泰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子华糖,更是在濱河造成了極大的恐慌麦向,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客叉,死亡現(xiàn)場離奇詭異诵竭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)十办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門秀撇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人向族,你說我怎么就攤上這事呵燕。” “怎么了件相?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵再扭,是天一觀的道長。 經(jīng)常有香客問我夜矗,道長泛范,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任紊撕,我火速辦了婚禮罢荡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘对扶。我一直安慰自己区赵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布浪南。 她就那樣靜靜地躺著笼才,像睡著了一般。 火紅的嫁衣襯著肌膚如雪络凿。 梳的紋絲不亂的頭發(fā)上骡送,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天昂羡,我揣著相機(jī)與錄音,去河邊找鬼摔踱。 笑死虐先,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昌渤。 我是一名探鬼主播赴穗,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膀息!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起了赵,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤潜支,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柿汛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗酿,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年络断,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裁替。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡貌笨,死狀恐怖弱判,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锥惋,我是刑警寧澤昌腰,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站膀跌,受9級(jí)特大地震影響遭商,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捅伤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一劫流、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丛忆,春花似錦祠汇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粮彤,卻和暖如春根穷,著一層夾襖步出監(jiān)牢的瞬間姜骡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工屿良, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圈澈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓尘惧,卻偏偏與公主長得像康栈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喷橙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 一啥么、 Git 分支簡介 幾乎所有的版本控制系統(tǒng)都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發(fā)主線上分...
    常大鵬閱讀 2,943評(píng)論 2 41
  • Git 分支 Git命令大全 對(duì)于任何一個(gè)文件贰逾,在Git內(nèi)都只有三種狀態(tài):已提交(committed)悬荣,已修改(m...
    carrey001閱讀 808評(píng)論 0 4
  • 分支簡介 Git 保存的不是文件的變化或者差異言缤,而是一系列不同時(shí)刻的文件快照嚼蚀。 當(dāng)使用git commit進(jìn)行提交...
    哪個(gè)鹿閱讀 3,868評(píng)論 0 2
  • 一、基本概念: 注:對(duì)于git的分布式概念及其優(yōu)點(diǎn)管挟,不重復(fù)說明轿曙,自己百度或谷歌。本文中涉及到指令前面有$的哮独,在cm...
    大廠offer閱讀 1,415評(píng)論 0 3
  • 曾幾何時(shí)皮璧,這是多少個(gè)少女的夢想舟扎,不用苦哈哈的上班,每天睡到自然醒悴务,還有人給錢花睹限,多么愜意的生活,卻不知這是世界上最...
    tracy投資筆記閱讀 286評(píng)論 0 0