Konfliktinių suliejimų valdymas

(šis puslapis - viena iš LithuanianTutorial įvado dalių. Ankstesnė dalis - LithuanianTutorialMerge, kita dalis - LithuanianTutorialConclusion)

Praeitame skyrelyje susipažinome su paprastais suliejimais (Merge).

Mercurial sistema taip pat atlieka ir sudėtingesnius suliejimus. Ne taip jau retai atsitinka, kad du žmonės pakeičia tas pačias failo eilutes, ir tada turi nuspręsti, ką toliau daryti. Tokios situacijos vadinamos konfliktais, o tinkamos išeities radimas vadinamas konflikto išsprendimu (resolve).

Iš pradžių suskurkime dirbtinę konfliktinę situaciją. Kaip jau ne kartą darėme anksčiau, visų pirma, klonuokime mano-hello saugyklą:

$ cd ..
$ hg clone mano-hello mano-hello-konfliktas
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

Dabar į hello.c failą įrašykime naują eilutę:

  $ cd mano-hello-konfliktas
  $ edit hello.c

main funkciją pakeičiame taip:

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("Man nepatinka konfliktai...\n");
        return 0;
}

Patvirtiname (Commit) pakeitimą:

$ hg commit -m "Konfliktinis suliejimas"

Prisiminkime, kad mokydamiesi atlikti mūsų primąjį pakeitimą mano-hello-nauja-eilute saugykloje sukūrėme pakietimų rinkinį (ChangeSet), kuris taip pat pridėjo antrą išvesties eilutę į hello.c failą. Kas nutiks, kai pabandysime tą pakeitimų rinkinį įkelti į dabartinę namo-hello-konfliktas saugyklą?

$ hg pull ../mano-hello-nauja-eilute
pulling from ../mano-hello-nauja-eilute
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

Kol kas viskas gerai. Pabandykime atnaujinti (Update) darbinį katalogą:

$ hg update
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

Kaip ir praeitame skyrelyje, dabar turime atlikti suliejimą, naudodami komandą merge. Tačiau Mercurial negalės automatiškai sulieti pakeitimų, nes to pačio failo ta pati eilutė buvo skirtingai modifikuota dviejuose pakeitimų rinkiniuose (viename, kurį kątik patvirtinome, ir kitame, kurį įtraukėme).

$ hg merge

Kas nutinka šiuo momentu, priklauso nuo to, kaip sukonfiguruota Mercurial sistema jūsų kompiuteryje (žr. MergeToolConfiguration). Standartiškai, Mercurial į bandomą sulieti failą įterpia specialius žymeklius, rodančius konfliktines eilutes:

/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
<<<<<<< local
        printf("Man nepatinka konfliktai...\n");
=======
        printf("Man patinka naudotis Mercurial!\n");
>>>>>>> other
        return 0;
}

Kai ir anksčiau, modifikuotus failus galime pamatyti pasinaudoję status komanda. Prieš įterpdama konfliktinių eilučių žymeklius, Mercurial sistema išsaugojo originalaus failo kopiją (t.y. failo būseną, kuri buvo prieš atliekant suliejimą):

$ hg status
M hello.c
? hello.c.orig

Norėdami išspręsti konfliktą, hello.c failą atsidarome teksto redaktoriuje, ištriname Mercurial įterptus žymeklius ir "Man nepatinka konfliktai...\n" eilutę, palikdami tik anksčiau pridėtą eilutę "Man patinka naudotis Mercurial!\n". Tada galime išsaugoti pakeitimus ir uždaryti teksto redaktorių.

Tada Mercurial sistemai pranešame, kad išsprendėme konfliktą, naudodami komandą resolve:

$ hg resolve -m hello.c

Mercurial čia nerodo jokios išvesties.

Kaip visada, nepamirškime atlikę suliejimą patvirtintį naują pakeitimų rinkinį:

$ hg commit -m "Sulieti pakeitimai is mano-hello-nauja-eilute"

Čia matėme standartinį Mercurial elgesį, valdant konfliktinius suliejimus. Jeigu norite, galite nustatyti Mercurial taip, kad automatiškai būtų atidaromas teksto redaktoriaus langas. Taip pat galima automatiškai iškviesti ir išorinius trišalius suliejimų įrankius. Plačiau apie šias galimybes - MergeToolConfiguration.

Išmokome susidoroti ir su sudėtingomis suliejimų situacijomis.

Toliau - baigiamoji dalis LithuanianTutorialConclusion.


CategoryTutorial

LithuanianTutorialConflict (last edited 2013-04-25 10:07:11 by MariusKrivicius)