git分支探索

git提交結(jié)構(gòu)圖

git完整提交結(jié)構(gòu)圖如下所示 full commit graph
圓形代表commit對(duì)象买喧,橢圓代表分支瑟匆,三角形代表tree對(duì)象黄娘,長(zhǎng)方形代表blob對(duì)象

因?yàn)?code>commit對(duì)應(yīng)的treeblob對(duì)象已經(jīng)深入研究過(guò)了骨杂,所以此處使用簡(jiǎn)化圖來(lái)演示分支操作
simplified commit graph(縮減版-圖左)
labeled commit graph(帶標(biāo)簽版-圖右)

git分支操作

分支代表了不同的支線任務(wù)條账嚎,使用分支意味著你可以把你的工作從開(kāi)發(fā)主線上分離開(kāi)來(lái)莫瞬,以免影響開(kāi)發(fā)主線儡蔓,從而并行執(zhí)行不同任務(wù)。
分支是git的核心疼邀,也是git有別于其他版本控制軟件的根本原因喂江,git中鼓勵(lì)多使用分支,對(duì)git而言分支的創(chuàng)建和切換也非常簡(jiǎn)單旁振。
而在很多版本控制系統(tǒng)中获询,分支操作是一個(gè)略微低效的過(guò)程 -- 常常需要完全創(chuàng)建一個(gè)源代碼目錄的副本,對(duì)于大項(xiàng)目而言會(huì)耗費(fèi)很多時(shí)間拐袜。

初始化項(xiàng)目

在demo目錄下初始化git倉(cāng)庫(kù)吉嚣,然后進(jìn)行3次提交操作,每次新增一個(gè)文件進(jìn)行提交阻肿。三次提交的結(jié)構(gòu)圖如下瓦戚,其中master為缺省(默認(rèn))分支,初始化git倉(cāng)庫(kù)時(shí)即會(huì)創(chuàng)建一個(gè)master分支丛塌,并且讓HEAD指向該分支较解。此時(shí)master分支指向了最新的commit對(duì)象。

創(chuàng)建分支

創(chuàng)建分支命令:git branch "name"
創(chuàng)建分支的本質(zhì)就是新增一個(gè)指針文件赴邻,指向了當(dāng)前所在分支的commit對(duì)象印衔,該文件在.git/refs/heads目錄中,創(chuàng)建一個(gè)分支dev姥敛,可以看到此時(shí)devmaster文件保存了同一個(gè)commit對(duì)象的hash值

創(chuàng)建分支后的結(jié)構(gòu)圖

切換分支

切換分支命令:git checkout "name"奸焙,切換分支的本質(zhì)實(shí)際上做了兩步操作
1.改變HEAD指針的指向,即修改.git/HEAD文件的內(nèi)容彤敛,指向新分支
2.將新分支對(duì)應(yīng)的commit對(duì)象所包含的所有內(nèi)容檢出到工作空間

切換分支后結(jié)構(gòu)圖的變化

分叉分支

dev分支上修改版本3.txt文件內(nèi)容与帆,然后進(jìn)行提交,切換回master分支墨榄,修改版本2.txt文件內(nèi)容玄糟,然后進(jìn)行提交。

此時(shí)master分支和dev分支就形成了分叉袄秩,分別指向了不同的新的commit對(duì)象

兩次提交后的結(jié)構(gòu)變化圖如下

合并分支

合并分支命令:git merge "name"
如果我們想將dev分支內(nèi)容合并到master阵翎,那么首先需要切換到master分支,然后執(zhí)行git merge進(jìn)行合并操作之剧,合并后查看版本3.txt和版本2.txt文件內(nèi)容是否都已改變郭卫。

合并分支后會(huì)新生成一個(gè)commit對(duì)象,該commit對(duì)象同時(shí)指向了兩個(gè)commit父對(duì)象背稼,而master指向了該commit贰军。注意此時(shí)dev分支并沒(méi)有移動(dòng),仍然是指向以前的commit對(duì)象雇庙。

合并分支后的結(jié)構(gòu)圖

fast-forward

fast-forward -- 特殊的合并谓形,特點(diǎn)是不會(huì)產(chǎn)生新的commit對(duì)象灶伊,只是改變指針的指向內(nèi)容。
如果創(chuàng)建了一個(gè)分支后寒跳,分支產(chǎn)生了新的提交記錄聘萨,但是master分支一直沒(méi)有做任何修改操作,此時(shí)如果要合并分支到master童太,只需要簡(jiǎn)單改變master的指向?yàn)樽钚碌?code>commit對(duì)象即可米辐。
如圖,我們?cè)?code>master分支指向的commit對(duì)象上新增加了dev分支书释,并且在dev分支上進(jìn)行了一次提交翘贮,此時(shí)合并dev分支到master就是fast-forward合并,只需要將master指向7a45d對(duì)應(yīng)的commit對(duì)象即可爆惧。

在我們上面的合并分支示例中狸页,當(dāng)我們切換到dev分支,然后將master合并到dev分支扯再,此時(shí)也是fast-forward合并芍耘,可以看到dev分支直接指向了master指向的commit對(duì)象,而沒(méi)有產(chǎn)生新的合并commit對(duì)象。

PS:在產(chǎn)生分叉的分支上進(jìn)行合并時(shí)需要使用一定的算法,而git使用的合并算法為Three-way Merge卢厂。該算法需要參考兩個(gè)分支共同的commit對(duì)象,加上分支的兩個(gè)commit對(duì)象進(jìn)行差異性比較辙谜。

分支總結(jié)

由于 Git 中的分支實(shí)際上僅是一個(gè)包含所指對(duì)象校驗(yàn)和(40 個(gè)字符長(zhǎng)度 SHA-1 字串)的文件,所以創(chuàng)建和銷毀一個(gè)分支就變得非常廉價(jià)和快速了。
這和大多數(shù)版本控制系統(tǒng)形成了鮮明對(duì)比,它們管理分支大多采取備份所有項(xiàng)目文件到特定目錄的方式鳄袍,所以根據(jù)項(xiàng)目文件數(shù)量和大小不同,可能花費(fèi)的時(shí)間也會(huì)有相當(dāng)大的差別吏恭,快則幾秒畦木,慢則數(shù)分鐘。
Git 的實(shí)現(xiàn)與項(xiàng)目復(fù)雜度無(wú)關(guān)砸泛,它永遠(yuǎn)可以在幾毫秒的時(shí)間內(nèi)完成分支的創(chuàng)建和切換。同時(shí)蛆封,因?yàn)槊看翁峤粫r(shí)都記錄了祖先信息(譯注:即parent對(duì)象)唇礁,將來(lái)要合并分支時(shí),尋找恰當(dāng)?shù)暮喜⒒A(chǔ)(譯注:即共同祖先)的工作其實(shí)已經(jīng)自然而然地?cái)[在那里了惨篱,所以實(shí)現(xiàn)起來(lái)非常容易盏筐。 Git 鼓勵(lì)開(kāi)發(fā)者頻繁使用分支,正是因?yàn)橛兄@些特性作保障砸讳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琢融,一起剝皮案震驚了整個(gè)濱河市界牡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漾抬,老刑警劉巖宿亡,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纳令,居然都是意外死亡挽荠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門平绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圈匆,“玉大人,你說(shuō)我怎么就攤上這事捏雌≡咀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵性湿,是天一觀的道長(zhǎng)纬傲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窘奏,這世上最難降的妖魔是什么嘹锁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮着裹,結(jié)果婚禮上领猾,老公的妹妹穿的比我還像新娘。我一直安慰自己骇扇,他們只是感情好摔竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著少孝,像睡著了一般继低。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稍走,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天袁翁,我揣著相機(jī)與錄音,去河邊找鬼婿脸。 笑死粱胜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狐树。 我是一名探鬼主播焙压,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涯曲?” 一聲冷哼從身側(cè)響起野哭,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幻件,沒(méi)想到半個(gè)月后拨黔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傲武,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蓉驹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揪利。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡态兴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疟位,到底是詐尸還是另有隱情瞻润,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布甜刻,位于F島的核電站绍撞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏得院。R本人自食惡果不足惜傻铣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祥绞。 院中可真熱鬧非洲,春花似錦、人聲如沸蜕径。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兜喻。三九已至梦染,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朴皆,已是汗流浹背帕识。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遂铡,地道東北人渡冻。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像忧便,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照珠增,而是把代碼倉(cāng)庫(kù)完整的鏡像下來(lái)超歌。這樣一來(lái),任何一處協(xié)同...
    __silhouette閱讀 15,887評(píng)論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照蒂教,而是把代碼倉(cāng)庫(kù)完整的鏡像下來(lái)...
    sunnyghx閱讀 3,921評(píng)論 0 11
  • 一巍举、 Git 常用命令速查 增加一個(gè)遠(yuǎn)程服務(wù)器端上面的命令會(huì)增加URL地址為'git@github.com:dai...
    阿羨吖閱讀 523評(píng)論 2 1
  • 1.去西電醫(yī)院體檢 2. 去沙井村轉(zhuǎn)一圈,看有啥要買的凝垛。 3.最主要的是php面試視頻 和 Thinkphp即可懊悯。...
    雷一凡閱讀 191評(píng)論 4 0
  • 我叫林路,是一個(gè)喜愛(ài)逛漫展梦皮、追番的宅男炭分。那天我剛從漫展回到家,躺在床上卻被一個(gè)東西給砸暈了剑肯。 第二天捧毛,我剛醒來(lái),發(fā)...
    Colo桑閱讀 314評(píng)論 2 1