Řešení Konfliktů

Jednou za čas, dostanete konflikt, když při aktualizaci/sloučení souborů z úložiště, nebo při překlopení Vaší pracovní kopie na jinou adresu URL. Jsou dva druhy konfliktů:

konflikty souboru

Konflikt souboru nastane, pokud dva (nebo více) vývojářů změní stejné řádky v souboru.

konflikty stromu

Konflikt stromu nastane, když vývojář přesune/přejmenuje/vymaže nějaký soubor nebo adresář, který jiný vývojář buď také přesunul/přejmenoval/ smazat, nebo právě upravil.

Konflikty souboru

Konflikt souboru nastane, když dva nebo více vývojářů změní stejné řádky v souboru. Protože Subversion neví nic o Vašem projektu, ponechá řešení konfliktů na vývojářích. Konfliktní oblast je v textovém souboru označena takto:

 
<<<<<<< název souboru
vaše změny
=======
   kód sloučený z úložiště
>>>>>>> revize

Také, pro každý soubor v konfliktu Subversion umístí další tři soubory ve Vašem adresáři:

filename.ext.mine

Toto je Váš soubor, jak vypadal v pracovní kopii, než jste ji aktualizovali - to je, bez značek konfliktu. Tento soubor má v něm Vaše poslední změny a nic jiného.

filename.ext.rOLDREV

Jedná se o soubor, který byl základní revizí před aktualizací Vaší pracovní kopie. To znamená, soubor, který jste získlali předtím, než jste provedli Vaše poslední úpravy.

filename.ext.rNEWREV

Jedná se o soubor, který váš klient Subversion právě obdržel ze serveru při aktualizaci Vaší pracovní kopie. Tento soubor odpovídá revizi HEAD v úložišti.

Můžete buď spustit externí nástroj sloučení / editor konfliktů s TortoiseSVNUpravit Konflikty nebo můžete použít jakýkoli jiný editor pro ruční vyřešení konfliktu. Měli byste se rozhodnout, jak má kód vypadat, udělat potřebné změny a soubor uložit. Použitím nástroje sloučení jako TortoiseMerge nebo jeden z dalších oblíbených nástrojů, je obecně ta snazší volba protože většinou soubory zobrazují v trojpanelovém zobrazení a nemusíte se starat o značky konfliktů. Pokud používáte textový editor, pak byste měli hledat řádky začínající řetězcem <<<<<<<.

Poté spusťte příkaz TortoiseSVNVyřešeno a odevzdejte Vaše změny do úložiště. Vezměte prosím na vědomí, že příkaz Vyřešeno ve skutečnosti konfliktu nevyřeší. Pouze odstraní soubory filename.ext.mine a filename.ext.r*, které Vám umožní změny odevzdat.

Máte-li konflikt ve spustitelných souborech, Subversion se nepokusí soubory sloučit. Místní soubor zůstane beze změny (přesně tak, jak jste ho naposledy změnili) a máte soubory filename.ext.r*. Pokud chcete změny zahodit a nechat si verzi z úložiště, stačí použít příkaz Vrátit. Pokud si chcete nechat Vaši verzi a přepsat verzi z úložiště, použijte příkaz Vyřešeno, pak odevzdejte svoji verzi.

Můžete použít příkaz Vyřešeno na více souborů, pokud kliknete pravým tlačítkem na nadřazený adresář a zvolíte TortoiseSVN Vyřešeno... zobrazí se dialogové okno se seznamem všech souborů v konfliktu v tomto adresáři a můžete si vybrat, které z nich označit jako vyřešené.

Konflikt Vlastností

Konflikt vlastností nastane, když dva nebo více vývojářů změní stejnou vlastnost. Tak jako s obsahem souboru, pouze vývojáři mohou konflikt vyřešit.

Pokud jedna ze změn musí vyřadit druhou, pak zvolte možnost Vyřešit použitím místní vlastnosti nebo Vyřešit pomocí vzdálené vlastnosti. Pokud změny musí být sloučeny tak poté zvolte Ručně změnit vlastnost, vyřešte jaká má být hodnota vlastnosti a označit ji jako vyřešenou.

Konflikty Stromu

Konflikt stromu nastane, když vývojář přesune/přejmenuje/vymaže nějaký soubor nebo adresář, který jiný vývojář buď také přesunul/přejmenoval/ smazal, nebo právě upravil. Existuje mnoho různých situací, které mohou vyústit v konflikt stromu a všechny z nich vyžadují různé kroky k jeho vyřešení.

Když je soubor v Subversion smazán lokálně, je také smazán z lokálního souborového systému, takže i když je součástí konfliktu stromu nemůže ukázat překrytí konfliktu a nemůžete na něj kliknout pravým tlačítkem myši, abyste ho vyřešili. Použijte dialogové okno Zkontrolovat změny místo volby Upravit konflikt.

TortoiseSVN Vám může pomoci najít správné místo ke sloučení změn, ale možná bude za potřebí další práce potřebná k vyřešení konfliktů. Pamatujte si, že po aktualizaci pracovního originálu bude vždy obsahovat revizi jednotlivých položek, tak jak byly v úložišti v době aktualizace. Pokud vrátíte změny po aktualizaci, vrátí se zpátky do stavu úložiště, ne jak byla, když jste začali provádět své vlastní místní změny.

Místní smazání, příchozí úpravy po aktualizaci

  1. Vývojář A změní Bla.c a odevzdá ho do úložiště.

  2. Vývojář B ve stejnou dobu přesune Bla.c do Alb.c v jeho pracovní kopii, nebo jednoduše smaže Bla.c nebo jeho nadřazený adresář.

Aktualizace pracovní kopie vývojáře B má za následek konflikt stromu:

  • Bla.c byl smazán z pracovní kopie, ale je označen konfliktem stromu.

  • Pokud konflikt vyplývá z přejmenování spíše než ze smazání pak Alb.c je označen jako přidaný, ale neobsahuje změny vývojáře A.

Vývojář B musí nyní rozhodnout, zda zachovat změny vývojáře A. V případě přejmenování souboru, může sloučit změny Bla.c do přejmenovaného souboru Alb.c. V případě prostého odstranění souboru nebo adresáře si může vybrat, zda si nechat položku se změnami vývojáře A a odstranění zruší. Nebo tím, že označení konfliktu jako vyřešený, aniž by něco udělal, se zbaví změn vývojáře A.

The conflict edit dialog offers to merge changes if it can find the original file of the renamed Bar.c. If there are multiple files that are possible move sources, then a button for each of these files is shown which allow you to chose the correct file.

Místní upravení, po aktualizaci příchozí smazání

  1. Vývojář A přesune Bla.c do Alb.c a odevzdá ho do úložiště.

  2. Vývojář B změní Bls.c v jeho pracovní kopii.

Nebo v případě přesunutí adresáře...

  1. Vývojář A přesune nadřazený adresář AdresářBla do AdresářAlb a odevzdá ho do úložiště.

  2. Vývojář B změní Bls.c v jeho pracovní kopii.

Aktualizace pracovní kopie vývojáře B má za následek konflikt stromu. Pro jednoduchý konflikt souboru:

  • Alb.c je přidán do pracovní kopie jako normální soubor.

  • Bla.c je označen jako přidaný (s historií) a má konflikt stromu.

Pro konflikt adresářů:

  • AdresářAlb je přidán do pracovní kopie jako normální adresář.

  • AdresářBla je označen jako přidaný (s historií) a má konflikt stromu.

    Bla.c je označen jako upravený.

Vývojář B musí nyní rozhodnout, zda souhlasit s reorganizací vývojáře A a sloučit její změny do odpovídajícího souboru v nové struktuře, nebo jednoduše vrátit změny vývojáře A a ponechat si místní soubor.

To merge her local changes with the reshuffle, Developer B must first find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog. Then use the button which shows the correct source file to resolve the conflict.

If Developer B decides that A's changes were wrong then she must choose the Mark as resolved button in the conflict editor dialog. This marks the conflicted file/folder as resolved, but Developer A's changes need to be removed by hand. Again the log dialog helps to track down what was moved.

Místní smazání, po aktualizaci příchozí smazání

  1. Vývojář A přesune Bla.c do Alb.c a odevzdá ho do úložiště.

  2. Vývojář B přesune Bla.c na Elb.c.

Aktualizace pracovní kopie vývojáře B má za následek konflikt stromu:

  • Elb.c je označeno jako přidaný s historií.

  • Alb.c je přidán do pracovní kopie se stavem 'normální'.

  • Bla.c je označen jako smazaný a má konflikt stromu.

Pro vyřešení tohoto konfliktu, Vývojář B musí zjistit, jak byl konfliktní soubor Bla.c v úložišti přejmenován/přesunut. To lze provést pomocí dialogového okna záznamů.

Pak vývojář B musí rozhodnout, jaké nové jméno souboru Bla.c si ponechat - to od vývojáře A nebo to jeho.

Poté, co vývojář B ručně konflikt vyřešil, konfliktu stromu musí být označen jako vyřešený pomocí tlačítka v dialogovém okně editoru konfliktu.

Místní chybí, po sloučení příchozí úprava

  1. Vývojář A pracující v kmeni změní Bla.c a odevzdá ho do úložiště

  2. Vývojář B pracující na větvi přesune Bla.c do Alb.c a odevzdá ho do úložiště

Sloučení změn kmene vývojáře A do pracovní kopie větve vývojáře B vyústí v konflikt stromu:

  • Alb.c je již v pracovní kopii se stavem 'normální'.

  • Bla.c je označen jako chybějící s konfliktem stromu.

Pro vyřešení tohoto konfliktu Vývojář B musí označit soubor jako vyřešený v dialogovém okně editoru konfliktu, což ho ze seznamu konfliktu odstraní. Pak musí rozhodnout, zda zkopírovat chybějící soubor Bla.c z úložiště do pracovní kopie, zda sloučit změny Bla.c Vývojáře A do přejmenovaného Alb.c nebo zda ignorovat změny označením konfliktu za vyřešený a nedělat nic.

Nezapomeňte, že pokud zkopírujete chybějící soubor z úložiště a pak označíte konflikt jako vyřešený, Vaše kopie bude znovu odstraněna. Nejdříve musíte konflikt vyřešit.

Místní úprava, po sloučení příchozí smazání

  1. Vývojář A pracující na kmeni přesune Bla.c do Alb.c a odevzdá ho do úložiště.

  2. Vývojář B pracující na větvi změní Bla.c a odevzdá ho do úložiště.

  1. Vývojář A pracující na kmeni přesune nadřazený adresář AdresářBla do AdresářAlb a odevzdá ho do úložiště.

  2. Vývojář B pracující na větvi změní Bla.c v jeho pracovní kopii.

Sloučení změn kmene vývojáře A do pracovní kopie větve vývojáře B vyústí v konflikt stromu:

  • Alb.c je označen jako přidaný.

  • Bla.c je označen jako upravený s konfliktem stromu.

Vývojář B musí nyní rozhodnout, zda souhlasit s reorganizací vývojáře A a sloučit její změny do odpovídajícího souboru v nové struktuře, nebo jednoduše vrátit změny vývojáře A a ponechat si místní soubor.

To merge her local changes with the reshuffle, Developer B must first find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog for the merge source. The conflict editor only shows the log for the working copy as it does not know which path was used in the merge, so you will have to find that yourself. The changes must then be merged by hand as there is currently no way to automate or even simplify this process. Once the changes have been ported across, the conflicted path is redundant and can be deleted.

If Developer B decides that A's changes were wrong then she must choose the Mark as resolved button in the conflict editor dialog. This marks the conflicted file/folder as resolved, but Developer A's changes need to be removed by hand. Again the log dialog for the merge source helps to track down what was moved.

Místní smazání, po sloučení příchozí smazání

  1. Vývojář A pracující na kmeni přesune Bla.c do Alb.c a odevzdá ho do úložiště.

  2. Vývojář B pracující na větvi přesune Bla.c do Elb.c a odevzdá ho do úložiště.

Sloučení změn kmene vývojáře A do pracovní kopie větve vývojáře B vyústí v konflikt stromu:

  • Elb.c je označen normálním (bez úprav) stavem.

  • Alb.c je označen jako přidaný s historií.

  • Bla.c je označen jako chybějící a má konfliktu stromu.

To resolve this conflict, Developer B has to find out to what filename the conflicted file Foo.c was renamed/moved in the repository. This can be done by using the log dialog for the merge source.

Pak vývojář B musí rozhodnout, jaké nové jméno souboru Bla.c si ponechat - to od vývojáře A nebo to jeho.

Poté, co vývojář B ručně konflikt vyřešil, konfliktu stromu musí být označen jako vyřešený pomocí tlačítka v dialogovém okně editoru konfliktu.

Ostatní konflikty stromu

Existují i další případy, které jsou označeny jako konflikt stromu konflikty jen proto, že konflikt zahrnuje spíše adresář než soubor. Například, pokud přidáte adresář se stejným názvem, jak do kmene, tak do větve a pak se je pokusíte sloučit dostanete konflikt stromu. Pokud chcete zachovat adresář z cíle sloučení, označit konflikt jako vyřešený. Pokud chcete použít ten ze zdroje sloučení, pak je třeba nejdříve SVN smazat ten v cíli a sloučení znovu spustit. Pokud budete potřebovat udělat něco složitějšího, pak to budete muset řešit ručně.