Samenvoegen

Nadat takken zijn gebruikt om meerdere ontwikkelrichtingen uit te gaan kan het op gegeven moment nodig zijn om de parallel ontwikkelde wijzigingen uit een tak weer terug samen te voegen in de basislijn of omgekeerd.

It is important to understand how branching and merging works in Subversion before you start using it, as it can become quite complex. It is highly recommended that you read the chapter Branching and Merging in the Subversion book, which gives a full description and many examples of how it is used.

Een volgend belangrijk punt is dat samenvoegen altijd vanuit een werkkopie begint. Indien wijzigingen uit een tak naar een andere tak samengevoegd moeten worden, moet deze laatste op uw computer zijn afgehaald en moet van hier uit het samenvoegen worden geïnitieerd met het menu TortoiseSVNSamenvoegen....

Er wordt over het algemeen aangeraden om samen te voegen naar een werkkopie waar alle wijzigingen zijn vastgelegd. Indien het samenvoegen niet naar verwachting zou gebeuren zullen alle niet vastgelegde wijzigingen anders mee ongedaan worden gemaakt bij gebruik van het Ongedaan Maken commando, en dus ook de wijzigingen van voor het samenvoegen.

Er zijn drie situaties waar samenvoegen telkens op een verschillende manier werkt, zoals hieronder beschreven. De eerste vraag die wordt gesteld bij het Samenvoegen is welke methode gewenst is.

Een revisiebereik samenvoegen

Deze methode wordt gebruikt als u één of meer wijzigingen in een tak (of de basislijn) heeft aangebracht en deze ook wilt toepassen op een andere tak.

What you are asking Subversion to do is this: Calculate the changes necessary to get [FROM] revision 1 of branch A [TO] revision 7 of branch A, and apply those changes to my working copy (of trunk or branch B).

If you leave the revision range empty, Subversion uses the merge-tracking features to calculate the correct revision range to use. This is known as a reintegrate or automatic merge.

Twee verschillende takken samenvoegen

This is a more general case of the reintegrate method. What you are asking Subversion to do is: Calculate the changes necessary to get [FROM] the head revision of the trunk [TO] the head revision of the branch, and apply those changes to my working copy (of the trunk). The net result is that trunk now looks exactly like the branch.

If your server/repository does not support merge-tracking then this is the only way to merge a branch back to trunk. Another use case occurs when you are using vendor branches and you need to merge the changes following a new vendor drop into your trunk code. For more information read the chapter on vendor branches in the Subversion Book.

Een Revisie-Bereik Samenvoegen

Afbeelding 4.55. Het Samenvoeg Hulpprogramma - Selecteer Revisie Bereik

Het Samenvoeg Hulpprogramma - Selecteer Revisie Bereik


Geef in het Van: veld de complete folder URL van de tak of label, welke de wijzigingen bevat die u naar uw werkkopie wilt doorvoeren. U kunt ook klikken op ... om door het archief te bladeren naar de gewenste tak. Als u eerder van deze tak heeft samengevoegd, kunt u de uitklaplijst gebruiken welke een geschiedenis van eerder gebruikte URL's toont.

If you are merging from a renamed or deleted branch then you will have to go back to a revision where that branch still existed. In this case you will also need to specify that revision as a peg revision in the range of revisions being merged (see below), otherwise the merge will fail when it can't find that path at HEAD.

Geef in het Revisiebereik om samen te voegen veld de lijst aan van revisies welke u wilt samenvoegen. Dit kan een enkele revisie zijn, een lijst van specifieke revisies gescheiden door komma's, een bereik van revisies gescheiden door een min-teken, of een combinatie van deze manieren.

If you need to specify a peg revision for the merge, add the peg revision at the end of the revisions, e.g. 5-7,[email protected]. In the above example, the revisions 5,6,7 and 10 would be merged, with 3 being the peg revision.

Belangrijk

Er is een belangrijk verschil in de manier waarop een revisiebereik wordt gespecificeerd in TortoiseSVN of in de commandoregel client. De gemakkelijkste manier om dit te visualiseren is om een omheining voor ogen te nemen compleet met toegangspoorten en hekwerk.

Met de commandoregel client geeft u de vast te legen wijzigingen aan door gebruik te maken van twee toegangspoort revisies welke de voor en na punten aangeven.

Met TortoiseSVN geeft u de vast te leggen wijzigingsset aan door gebruik te maken van hekwerken. De reden hiervoor wordt duidelijk wanneer u het log-dialoog gebruikt om revisies aan te geven om samen te voegen, waarbij elke revisie zichtbaar is als een wijzigingsset.

If you are merging revisions in chunks, the method shown in the Subversion book will have you merge 100-200 this time and 200-300 next time. With TortoiseSVN you would merge 100-200 this time and 201-300 next time.

Dit verschil heeft een hoop tam-tam in de mailing lijsten opgeleverd. We geven toe dat er een verschil is met de commandoregel client, maar we geloven dat het voor de meerderheid van de GUI-gebruikers de methode welke wij hebben toegepast gemakkelijker is om te begrijpen.

De makkelijkste methode om een reeks van revisies te selecteren die je nodig hebt, is door op de Toon logboek te klikken. Hiermee wordt een lijst met recente wijzigingen en de bijbehorende logboek boodschappen getoond. Als je de wijzigingen van een enkele revisie wilt samenvoegen, selecteer dan die ene revisie. Als je de wijzigingen van meerdere revisies wilt samenvoegen, selecteer dan de reeks terwijl je de Shift knop gebruikt. Klik op de OK knop en lijst met revisienummers die samengevoegd worden, wordt voor je gevuld.

Als je wijzigingen van een samenvoeging weer uit je werkkopie wilt halen, om een wijziging die al vastgelegd is weer ongedaan te maken, select dan de revisies die ongedaan gemaakt moeten worden en zorg er dan voor dat de optie Omgekeerd samenvoegen aangevinkt is.

Als je al enkele wijzigingen van deze tak hebt samengevoegd, hopelijk heb toen je in het logboek bericht opgenomen wat de laatste samengevoegde revisie was toen je de wijzigingen vastlegde. Je kunt dan Toon logboek gebruiken voor de werkkopie, om zo de logboek berichten te kunnen bekijken. Hou in gedachten dat we revisies als een set van wijzigingen zien, waardoor je als startpunt voor de nieuwe samenvoeging de eerste revisie na de vorige samenvoeging moet selecteren. Als je bijvoorbeeld de vorige keer revisie 37 naar revisie 39 hebt samengevoegd, dan moet je de nieuwe samenvoeging beginnen op revisie 40.

Als de samenvoeg volg functies van Subversion gebruikt, dan hoef je niet te onthouden welke revisies je al samengevoegd hebt - Subversion onthoudt dat voor je. Als je de revisie reeks leeg laat, worden alle revisies die nog niet samengevoegd zijn meegenomen. Lees de paragraaf met de naam “Samenvoegen traceren” voor meer informatie.

When merge tracking is used, the log dialog will show previously merged revisions, and revisions pre-dating the common ancestor point, i.e. before the branch was copied, as greyed out. The Hide non-mergeable revisions checkbox allows you to filter out these revisions completely so you see only the revisions which can be merged.

Als er andere personen mogelijk wijzigingen aan het vastleggen zijn, wees dan voorzichtig met het gebruik van de HEAD revisie. Het kan zijn dat deze niet wijst naar de revisie die je verwacht, bijvoorbeeld als er iemand wijzigingen heeft vastgelegd nadat jij de laatste keer ververst hebt.

If you leave the range of revisions empty or have the radio button all revisions checked, then Subversion merges all not-yet merged revisions. This is known as a reintegrate or automatic merge.

Er zijn enkele voorwaarden voor een reïntegratie samenvoeging. Ten eerste moet de server samenvoeg tracking ondersteunen. De werkkopie moet een onbegrensde diepte hebben (dus geen gedeeltelijk opgehaalde versie), er mogen geen lokale wijzigingen zijn gemaakt, objecten gewisseld zijn of objecten van een andere revisie dan de HEAD revisie. Alle wijzigingen die aan de basislijn zijn doorgevoerde gedurende de ontwikkeling van de tak, moeten in de tak samengevoegd zijn (of gemarkeerd als samengevoegd zijn). De reeks van de samen te voegen revisies wordt automatisch berekend.

Click Next and go to de paragraaf met de naam “Samenvoegopties”.

Twee Verschillende Takken Samenvoegen

Afbeelding 4.56. Het Samenvoeg Hulpprogramma - Samenvoegen van Boomstructuren

Het Samenvoeg Hulpprogramma - Samenvoegen van Boomstructuren


Als je deze methode gebruikt om een functie tak samen te voegen naar de basislijn, dan moet je het samenvoeg hulpprogramma starten vanuit de werkkopie van de basislijn.

Voer in het Van: veld de volledige URL van de map van de basislijn. Dit lijkt verkeerd te zijn, maar onthoudt dat de basislijn het startpunt is waar je de wijzigingen van de tak aan toe wilt voegen. Je kunt ook op de ... klikken om het archief te verkennen.

Voer in het Naar: veld de volledige URL van de map van de nieuwe functie tak.

Vul in zowel het Van Revisie veld als in het Naar Revisie veld het laatste revisie nummer in, waarop de beide boomstructuren gesynchroniseerd zijn. Als je er zeker van bent dat niemand anders wijzigingen vastlegt, dan kun je voor beide de HEAD revisie gebruiken. Als er een kans is dat iemand anders wijzigingen na de laatste synchronisatie heeft vastgelegd, gebruik dan de exacte revisie nummers om verlies van recente wijzigingen te voorkomen.

Je kunt ook met Toon logboek de revisie selecteren.

Samenvoegopties

Dit scherm van het hulpprogramma geeft je de mogelijkheid om geavanceerde opties in te stellen, voordat het samenvoegproces start. In de meeste gevallen kun je de standaard instellingen gebruiken.

Je kunt de diepte instellen die gebruikt moet worden voor het samenvoegen, dat houdt in hoe diep in je werkkopie de samenvoegactie doorgevoerd moet worden. De definitie van de diepte wordt beschreven in de paragraaf met de naam “Ophaaldiepte”. De standaard diepte staat ingesteld op Werkkopie, waardoor de bestaande diepte instelling gebruikt wordt. Dit is eigenlijk altijd de diepte die je wilt gebruiken.

Most of the time you want merge to take account of the file's history, so that changes relative to a common ancestor are merged. Sometimes you may need to merge files which are perhaps related, but not in your repository. For example you may have imported versions 1 and 2 of a third party library into two separate directories. Although they are logically related, Subversion has no knowledge of this because it only sees the tarballs you imported. If you attempt to merge the difference between these two trees you would see a complete removal followed by a complete add. To make Subversion use only path-based differences rather than history-based differences, check the Ignore ancestry box. Read more about this topic in the Subversion book, Noticing or Ignoring Ancestry.

Je kunt ook opgeven hoe regeleinden, spaties en witregels behandeld moeten worden. Deze opties worden beschreven in de paragraaf met de naam “Opties voor regeleinden, spaties en witregels ”. Standaard worden alle regeleinden, spaties en witregels als echte wijzigingen behandeld en samengevoegd.

Het selectievak Forceer het samenvoegen wordt gebruikt om mapstructuur conflicten te voorkomen, daar waar een binnenkomende verwijdering een bestand raakt die of lokaal gewijzigd is of niet onder versiebeheer valt. Als het bestand verwijderd is, dan is er geen enkele manier om deze te herstellen. Daarom is deze optie standaard niet ingeschakeld.

Als je gebruik maakt van het traceren van samenvoegingen en je wilt een revisie markeren als zijnde samengevoegd, zonder dat de feitelijke samenvoeging hier heeft plaatsgevonden, selecteer dan de Samenvoegen alleen vastleggen optie. Er zijn twee mogelijke redenen waarom je deze optie zou willen gebruiken. Het kan zijn dat het samenvoegen te gecompliceerd is voor de gebruikte algoritmes. Je codeert de wijzigingen dan handmatig, vervolgens markeer je de wijzigingen als samengevoegd, zodat het samenvoeg traceer algoritme dit ook ziet. De andere mogelijke reden is dat je wilt voorkomen dat een bepaalde revisie samengevoegd wordt. Door deze te markeren als reeds samengevoegd voorkom je dat de samenvoeging plaatsvindt, zolang de samenvoeg programma's rekening kunnen houden met de samenvoeg traceer informatie.

Alles is nu ingesteld en je hoeft alleen nog maar op de Samenvoegen knop te drukken. Als je vooraf het resultaat wilt beoordelen, kun je met Test Samenvoegen de samenvoeging simuleren. Hiermee wijzig je niets in je werkkopie. Het toont een lijst met bestanden die gewijzigd zullen worden bij de echte samenvoeg actie en geeft de bestanden aan waarmee conflicten op zouden kunnen treden. Omdat het traceren van de samenvoegingen het proces veel gecompliceerder maakt, is er geen manier om van te voren zeker te weten of er een conflict zal optreden of niet. Oftewel bestanden die als conflicterend worden aangemerkt bij een samenvoeg test hoeven in de praktijk helemaal geen probleem op te leveren.

The merge progress dialog shows each stage of the merge, with the revision ranges involved. This may indicate one more revision than you were expecting. For example if you asked to merge revision 123 the progress dialog will report Merging revisions 122 through 123 . To understand this you need to remember that Merge is closely related to Diff. The merge process works by generating a list of differences between two points in the repository, and applying those differences to your working copy. The progress dialog is simply showing the start and end points for the diff.

De Resultaten van het Samenvoegen Bekijken

Het samenvoegen is nu klaar. Het is verstandig om het resultaat te bekijken om na te gaan of het is zoals verwacht. Samenvoegen is vaak erg gecompliceerd. Conflicten komen vaak voor als een tak ver van de basislijn is afgeweken.

Tip

Whenever revisions are merged into a working copy, TortoiseSVN generates a log message from all the merged revisions. Those are then available from the Recent Messages button in the commit dialog.

To customize that generated message, set the corresponding project properties on your working copy. See de paragraaf met de naam “Merge log message templates”

Bij Subversion clients en servers van voor version 1.5, is er geen samenvoeg informatie opgeslagen en samengevoegde revisies moeten handmatig achterhaald worden. Als je de wijzigingen getest hebt en klaar bent om deze revisie vast te leggen, zou je logboek boodschap altijd de revisienummers van de geporteerde revisies moeten bevatten. Als je op een later moment nog een samenvoeging wilt uitvoeren, dan moet je weten wat er al samengevoegd is, omdat je wijzigingen niet vaker dan één maal wilt doorvoeren. Lees voor meer informatie Best Practices for Merging in het Subversion boek.

Als je server en alle clients Subversion versie 1.5 of hoger gebruiken, zullen de samenvoeg acties getraceerd worden, zodat voorkomen wordt dat wijzigingen meer dan eens worden toegepast. Dit maakt het leven een stuk makkelijker, omdat je dan elke keer de hele revisie reeks kunt samenvoegen en dat dan alleen de nieuwe revisies samengevoegd zullen worden.

Het managen van takken is belangrijk. Als je deze tak dicht bij de basislijn wilt houden, zul je vaak moeten samenvoegen, zodat de tak en de basislijn niet te ver uit elkaar drijven. Natuurlijk moet je het herhaaldelijk samenvoegen van wijzigingen voorkomen, zoals eerder beschreven.

Tip

Als je net een functie tak hebt samengevoegd naar de basislijn, dan heeft de basislijn nu alle nieuwe functionaliteit en is de tak verouderd. Je kunt de tak nu verwijderen uit het archief indien nodig.

Belangrijk

Subversion kan niet bestanden met mappen samenvoegen en vice versa - alleen mappen naar mappen en bestanden naar bestanden. Als je op een bestand klikt en het samenvoeg scherm opent, dan moet je het pad naar een bestand opgeven. Als je een map selecteert en samenvoeg scherm opent, dan moet je een URL van een map opgeven om samen te voegen.

Samenvoegen traceren

In Subversion 1.5 is functionaliteit geïntroduceerd voor het traceren van samenvoegingen. Als je wijzigingen vanuit de ene boomstructuur naar de andere samenvoegt, worden de samengevoegde revisienummers opgeslagen. Deze informatie kan dan voor verschillende doeleinden gebruikt worden.

  • Het is mogelijk om het gevaar van het twee keer samenvoegen van een revisie te voorkomen. Als eenmaal een revisie gemarkeerd is als samengevoegd, zal er bij toekomstige samenvoegen waarbij deze revisie in de reeks is opgenomen, deze revisie overgeslagen worden.

  • Als je een tak terug naar de basislijn samenvoegt, dan kan het logboek scherm de vastleggingen aan de tak deel laten uitmaken van het logboek van de basislijn. Hierdoor is het makkelijker om wijzigingen te traceren.

  • Als je het logboek vanuit het samenvoeg scherm opvraagt, worden de revisies die al samengevoegd zijn grijs weergegeven.

  • Als je de verklaren informatie bekijkt voor een bestand, dan kun je er voor kiezen de originele auteur te tonen van samengevoegde revisie, in plaats van de persoon die de samenvoeging uitvoerde.

  • Je kunt revisies markeren met niet samenvoegen door deze al in de lijst van samengevoegde revisies op te nemen, zonder de echte samenvoeging uit te voeren.

De samenvoeg informatie is opgeslagen in de svn:mergeinfo eigenschap door de client als deze een samenvoeging uitvoert. Als de samenvoeging vastgelegd wordt, dan slaat de server de gegevens op in de database. Als je samenvoeg, logboek of verklaren informatie opvraagt, dan kan de server deze informatie doorgeven. Om dit goed te laten werken moet je er voor zorgen dat de server, het archief en alle clients naar de nieuwe versie bijgewerkt worden. Oudere clients zullen de svn:mergeinfo eigenschappen niet opslaan en oudere servers zullen de door de clients opgevraagde informatie niet opgeven.

Find out more about merge tracking from Subversion's Merge tracking documentation.

Handling Conflicts after Merge

Belangrijk

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.

Afbeelding 4.57. 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.

Wijzigen

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 de paragraaf met de naam “Mapstructuur conflicten” 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:

Afbeelding 4.58. 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.

Onderhoud aan een Tak met Nieuwe Functies

Als je een nieuwe functie ontwikkelt in een aparte tak, dan is het verstandig om een beleid af te spreken voor het reïntegreren als de functie klaar is. Als er op het zelfde moment gewoon doorgewerkt wordt aan de basislijn, dan kun je er tegenaan lopen dat wijzigingen steeds meer gevolgen hebben, waardoor het samenvoegen echt een nachtmerrie kan worden.

Als de nieuwe functie relatief eenvoudig is en de ontwikkeling niet lang duurt, dan kun je een vrij eenvoudige aanpak gebruiken. Hou de tak helemaal gescheiden totdat de functie klaar is en voeg de wijzigingen in de tak dan samen naar de basislijn. In het samenvoeg hulpprogramma zou die een eenvoudige Voeg een reeks revisies samen actie zijn met de reeks van revisies van de tak.

Als de ontwikkeling langer duurt en je rekening moet gaan houden met wijzigingen in de basislijn, dan moet je je tak synchroon houden met de basislijn. Dit houdt gewoon in dat je regelmatig de wijzigingen in de basislijn moet samenvoegen naar je tak, zodat de tak de wijzigingen van de basislijn plus de nieuwe functie heeft. Het synchronisatie proces gebruikt de Voeg een reeks revisies samen functie. Als de functie klaar is, kun je deze samenvoegen naar de basislijn met Reïntegreer een tak of met Twee verschillende bomen samenvoegen.

Another (fast) way to merge all changes from trunk to the feature branch is to use the TortoiseSVNMerge all... from the extended context menu (hold down the Shift key while you right click on the file).

Afbeelding 4.59. The Merge-All Dialog

The Merge-All Dialog


This dialog is very easy. All you have to do is set the options for the merge, as described in de paragraaf met de naam “Samenvoegopties”. The rest is done by TortoiseSVN automatically using merge tracking.