Sloučení

Tam, kde jsou větve používány k udržení samostatných linií vývoje, v určité fázi budete chtít provedené změny sloučit v jedné větvi zpět do kmene, nebo naopak.

Je důležité pochopit, jak větvení a slučování v Subversion funguje předtím, než ho začnete používat, protože to může být docela složité. Je výrazně doporučeno si přečíst kapitolu Větvení a slučování v knize Subversion, která dává úplný popis a mnoho příkladů toho, jak se používají.

Další bod pro zapamatování je, že sloučení se vždy odehrává v pracovní kopii. Pokud chcete sloučit změny do větve, musíte získat pracovní kopii této větve a spustit Průvodce sloučením z této pracovní kopie pomocí TortoiseSVNSloučit....

Obecně je dobrý nápad provést sloučení do nezměněné pracovní kopie. Pokud jste již provedli další změny ve Vaši pracovní kopii, nejdříve je odevzdejte. Jestliže slučovací nevyjde tak, jak jste očekávali, můžete změny vrátit a příkaz Vrátit zahodí všechny změny včetně těch odevzdaných před sloučením.

Existují tři běžné případy použití slučování, které jsou provedeny mírně odlišnými způsoby, jak je popsáno níže. Na první straně Vás průvodce sloučením vyzve k výběru metody, kterou potřebujete.

Sloučit řadu revizí

Tato metoda se vztahuje na případ, když máte jednu nebo více revizí ve větvi (nebo v kmeni) a chcete tyto změny přenést na jinou větev.

Co žádáte Subversion, aby udělal, je toto: Vypočítat nezbytné změny, jak se dostat [Z] revize 1 větve A [DO] revize 7 větve A a tyto změny provést v mé pracovní kopii (kmene nebo větve B).

Pokud rozsah revizí necháte prázdný, Subversion použije funkce sledování sloučení pro výpočet správného rozsahu revizí k použití. Toto je označováno jako znovuzačlenění či automatické sloučení.

Sloučení dvou různých stromů

Toto je obecnější případ znovu začleňovací metody. Co žádáte od Subversion, aby udělal, je: Vypočítat změny nezbytné pro získání [Z] revize head kmene [DO] head revize větve a uplatnit tyto změny na moji pracovní kopii (kmene). Výsledkem je, že kmen nyní vypadá přesně jako větev.

Pokud váš server/úložiště nepodporuje sledování sloučení pak toto je to jediný způsob, jak sloučit větve zpátky do kmene. Dalším případem použití je, když používáte dodavatelské větve a je třeba sloučit změny v důsledku nového vývoje dodavatele do kmenového kódu. Pro více informací si přečtěte kapitolu Dodavatelské větve v knize Subversion.

Sloučení Rozsahu Revizí

Obrázek 4.56. Průvodce Sloučením - Vyberte Rozsah Revizí

Průvodce Sloučením - Vyberte Rozsah Revizí


V poli Od: zadejte úplnou adresu URL adresáře větve nebo značky obsahující změny, které chcete přenést do Vaší pracovní kopie. Můžete také klepnout na ... pro procházení úložiště a vyhledání požadované větve. Pokud jste předtím slučovali z této větve, pak stačí použít rozbalovací seznam, který zobrazuje historii dříve použitých adres URL.

Pokud slučujete z přejmenované nebo smazané větve, pak budete muset přejít na revizi, kdy větev stále existovala. V takovém případě musíte také zadat tuto revizi jako zavěšenou v rozsahu revizí, které jsou slučovány (viz níže), jinak sloučení selže, když nemůže najít cestu v HEAD.

V poli Rozsah revizí ke sloučení zadejte seznam revizí, které chcete sloučit. To může být jedna revize, seznam konkrétních revizí oddělených čárkami nebo rozsah revizí oddělených pomlčkou, nebo jakákoliv jíná kombinace těchto možností.

Pokud potřebujete zadat zavěšenou revizi pro sloučení, přidejte ji na konci revizí, např. 5-7,[email protected]. Ve výše uvedeném příkladu by revize 5,6,7 a 10 byly sloučeny a 3 by byla zavěšená revize.

Důležité

Existuje významný rozdíl ve způsobu, jakým je zadáván rozsah revizí v TortoiseSVN v porovnání s příkazovým řádkem klienta. Nejjednodušší způsob, jak si toto představit, je uvažovat o plotu se sloupky a plotovými výplněmi.

S příkazovým řádkem klienta zadáte změny ke sloučení pomocí dvou sloupků plotu revizí, které stanoví body před a po.

S TortoiseSVN zadáváte seznam změn ke sloučení pomocí plotových výplní. Důvod pro to je jasný, když použijete dialogové okno záznamu k určení revizí ke sloučení, kde každá revize se objeví jako seznam změn.

Pokud slučujete revize v kusech, musíte podle metody uvedené v knize Subversion sloučit 100-200 teď a 200-300 příště. S TortoiseSVN byste slučovali 100-200 teď a 201-300 příště.

Tento rozdíl způsobil hodně nevraživosti v e-mailových konferencích. Jsme si vědomi, že existuje rozdíl v příkazovém řádku klienta, ale věříme, že pro většinu uživatelů GUI je snazší pochopit způsob, který jsme zavedli.

Nejjednodušší způsobem, jak zvolit rozsah revizí, který potřebujete, je kliknout na Zobrazit záznamy, protože toto zobrazí seznam nedávných změn s jejich komentáři záznamů. Pokud chcete sloučit změny z jedné revize, stačí tuto revizi vybrat. Pokud chcete sloučit změny z několika revizí, pak vyberte rozsah (za použití obvyklých Shift-Modifikátor). Klikněte na OK a seznam čísel revizí ke sloučení je vyplněn za Vás.

Pokud chcete sloučit změny zpět z Vaší pracovní kopie, vrátit změny, které jste již odevzdali, vyberte revize k vrácení a ujistěte se, že políčko Reverzní sloučení je zaškrtnuto.

Pokud jste již sloučili některé změny z této větve, doufejme, že jste si poznamenali poslední sloučenou revizi ve zprávách záznamu, když jste odevzdali změny. V takovém případě můžete použít Zobrazit záznam pracovní kopie pro vyhledání této zprávy záznamu. Pamatujte si, že o revizích uvažujeme jako o sadě změn. Měli byste použít další revizi po bodu posledního sloučení jako výchozí bod pro toto sloučení. Například, pokud jste posledně sloučil revize 37 až 39, pak počátečním bodem pro toto sloučení by měla být revize 40.

Pokud používáte Subversion funkce sledování sloučení, nemusíte si pamatovat, která revize je již sloučená - Subversion to bude zaznamenávat za Vás. Ponecháte-li rozsahu revizí prázdný, všechny revize, které dosud nebyly sloučeny budou zahrnuty. Přečtěte si „Sledování Sloučení“ a dozvíte se více.

Když je použito sledování sloučení, bude dialogové okno záznamu zobrazovat dříve sloučené revize a revize předcházející společnému bodu předchůdce, t.j. před zkopírováním větve, tak jak je vystínováno. Zaškrtávací políčko Skrýt neslučitelné revize umožňuje úplně odfiltrovat tyto revize tak, že vidíte pouze revize, které můžou být sloučeny.

Pokud ostatní můžou odevzdávat změny, pak buďte opatrní při používání revize HEAD. Nemusí odkazovat na revizi, kterou myslíte, pokud někdo jiný provedl odevzdání po Vaší poslední aktualizaci.

Pokud rozsah revizí necháte prázdný, nebo stiskněte políčko všechyn revize, pak Subversion sloučí všechny zatím nesloučené revize. Toto je označováno jako začlenění nebo automatické sloučení.

Existují některé podmínky, které se vztahují na znovu začleňovací sloučení. Za prvé, server musí podporovat sledování sloučení. Pracovní kopie musí mít nekonečnou hloubku (žádné řídké získání) a nesmí mít žádné lokální úpravy, překlopené položky nebo položky, které byly aktualizovány na revizi jinou než HEAD. Všechny změny provedené v kmeni v průběhu vývoje větve musí být sloučeny do větve (nebo označeny jako sloučené). Rozsah revizí sloučení bude vypočten automaticky.

Klepněte na tlačítko Další a přejděte na „Nastavení Sloučení“.

Sloučení Dvou Různých Stromů

Obrázek 4.57. Průvodce Sloučením - Sloučení Stromu

Průvodce Sloučením - Sloučení Stromu


Pokud používáte tuto metodu ke sloučení větve funkcí zpět do kmene, budete muset spustit průvodce sloučením z pracovní kopie kmene.

V poli Od: zadejte úplnou adresu URL adresáře kmene. To může znít špatně, ale nezapomeňte, že kmen je počáteční bod, ke kterému chcete přidat změny větve. Můžete také kliknout na ... k procházení úložiště.

V poli Do: zadejte úplnou adresu URL adresáře větve funkcí.

V obou polích Od Revize a Na Revizi, zadejte číslo poslední revize, při které byly dva stromy synchronizovány. Pokud si jste jisti, že nikdo jiný neodevzdává, můžete použít revizi HEAD v obou případech. Pokud existuje možnost, že někdo jiný mohl odevzdat od synchronizace, použijte konkrétní číslo revize, aby se zabránilo ztrátě novějších odevzdání.

Můžete také použít Zobrazit záznamy pro vybrání revize.

Nastavení Sloučení

Tato stránka průvodce umožňuje zadat rozšířené možnosti před zahájením procesu sloučení. Většinou stačí použít výchozí nastavení.

Můžete určit hloubku použitou pro sloučení, tj. jak hluboko do Vaší pracovní kopie by sloučení mělo jít. Použité pojmy hloubky jsou popsány v „Hloubka Získání“. Výchozí hloubka je Pracovní kopie, která využívá stávající nastavení hloubky a téměř vždy je to, co chcete.

Většinou chcete slučovat s přihlédnutím k historii souboru, takže jsou sloučeny změny týkající se společného předka. Někdy je potřeba sloučit soubory, které jsou možná příbuzné, ale ne ve vašem úložišti. Například můžete mít importovanou verzi 1 a 2 knihovny třetí strany do dvou samostatných adresářů. Ačkoli jsou logicky spojené, Subversion o tom nemá ponětí, protože vidí jen archivy vytvořené archivem tar, které jste importovali. Pokusíte-li se sloučit rozdíly mezi těmito dvěma stromy viděli byste úplně odstranění následované úplným přidáním. Chcete-li, aby Subversion používalo pouze rozdíly v cestě raději než rozdíly v historii, zaškrtněte políčko Ignorovat původ. Přečtěte si více o tomto tématu v knize Subversion, Všímání nebo nevšímání si předků.

Můžete určit, jak jsou řešeny změny mezer a konce řádků. Tyto možnosti jsou popsány v „Možnosti konců řádků a mezer“. Výchozí nastavení je zacházet se všemi rozdíly mezer a konce řádků jako skutečné změny, které mají být sloučeny.

Políčko označené Vnutit sloučení se používá pro zamezení konfliktů stromu, kde příchozí smazání ovlivňuje soubor, který je buď změněn lokálně, nebo vůbec verzi nemá. Pokud je soubor smazán, pak není způsob, jak ho obnovit, což je důvod, proč ve výchozím nastavení není tato volba zaškrtnutá.

Pokud používáte sledování sloučení a chcete označit revizi jako sloučenou, aniž by se skutečně slučovala, zaškrtněte poličko Pouze zaznamenat sloučení. Existují dva možné důvody, proč byste toto chtěli udělat. Je možné, že sloučení je příliš složité pro slučovací algoritmy, takže změny kódu uděláte ručně, pak označíte změny jako sloučené, takže algoritmus sledování sloučení je si toho vědom. Nebo budete chtít zabránit sloučení určité revize. Označit ji jako sloučenou se zabrání výskytu sloučení v klientech podporující sledování sločení.

Nyní je vše nastaveno, jediné, co musíte udělat, je kliknout na tlačítko Sloučit. Pokud chcete zobrazit výsledky před sloučením Testovat Sloučení simuluje tuto operaci, ale vůbec neupraví Vaši pracovní kopii. Ukáže Vám seznam souborů, které budou změněny ve skutečném sloučení, a zaznamená soubory, kde můžou nastat konflikty. Vzhledem k tomu, že sledování sloučení dělá proces sloučení mnohem složitější, neexistuje žádný způsob, jak předem zaručeně zjistit, zda sloučení bude dokončeno bez konfliktů, takže soubory označené jako konfliktní ve zkušebním sloučení můžou být ve skutečnosti sloučeny bez problémů.

Dialogové okno průběhu sloučení ukazuje každou fázi sloučení, s uvedeným rozsahem revizí. To může znamenat o jednu revizi více, než jste čekali. Například, pokud chcete sloučit revize 123, dialogové okno průběhu oznámí Slučuji revize 122 až 123. Je třeba si uvědomit, že sloučení je úzce spjato s porovnáním. Proces sloučení funguje tak, že tvoří seznam rozdílů mezi dvěma body v úložišti a tyto rozdíly vnese do pracovní kopie. Dialogové okno průběhu jen ukazuje počáteční a koncové body pro porovnání.

Zhodnocení výsledků sloučení

Sloučení je nyní dokončeno. Je dobrý nápad podívat se na sloučení a zkontrolovat, jestli dopadlo podle očekávání. Sloučení je obvykle poměrně složité. Konflikty často vznikají v případě, že větev se odchýlila příliš daleko od kmene.

Tip

Kdykoliv jsou revize sloučeny do pracovní kopie, TortoiseSVN vytvoří zprávu záznamu ze všech sloučených revizí. Ty jsou pak dostupné v dialogovém okně odevzdání stisknutím tlačítka Nedávné zprávy.

Pro změnu této vytvořené zprávy nastavte odpovídající vlastnosti projektu ve vaší pracovní kopii. Viz „Sloučení šablon zpráv záznamu“

V klientech a serverech Subversion před verzí 1.5, se žádné informace o slučování neukládaly a sloučené revize musely být sledovány ručně. Pokud jste testovali změny a chcete odevzdat tuto revizi, Vaše zpráva záznamu odevzdání by měla vždy obsahovat čísla revizí, které byly ve sloučení přeneseny. Pokud chcete později použít jiné sloučení budete potřebovat vědět, co jste již sloučili, protože nechcete přenést změnu více než jednou. Více informací o tomto najdete na Nejlepší postupy pro slučování v knize Subversion.

Pokud Váš server a všichni klienti mají Subversion 1.5 nebo vyšší, bude funkce pro sledování sloučení, zaznamenávat sloučené revizí a vyhne se slučování revizí více než jednou. Tím se Váš život stane mnohem jednodušší, protože můžete vždycky jednoduše sloučit celou řadu revizí a víte, že pouze nové revize bude skutečně sloučeny.

Správa větve je důležitá. Pokud chcete, aby tato větev byla aktuální s kmenem, měli byste se ujistit, že slučujete často, aby se větev a kmen neodchýlili příliš daleko od sebe. Samozřejmě, měli byste se stále vyhnout opakovanému slučování změn, jak je vysvětleno výše.

Tip

Pokud jste právě sloučili větev funkcí zpět do kmene, kmen nyní obsahuje všechen nový kód funkce a větev je zbytečná. Nyní, jestli chcete, ji můžete smazat z úložiště.

Důležité

Subversion nesloučí soubor s adresářem a naopak - pouze adresáře do adresářů a soubory do souborů. Pokud kliknete na soubor a otevřete dialogové okno sloučení, pak musíte zadat cestu k souboru v tomto dialogovém okně. Pokud vyberete adresář a spustíte dialogové okno, pak musíte zadat URL adresáře pro sloučení.

Sledování Sloučení

Subversion 1.5 představilo prostředky pro sledování sloučení. Při sloučení změn z jednoho stromu do druhého, čísla sloučených revizí jsou uložena a tyto informace mohou být použity pro několik různých účelů.

  • Můžete se vyhnout nebezpečí sloučení stejné revize dvakrát (problém opakovaného sloučení). Jakmile je revize označena jako sloučená, budoucí sloučení, kde je tato revize v rozsahu bude přeskočena.

  • Při sloučení větve zpět do kmene Vám dialogové okno záznamů může ukázat odevzdaání do větve jako součást záznamu kmene, což dává lepší sledovatelnost změn.

  • Když zobrazíte dialogové okno záznamů v rámci dialogového okna sloučení, jsou již sloučené revize zobrazeny v šedé barvě.

  • Při zobrazování informací o obvinění v souboru, můžete zvolit zobrazení původního autora sloučených revizí, raději než osobu, která sloučení provedla.

  • Můžete označit revize, které se nemají slučovat jejích začleněním do seznamu sloučených revizí, aniž by se sloučení skutečně provedlo.

Informace o sledování sloučení jsou uloženy ve vlastnosti svn:mergeinfo klientem, při provádění sloučení. Když je sloučení odevzdání, server uloží informace v databázi a když budete požadovat sloučení, záznam nebo informace o obvinění, server může reagovat odpovídajícím způsobem. Aby systém správně fungoval musíte zajistit, že server, úložiště a všechny klienty jsou aktualizovány. Starší klienty nebudou ukládat vlastnost svn:mergeinfo a starší servery nebudou poskytovat informace novým klientům.

Zjistěte více o sledování sloučení ze Subversion Dokumentace o sledování sloučení.

Handling Conflicts after Merge

Důležité

The text in the conflict resolver dialogs are provided by the SVN library and might therefore not (yet) be translated as the TortoiseSVN dialogs are. Sorry for that.

Merging does not always go smoothly. Sometimes there is a conflict. TortoiseSVN helps you through this process by showing the merge conflict dialog.

Obrázek 4.58. The Merge Conflict Dialog

The Merge Conflict Dialog


It is likely that some of the changes will have merged smoothly, while other local changes conflict with changes already committed to the repository. All changes which can be merged are merged. The Merge Conflict dialog gives you different ways of handling the lines which are in conflict.

For normal conflicts that happen due to changes in the file content or its properties, the dialog shows buttons which allow you to chose which of the conflicting parts to keep or reject.

Postpone

Don't deal with the conflict now. Let the merge continue and resolve the conflicts after the merge is done.

Accept base

This leaves the file as it was, without neither the changes coming from the merge nor the changes you've made in your working copy.

Accept incoming

This discards all your local changes and uses the file as it arrives from the merge source.

Reject incoming

This discards all the changes from the merge source and leaves the file with your local edits.

Accept incoming for conflicts

This discards your local changes where they conflict with the changes from the merge source. But it leaves all your local changes which don't conflict.

Reject conflicts

This discards changes from the merge source which conflict with your local changes. But it keeps all changes that don't conflict with your local changes.

Mark as resolved

Marks the conflicts as resolved. This button is disabled until you use the button Edit to edit the conflict manually and save those changes back to the file. Once the changes are saved, the button becomes enabled.

Upravit

Starts the merge editor so you can resolve the conflicts manually. Don't forget to save the file so the button Mark as resolved becomes enabled.

If there's a tree conflict, please first see „Konflikty Stromu“ about the various types of tree conflicts and how and why they can happen.

To resolve tree conflicts after a merge, a dialog is shown with various options on how to resolve the conflict:

Obrázek 4.59. The Merge Tree Conflict Dialog

The Merge Tree Conflict Dialog


Since there are various possible tree conflict situations, the dialog will show buttons to resolve those depending on the specific conflict. The button texts and labels explain what the option to resolve the conflict does. If you're not sure, either cancel the dialog or use the Postpone button to resolve the conflict later.

Údržba Větve Funkcí

Při vývoji nové funkce na samostatnou větev je dobrý nápad vymyslet zásadu pro znovuzačlenění, když je funkce hotova. Pokud probíhá i jiná práce v kmeni ve stejnou dobu můžete zjistit, že rozdíly se v průběhu času stanou významnými a zpětné sloučení se stává noční můrou.

Pokud je tato funkce relativně jednoduchá a vývoj nebude trvat dlouho, pak můžete přijmout jednoduchý přístup, což je držet větev úplně oddělenou, dokud není funkce hotova, pak sloučit změny ve větvi zpět do kufru. V průvodci sloučením by toto bylo jednoduché kliknutí na Sloučit rozsah revizí, kde rozsah revizí je rozsah revizí větve.

Pokud tato funkce bude trvat déle a je třeba zohlednit změny v kmeni, pak je třeba, aby větev byla synchronizována. To prostě znamená, že pravidelně slučujete změny kmene do větve, tak, aby větev obsahovala všechny změny kmene plus novou funkci. Proces synchronizace využívá Sloučit rozsah revizí. Když je funkce dokončena pak ji můžete sloučit zpět do kmene buď pomocí Znovu začlenit větev nebo Sloučit dva různé stromy.

Další (rychlou) cestou, jak sloučit všechny změny z kmene do větve funkcí, je použití TortoiseSVNSloučit vše... z rozšířeného kontextového menu (podržte klávesu Shift, při kliknutí pravým tlačítkem na soubor).

Obrázek 4.60. Dialogové okno Sloučit vše...

Dialogové okno Sloučit vše...


Toto dialogové okno je velmi jednoduché. Jediné, co musíte udělat, je nastavit volby pro sloučení, jak je popsáno v „Nastavení Sloučení“. O zbytek se postará TortoiseSVN automaticky pomocí sledování sloučení.