Raz za čas dôjde ku konfliktu pri aktualizácii/zlúčení súborov z úložiska alebo pri zmene pracovnej kópie na inú adresu URL. Existujú dva druhy konfliktov:
Konflikt súboru nastane, ak dvaja (alebo viacerí) vývojári zmenili niekoľko tých istých riadkov súboru.
Konflikt stromu nastane, keď vývojár presunul/premenoval/odstránil súbor alebo priečinok, ktorý iný vývojár tiež presunul/premenoval/odstrínil alebo práve upravil.
Konflikt súboru nastane, keď dvaja alebo viacerí vývojári zmenili rovnakých pár riadkov súboru. Pretože Subversion o vašom projekte nič nevie, riešenie konfliktov prenecháva vývojárom. Konfliktná oblasť v textovom súbore je označená takto:
<<<<<<< názov súboru vaše zmeny ======= kód zlúčený z úložiska >>>>>>> revízia
Taktiež pre každý konfliktný súbor Subversion umiestni do vášho adresára ďalšie tri súbory:
Toto je váš súbor, aký existoval vo vašej pracovnej kópii predtým, ako ste pracovnú kópiu aktualizovali - teda bez príznakov konfliktov. Tento súbor obsahuje vaše posledné zmeny a nič iné.
Toto je súbor, ktorý bol základnou (BASE) revíziou predtým, ako ste aktualizovali svoju pracovnú kópiu. Teda súbor, ktorý ste si overili pred vykonaním posledných úprav.
Toto je súbor, ktorý váš klient Subversion práve dostal zo servera, keď ste aktualizovali svoju pracovnú kópiu. Tento súbor zodpovedá HEAD revízii úložiska.
Môžete spustiť externý nástroj na zlučovanie alebo editor konfliktov pomocou <<<<<<<
.
Potom vykonajte príkaz filename.ext.mine
a filename.ext.r*
, ktoré vám umožnia vykonať zmeny.
Ak máte konflikty s binárnymi súbormi, Subversion sa nepokúsi zlúčiť samotné súbory. Miestny súbor zostane nezmenený (presne tak, ako ste ho naposledy zmenili) a máte súbory filename.ext.r*
. Ak chcete svoje zmeny zahodiť a uchovať si verziu úložiska, stačí použiť príkaz Vrátiť. Ak si chcete uchovať svoju verziu a prepísať verziu úložiska, použite príkaz Vyriešené a potom odovzdajte svoju verziu.
Príkaz Vyriešené môžete použiť pre viac súborov, ak kliknete pravým tlačidlom myši na nadradený priečinok a vyberiete
→ Zobrazí sa dialógové okno so zoznamom všetkých konfliktných súborov v danom priečinku a môžete si vybrať, ktoré z nich chcete označiť ako vyriešené.Ku konfliktu vlastností dôjde, keď dvaja alebo viacerí vývojári zmenili to isté vlastníctvo. Rovnako ako v prípade obsahu súborov, konflikt môžu vyriešiť iba vývojári.
Ak musí jedna zo zmien prepísať druhú, vyberte možnosť Vyriešiť použitím miestneho vlastníctva alebo Vyriešiť použitím vzdialeného vlastníctva. Ak je potrebné zmeny zlúčiť, vyberte možnosťRučne upraviť vlastníctvo, vytrieďte, aká by mala byť hodnota vlastnosti a označte ju ako vyriešenú.
Konflikt stromu nastane, keď vývojár presunul/premenoval/odstránil súbor alebo priečinok, ktorý iný vývojár tiež presunul/premenoval/odstránil alebo práve upravil. Existuje mnoho rôznych situácií, ktoré môžu vyústiť do konfliktu stromov a všetky si vyžadujú rôzne kroky na vyriešenie konfliktu.
Keď sa súbor lokálne odstráni v Subversion, vymaže sa aj z lokálneho súborového systému, takže aj keď je súčasťou konfliktu stromov, nemôže zobraziť konfliktné prekrytie a na jeho vyriešenie nemôžete kliknúť pravým tlačidlom myši. Namiesto použitia dialógu Skontrolujte úpravy pristúpte k možnosti Upraviť konflikty.
TortoiseSVN vám môže pomôcť nájsť správne miesto na zlúčenie zmien, ale na vyriešenie konfliktov môže byť potrebná ďalšia práca. Pamätajte, že po aktualizácii bude funkčný ZÁKLAD (BASE) vždy obsahovať revíziu každej položky tak, ako bola v úložisku v čase aktualizácie. Ak po aktualizácii vrátite zmenu, vráti sa späť do stavu úložiska, nie do stavu, v akom to bolo, keď ste začali robiť vlastné miestne zmeny.
Vývojár A upraví Foo.c
a odovzdá ho do úložiska.
Vývojár B sa súčasne presunul Foo.c
do Bar.c
v jeho pracovnej kópii alebo jednoducho odstránil Foo.c
alebo jeho nadradený priečinok.
Aktualizácia pracovnej kópie vývojára B vyústi do konfliktu stromov:
Foo.c
bol odstránený z pracovnej kópie, ale je označený konfliktom stromov.
Ak konflikt vyplýva skôr z premenovania než z odstránenia Bar.c
je označený ako pridaný, ale neobsahuje úpravy vývojára A.
Vývojár B sa teraz musí rozhodnúť, či zachová zmeny vývojára A. V prípade premenovania súboru môže zmeny zlúčiť do Foo.c
do premenovaného súboru Bar.c
. V prípade jednoduchého odstránenia súborov alebo priečinkov sa môže rozhodnúť ponechať položku so zmenami vývojára A a odstránenie zrušiť. Alebo tým, že označí konflikt za vyriešený bez toho, aby urobil čokoľvek, účinne zahodí zmeny vývojára A.
Dialógové okno na úpravu konfliktu ponúka zlúčenie zmien, ak dokáže nájsť pôvodný súbor premenovaného Bar.c
. Ak existuje viac súborov, ktorým je možné presunúť zdroje, potom sa pre každý z týchto súborov zobrazí tlačidlo, ktoré vám umožní zvoliť správny súbor.
Vývojár A presunie Foo.c
do Bar.c
a odovzdá zmeny v úložisku.
Vývojár B upraví Foo.c
v svojej pracovnej kópii.
Alebo v prípade premiestnenia priečinka...
Vývojár A presunie nadradený priečinok FooFolder
do BarFolder
a odovzdá ho do úložiska.
Vývojár B upraví Foo.c
v svojej pracovnej kópii.
Aktualizácia pracovnej kópie vývojára B vyústi do konfliktu stromov. Pre jednoduchý konflikt súborov:
Bar.c
je pridaný do pracovnej kópie ako normálny súbor.
Foo.c
je označený ako pridaný (s históriou) a má konflikt stromov.
Pre konflikt priečinkov:
Priečinok BarFolder
sa pridá do pracovnej kópie ako normálny priečinok.
Priečinok FooFolder
je označený ako pridaný (s históriou) a má konflikt stromov.
Súbor Foo.c
je označený ako upravený.
Developer B sa teraz musí rozhodnúť, či pôjde s reorganizáciou vývojára A a zlúči jeho zmeny do zodpovedajúceho súboru v novej štruktúre, alebo jednoducho vráti zmeny A a ponechá si lokálny súbor.
Ak chce zlúčiť svoje miestne zmeny preskupením, musí vývojár B najskôr zistiť, na aký názov súboru bol Foo.c
v úložisku premenovaný/presunutý. To je možné vykonať pomocou dialógového okna protokolu. Potom použite tlačidlo, ktoré zobrazuje správny zdrojový súbor, na vyriešenie konfliktu.
Ak sa vývojár B rozhodne, že zmeny A boli nesprávne, musí zvoliť Označiť ako vyriešené v dialógovom okne editora konfliktov. Toto označí konfliktný súbor alebo priečinok ako vyriešený, ale zmeny vývojára A je potrebné odstrániť ručne. Dialógové okno záznamu opäť pomáha sledovať, čo sa presunulo.
Vývojár A presunie Foo.c
do Bar.c
a odovzdá zmeny v úložisku.
Vývojár B presunie Foo.c
do Bix.c
.
Aktualizácia pracovnej kópie vývojára B vyústi do konfliktu stromov:
Súbor Bix.c
je označený ako pridaný s históriou.
Súbor Bar.c
sa pridá do pracovnej kópie so stavom „normálny“.
Súbor Foo.c
je označený ako odstránený a má konflikt stromov.
Na vyriešenie tohto konfliktu musí vývojár B zistiť, na aký názov súboru bol konfliktný súbor Foo.c
v úložisku premenovaný/presunutý. To je možné vykonať použitím dialógového okna protokolu.
Potom sa musí vývojár B rozhodnúť, ktorý názov nového súboru Foo.c
ponechať - ten, čo urobil vývojár A, alebo premenovaný, čo urobil sám.
Keď vývojár B konflikt ručne vyrieši, musí byť konflikt stromu označený ako vyriešený použitím tlačidla v dialógovom okne editora konfliktov.
Vývojár A pracujúci na kmeni upraví Foo.c
a odovzdá ho do úložiska
Vývojár B pracujúci na vetve presunie Foo.c
do Bar.c
a odovzdá ho do úložiska
Zlúčenie kmeňa vývojára A do vetvy pracovnej kópie vývojára B vedie ku konfliktu stromov:
Súbor Bar.c
je už v pracovnej kópii so stavom „normálny“.
Súbor Foo.c
je označený ako chýbajúci s konfliktom stromov.
Na vyriešenie tohto konfliktu musí vývojár B označiť súbor ako vyriešený v dialógovom okne editora konfliktov, ktoré ho odstráni zo zoznamu konfliktov. Potom sa musí rozhodnúť, či skopíruje chýbajúci súbor Foo.c
z úložiska do pracovnej kópie, či sa majú zlúčiť zmeny vývojára A do súboru Foo.c
v premenovanom súbore Bar.c
alebo či ignorovať zmeny označením konfliktu ako vyriešeného a neurobiť nič iné.
Upozorňujeme, že ak skopírujete chýbajúci súbor z úložiska a potom ho označíte ako vyriešený, vaša kópia sa znova odstráni. Najprv musíte vyriešiť konflikt.
Vývojár A pracujúci na kmeni presunie súborFoo.c
do Bar.c
a odovzdá ho do úložiska.
Vývojár B pracujúci na vetve upraví súbor Foo.c
a odovzdá ho do úložiska.
Vývojár pracujúci na kmeni presunie nadradený priečinok FooFolder
do BarFolder
a odovzdá ho do úložiska.
Vývojár B pracujúci na vetve upraví súbor Foo.c
vo svojej pracovnej kópii.
Zlúčenie kmeňa vývojára A do vetvy pracovnej kópie vývojára B vedie ku konfliktu stromov:
Súbor Bar.c
je označený ako pridaný.
Súbor Foo.c
je označený ako upravený konfliktom stromov.
Developer B sa teraz musí rozhodnúť, či pôjde s reorganizáciou vývojára A a zlúči jeho zmeny do zodpovedajúceho súboru v novej štruktúre, alebo jednoducho vráti zmeny A a ponechá si lokálny súbor.
Ak chce zlúčiť svoje lokálne zmeny preskupením, musí vývojár B najskôr zistiť, na aký názov bol konfliktný súbor Foo.c
v úložisku premenovaný/presunutý. To je môže vykonať použitím dialógového okna záznamu pre zlúčenie zdroja. Editor konfliktov zobrazuje iba záznam pracovnej kópie, pretože nevie, ktorá cesta v zlúčení bola použitá, takže to bude musieť nájsť sám. Zmeny musí potom zlúčiť ručne, pretože v súčasnosti neexistuje spôsob, ako tento proces automatizovať alebo dokonca zjednodušiť. Po prenesení zmien je konfliktná cesta nadbytočná a dá sa odstrániť.
Ak vývojár B rozhodne, že zmeny vývojára A boli nesprávne, musí zvoliť Označiť ako vyriešené v dialógovom okne editora konfliktov. Toto označí konfliktný súbor alebo priečinok ako vyriešený, ale zmeny vývojára A je potrebné odstrániť ručne. Dialógové okno záznamu pre zlúčenie zdroja opäť pomáha sledovať, čo sa presunulo.
Vývojár A pracujúci na kmeni presunie súborFoo.c
do Bar.c
a odovzdá ho do úložiska.
Vývojár B pracujúci na pobočke presunie súbor Foo.c
do Bix.c
a odovzdá ho do úložiska.
Zlúčenie kmeňa vývojára A do vetvy pracovnej kópie vývojára B vedie ku konfliktu stromov:
Súbor Bix.c
je označený normálnym stavom (bez úpravy).
Súbor Bar.c
je označený ako pridaný s históriou.
Súbor Foo.c
je označený ako chýbajúci a má konflikt stromov.
Na vyriešenie tohto konfliktu musí vývojár B zistiť, na aký názov bol konfliktný súbor Foo.c
v úložisku premenovaný/presunutý. To je možné vykonať použitím dialógového okna záznamu pre zlúčenie zdroja.
Potom sa musí vývojár B rozhodnúť, ktorý názov nového súboru Foo.c
ponechať - ten, čo urobil vývojár A, alebo premenovaný, čo urobil sám.
Keď vývojár B konflikt ručne vyrieši, musí byť konflikt stromu označený ako vyriešený použitím tlačidla v dialógovom okne editora konfliktov.
Existujú aj iné prípady, ktoré sú označené ako konflikty stromov jednoducho preto, lebo konflikt sa týka skôr priečinka ako súboru. Napríklad ak do kmeňa a vetvy pridáte priečinok s rovnakým názvom a potom sa pokúsite zlúčiť, dôjde ku konfliktu stromov. Ak chcete, aby priečinok nebol v cieľovej oblasti zlúčenia, stačí konflikt označiť ako vyriešený. Ak chcete použiť ten v zdroji zlúčenia, potrebujete najskôr ten cieľový SVN odstrániť a znova spustiť zlúčenie. Ak potrebujete niečo komplikovanejšie, musíte to vyriešiť manuálne.