概念
Git的合并(Merge)是針對兩條或以上分支所進(jìn)行的操作昌跌,所以在Git中仰禀,我們說合代碼,其實(shí)是合分支蚕愤,或者說讓各分支進(jìn)行同步答恶。
可能剛接觸Git時(shí)饺蚊,你會疑惑說,我和同事都在一個(gè)叫master的分支上開發(fā)悬嗓,并沒有各自的分支拔酆簟?
實(shí)際上包竹,大家是在各自的本地Git上開發(fā)燕酷,而大家工作區(qū)所在的本地分支恰恰都用了默認(rèn)名字master而已。即你有你的master分支周瞎,我也有我的master分支苗缩。當(dāng)大家push到遠(yuǎn)程倉庫的時(shí)候,遠(yuǎn)程倉庫還有一個(gè)叫master的分支声诸。
所以假如是2人開發(fā)同一項(xiàng)目酱讶,然后又使用遠(yuǎn)程倉庫來同步的話,這種情況下其實(shí)是至少存在3條分支需要我們?nèi)ネ健?/p>
合并指令
合并至少涉及到兩個(gè)分支彼乌。在合并時(shí)浴麻,可以理解為站在某個(gè)分支的角度,對另一個(gè)需要被合并進(jìn)來的分支發(fā)出指令囤攀。
git merge 需要被合并進(jìn)來的分支名
通過git log --graph
可以圖形化查看版本庫歷史記錄软免,將看到被合并的分支匯入了當(dāng)前發(fā)起指令的分支。
自動合并
在條件具足的時(shí)候焚挠,Git的合并可以智能化完成膏萧,在成功后創(chuàng)建一次合并結(jié)果的提交。
什么是條件具足蝌衔?
- 假如要合并的兩個(gè)分支沒有對同一個(gè)文件進(jìn)行增刪改查榛泛,兩個(gè)分支各干各的事情毫無沖突,這個(gè)時(shí)候Git可以順利合并噩斟。
- 假如要合并的兩個(gè)分支都對同一個(gè)文件修改了曹锨,但只要這個(gè)文件是個(gè)文本文件,且兩個(gè)分支所修改的地方不在同一處剃允,比如不在同一行上修改沛简,那么Git還是可以智能完成這次合并,它會同時(shí)采用兩個(gè)分支所作的修改斥废。
除此以外的合并椒楣,都需要人工介入處理。
編輯沖空
如果兩個(gè)分支對同一份文件的同一處分別進(jìn)行了修改牡肉,那么在合并它們時(shí)就會發(fā)生沖突捧灰,這種是最常見的編輯沖突。
這種情況下统锤,Git會把兩個(gè)分支的修改都同時(shí)寫入文件毛俏,并打上某些標(biāo)記炭庙,就像svn那樣的<<<、===煌寇、>>>和|||焕蹄,然后Git的合并操作中止,不會對這樣的結(jié)果自動提交唧席。
這時(shí)就需要人工介入,手動修改文件成你希望的合并的結(jié)果嘲驾,然后按往常的提交修改一樣淌哟,自己提交。
內(nèi)容沖突
有時(shí)候辽故,兩個(gè)分支對同一份文件分別作了不同的修改徒仓,而修改的地方各不相同,那么站在Git的角度誊垢,它認(rèn)為沒有沖突掉弛,會自動合并,并且產(chǎn)生一次提交喂走。
雖然從文件本質(zhì)上來說殃饿,Git以為它成功修改了一份文件,但是從文件意義上來說芋肠,它很可能已經(jīng)不能用了乎芳,已經(jīng)被這次自動合并改壞了!
例如某些格式嚴(yán)謹(jǐn)?shù)奈募兀瑑蓚€(gè)分支對其分別改動后奈惑,可能就前后不一致,無法發(fā)揮作用了睡汹。
這種可稱為內(nèi)容沖突肴甸,Git無法感知,需要結(jié)合場景多加注意囚巴。