merging
有時合并導(dǎo)致沖突。通常它們很容易解決,但你需要解決它們否則你的倉庫將會有多個頭。誰又想要多個頭呢?
版本控制一個非常重要的組成部分是在同一個代碼庫中進(jìn)行多人協(xié)同工作。
想象一下Rose和我都想對果醬食譜進(jìn)行修改。Rose提高了牛油果的品質(zhì)。在她開始工作前,她將從中央倉庫拉取所有的最新變動,以便自己在最新版本上工作。

現(xiàn)在看下編輯情況:

她提交并且推送這一變化到中央倉庫:

同時,我在這一文件的不同的地方做了一些更改:

我能夠提交,但是我不能夠推送到中央倉庫。

這也許是在水銀中最沒有用的錯誤信息,它應(yīng)該這樣說:

事實,那正是我將要做的:

好奇剛剛來了什么?輸入** hg log -P**。這一命令可以幫助你方便地查看。

事實上,那是Rose較早的改動,我的倉庫現(xiàn)在該怎么辦呢?

我有“多個頭”。本質(zhì)上,我的倉庫看起來如下:

看到兩個頭了嗎?這是因為Rose的改動是基于變更集7的,而我的改動也是基于變更集7的。所以現(xiàn)在有必要進(jìn)行合并。(千萬不要忽略它)

合并命令,hg merge,合并兩個頭,并將結(jié)果保存在我的工作目錄,它沒有提交,這給了一個機(jī)會讓我來檢查合并是否正確:

這看起來是對的,鱷梨是Hass,辣椒是胡椒,所以我將繼續(xù)下一步,將其推送到服務(wù)器。

我推送了兩個變更集:我原來的墨西哥胡椒變更,和之后的合并,這是它自己的變更集。
注意我倆各自的變更之間沒有沖突。因為我和Rose在修改配方的不同部分。所以合并非常容易。這是最常見的情況,因為在大多數(shù)組織中,每個程序員被分配在不同的代碼段進(jìn)行工作。
但是,即便是管理再好的、健康的組織,合并沖突時有發(fā)生,這時水銀會要求人為地來解決這些沖突。讓我們看看那是什么樣子的。
首先......我想要讓Rose的把我的變更集給拉下來:

現(xiàn)在,我們來看下將要發(fā)生什么,當(dāng)有一些沖突,我們都要修改一下配料。
我添加了一個香蕉:

我先檢查下香蕉的變化:

而Rose,在完全相同的一行添加了一個芒果。

確切地說是“ripe young mango”。

這次我先上傳了我的變更,所以Rose必須進(jìn)行合并。哈!

忽然,沖突被檢測到,并彈出一些合并沖突的解決工具,是不太友好的界面,但是他們通常是非好好用的,你能想到的功能都有。一個常見的合并沖突解決工具是 KDiff3, 如下:

在KDiff3中,你能看到4塊窗口,左上角是原始文件,上面中間部分顯示Rose的版本,右上方顯示我的版本。下面的窗口中是一個編輯器,Rose在這里解決沖突并構(gòu)建出合并的文件。
修改沖突是一個相對簡單的問題,要做的是遍歷每一個沖突并且做一個選擇題。Rose決定用香蕉芒果醬。

Rose保存了她的改動并且退出了KDiff3。

沖突解決了。
有一件事你要牢記:你不必按照任何人的時刻表去合并。你在任何時候都可以使用hg pull,如果你不想要合并沖突,你完全可以繼續(xù)工作,然后愉快地提交。等到你什么時候想合并了,你再合并。
自測
以下是你讀完本篇教程應(yīng)當(dāng)會做的事:
- 與他人在相同的代碼塊上工作。
- 獲得他人的變更。
- 推送你自己的變更。
- 解決合并沖突。