版本庫中的分支,就像科幻小說中的平行宇宙,再加上時(shí)光穿梭機(jī)一般的版本前進(jìn)芦瘾、回退功能鸳粉,程序員在版本庫上就像上帝一樣的存在:想去哪兒就去哪兒(不同版本的切換)扔涧,想在哪個(gè)宇宙發(fā)呆就在哪個(gè)宇宙(分支切換)發(fā)呆。
起初届谈,程序員創(chuàng)造版本庫枯夜。
分支是空虛混沌。版本黑暗疼约。程序員的HEAD指在master上卤档。
程序員說,要有分支程剥,就有了分支劝枣。
程序員看分支是好的,就把分支合并了 织鲸。
分支在實(shí)際中有什么用呢舔腾?假設(shè)你準(zhǔn)備開發(fā)一個(gè)新功能,但是需要兩周才能完成搂擦,第一周你寫了50%的代碼稳诚,如果立刻提交,由于代碼還沒寫完瀑踢,不完整的代碼庫會導(dǎo)致別人不能干活了扳还。如果等代碼全部寫完再一次提交才避,又存在丟失每天進(jìn)度的巨大風(fēng)險(xiǎn)。
現(xiàn)在有了分支氨距,就不用怕了桑逝。你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到俏让,還繼續(xù)在原來的分支上正常工作楞遏,而你在自己的分支上干活,想提交就提交首昔,直到開發(fā)完畢后寡喝,再一次性合并到原來的分支上,這樣勒奇,既安全预鬓,又不影響別人工作。
媽媽再也不用擔(dān)心我的代碼丟失了撬陵。--Git版本管理系統(tǒng)
當(dāng)我們在版本庫中工作時(shí)珊皿,每次提交,Git都把它們串成一條時(shí)間線巨税,這條時(shí)間線就是一個(gè)分支蟋定。默認(rèn)情況下,只有一條時(shí)間線草添,在Git里驶兜,這個(gè)分支叫主分支,即master
分支远寸。HEAD
嚴(yán)格來說不是指向提交抄淑,而是指向master
,master
才是指向提交的驰后,所以肆资,HEAD
指向的就是當(dāng)前分支。
每次提交灶芝,master分支都會向前移動一步郑原,這樣,隨著版本不斷提交夜涕,master分支的線也越來越長犯犁。
當(dāng)我們創(chuàng)建新的分支,例如dev
時(shí)女器,Git新建了一個(gè)指針叫dev
酸役,指向master
相同的提交,再把HEAD
指向dev
,就表示當(dāng)前分支在dev
上涣澡。
從現(xiàn)在開始贱呐,對工作區(qū)的修改和提交就是針對dev
分支了,比如新提交一次后暑塑,dev
指針往前移動一步吼句,而master
指針不變。
假如我們在dev
上的工作完成了事格,就可以把dev
合并到master
上。Git怎么合并呢搞隐?最簡單的方法驹愚,就是直接把master
指向dev
的當(dāng)前提交,就完成了合并劣纲。
合并完分支后逢捺,根據(jù)需要可以刪除dev
分支。刪除dev
分支就是把dev
指針給刪掉癞季,刪掉后劫瞳,我們就剩下了一條master
分支。
創(chuàng)建分支
執(zhí)行git checkout -b dev
命令绷柒,創(chuàng)建dev分支志于。
在dev分支上進(jìn)行修改提交。
由于git版本庫在本地废睦,再加上其優(yōu)秀的設(shè)計(jì)(指針)伺绽,創(chuàng)建分支和切換分支非常快速嗜湃,所以你一定會愛上“創(chuàng)建分支奈应、在上面開發(fā)、合并分支购披、刪除分支”這種開發(fā)方式的杖挣。與SVN相比較,Git實(shí)在是方便太多刚陡,而且惩妇,并不會和服務(wù)器進(jìn)行交互。
合并分支
隨著日常工作的推進(jìn)橘荠,我們在不同的分支上進(jìn)行工作屿附,當(dāng)一個(gè)階段的工作完成后,就需要把工作成果合并到指定的分支(很有可能是master)上哥童。
首先挺份,我們把dev
分支上的修改合并到master
,再把fix_bug1762
分支合并到master
贮懈,以接收兩個(gè)開發(fā)人員的工作匀泊。
在當(dāng)前分支(如master)上執(zhí)行git merge dev
优训,把dev分支合并到master,注意提示信息中說有沖突各聘。
解決沖突后提交揣非,合并dev分支工作內(nèi)容就完成了。
同樣躲因,再次執(zhí)行git merge fix_bug1762
命令早敬,把分支fix_bug1762合并到master上。
同樣提示信息標(biāo)識HelloGit.java文件在合并過程中出現(xiàn)了沖突大脉,需要人工介入搞监。
解決沖突后再次提交,合并fix_bug1762分支的工作也完成了镰矿。這樣琐驴,master上就接收了dev和fix_bug1762兩個(gè)分支的修改。
當(dāng)然秤标,我們通過版本庫管理的绝淡、需要解決沖突的,都是文本文件苍姜。如果你不嫌麻煩牢酵,使用vi、記事本等工具都可以解決沖突怖现。但是茁帽,在日常開發(fā)過程中,總有合適的合并屈嗤、解決沖突的工具供你使用潘拨,例如Eclipse中的EGit。
刪除分支
是時(shí)候和分支說再見了铁追。
當(dāng)我們合并完分支的修改后,根據(jù)需要茫船,就可以刪除分支了琅束。
請注意branch和tag的區(qū)分,tag是階段性的工作算谈,需要保留的涩禀,如v5.25.RELEASE。而branch通常都是臨時(shí)性的工作然眼,完成修改艾船、合并后,一般需要丟棄。
執(zhí)行git branch -d dev
命令屿岂,刪除dev分支践宴。
執(zhí)行git branch -d fix_bug1762
命令,刪除fix_bug1762分支爷怀。
這些操作阻肩,都是在本地庫上進(jìn)行的。根據(jù)需要运授,你可隨時(shí)推送到遠(yuǎn)端庫烤惊,把你的工作成果分享給小伙伴們。