merging
有時(shí)合并導(dǎo)致沖突舷蒲。通常它們很容易解決,但你需要解決它們否則你的倉庫將會(huì)有多個(gè)頭。誰又想要多個(gè)頭呢惨恭?
版本控制一個(gè)非常重要的組成部分是在同一個(gè)代碼庫中進(jìn)行多人協(xié)同工作。
想象一下Rose和我都想對果醬食譜進(jìn)行修改耙旦。Rose提高了牛油果的品質(zhì)脱羡。在她開始工作前,她將從中央倉庫拉取所有的最新變動(dòng)免都,以便自己在最新版本上工作锉罐。
現(xiàn)在看下編輯情況:
她提交并且推送這一變化到中央倉庫:
同時(shí),我在這一文件的不同的地方做了一些更改:
我能夠提交绕娘,但是我不能夠推送到中央倉庫脓规。
這也許是在水銀中最沒有用的錯(cuò)誤信息,它應(yīng)該這樣說:
事實(shí)险领,那正是我將要做的:
好奇剛剛來了什么侨舆?輸入** hg log -P**。這一命令可以幫助你方便地查看绢陌。
事實(shí)上挨下,那是Rose較早的改動(dòng),我的倉庫現(xiàn)在該怎么辦呢脐湾?
我有“多個(gè)頭”臭笆。本質(zhì)上,我的倉庫看起來如下:
看到兩個(gè)頭了嗎沥割?這是因?yàn)镽ose的改動(dòng)是基于變更集7的耗啦,而我的改動(dòng)也是基于變更集7的。所以現(xiàn)在有必要進(jìn)行合并机杜。(千萬不要忽略它)
合并命令帜讲,hg merge,合并兩個(gè)頭椒拗,并將結(jié)果保存在我的工作目錄似将,它沒有提交,這給了一個(gè)機(jī)會(huì)讓我來檢查合并是否正確:
這看起來是對的蚀苛,鱷梨是Hass在验,辣椒是胡椒,所以我將繼續(xù)下一步堵未,將其推送到服務(wù)器腋舌。
我推送了兩個(gè)變更集:我原來的墨西哥胡椒變更,和之后的合并渗蟹,這是它自己的變更集块饺。
注意我倆各自的變更之間沒有沖突赞辩。因?yàn)槲液蚏ose在修改配方的不同部分。所以合并非常容易授艰。這是最常見的情況辨嗽,因?yàn)樵诖蠖鄶?shù)組織中,每個(gè)程序員被分配在不同的代碼段進(jìn)行工作淮腾。
但是糟需,即便是管理再好的、健康的組織谷朝,合并沖突時(shí)有發(fā)生洲押,這時(shí)水銀會(huì)要求人為地來解決這些沖突。讓我們看看那是什么樣子的徘禁。
首先......我想要讓Rose的把我的變更集給拉下來:
現(xiàn)在诅诱,我們來看下將要發(fā)生什么髓堪,當(dāng)有一些沖突送朱,我們都要修改一下配料。
我添加了一個(gè)香蕉:
我先檢查下香蕉的變化:
而Rose干旁,在完全相同的一行添加了一個(gè)芒果驶沼。
確切地說是“ripe young mango”。
這次我先上傳了我的變更争群,所以Rose必須進(jìn)行合并回怜。哈!
忽然换薄,沖突被檢測到玉雾,并彈出一些合并沖突的解決工具,是不太友好的界面轻要,但是他們通常是非好好用的复旬,你能想到的功能都有。一個(gè)常見的合并沖突解決工具是 KDiff3, 如下:
在KDiff3中冲泥,你能看到4塊窗口驹碍,左上角是原始文件,上面中間部分顯示Rose的版本凡恍,右上方顯示我的版本志秃。下面的窗口中是一個(gè)編輯器,Rose在這里解決沖突并構(gòu)建出合并的文件嚼酝。
修改沖突是一個(gè)相對簡單的問題浮还,要做的是遍歷每一個(gè)沖突并且做一個(gè)選擇題。Rose決定用香蕉芒果醬闽巩。
Rose保存了她的改動(dòng)并且退出了KDiff3钧舌。
沖突解決了流码。
有一件事你要牢記:你不必按照任何人的時(shí)刻表去合并。你在任何時(shí)候都可以使用hg pull延刘,如果你不想要合并沖突漫试,你完全可以繼續(xù)工作,然后愉快地提交碘赖。等到你什么時(shí)候想合并了驾荣,你再合并。
自測
以下是你讀完本篇教程應(yīng)當(dāng)會(huì)做的事:
- 與他人在相同的代碼塊上工作普泡。
- 獲得他人的變更播掷。
- 推送你自己的變更。
- 解決合并沖突撼班。