Samenvoegen en het editorvenster voor samenvoegingsuitvoer

Het editorvenster voor de samenvoegingsuitvoer (onder de verschil-invoervensters) heeft ook een inforegel bovenaan met Uitvoer:, de bestandsnaam en [Gewijzigd] als u iets bewerkt hebt. Meestal bevat dit wat tekst door de automatische samenvoegingsfunctie, maar vaak bevat het ook conflicten.

!!! Opslaan is uitgeschakeld totdat alle conflicten opgelost zijn !!! (Gebruik de knoppen Ga naar vorig/volgend onopgelost conflict om de overgebleven conflicten te vinden.)

Met maar twee invoerbestanden is elk verschil ook een conflict dat handmatig opgelost moet worden.

Met drie invoerbestanden wordt het eerste bestand als basis gebruikt, en het tweede en derde bestand bevatten wijzigingen. Als op een bepaalde regel alleen invoer B of C gewijzigd is, maar niet beide, wordt de veranderde bron gekozen. Alleen als B en C op dezelfde regel veranderd zijn, detecteert het hulpmiddel een conflict dat handmatig opgelost moet worden. Als B en C hetzelfde zijn, maar niet hetzelfde als A, wordt C gekozen.

De kolom Samenvatting

Het editorvenster voor samenvoegingsuitvoer heeft ook links een samenvattingskolom. Deze toont de letter van de invoer waaruit een regel geselecteerd is of niets als alle drie de bronnen gelijk waren op die regel. Bij conflicten wordt een vraagteken "?" getoond en de regel toont dan "<Samenvoegconflict>", het geheel in rood. Omdat conflicten regel voor regel oplossen erg lang duurt, worden de regels gegroepeerd in groepen die dezelfde verschil- en conflictkenmerken hebben, Alleen witruimte-conflicten worden gescheiden van niet-witruimte-conflicten om het samenvoegen van bestanden waarin de insprong gewijzigd is, gemakkelijker te maken.

De huidige groep instellen en zichtposities van samenvoegen en verschillen synchroniseren

Als u met de linkermuisknop in een samenvattingskolom klikt, wordt de groep die bij die regel hoort geselecteerd in alle vensters en wordt het begin van de groep getoond. Deze groep wordt dan de "huidige groep". Deze wordt geaccentueerd met het optie Achtergrondkleur van diff voor huidig bereik van item Integratie in de instellingendialoog en er verschijnt een zwarte balk links van de tekst.

Kies invoer A, B of C voor het huidige conflict en bewerking

De knoppenbalk onder de menubalk heeft drie selectieknoppen voor invoer met de letters A, B en C. Klik op de keuzeknop voor invoer om de regels uit de desbetreffende bron te plakken (of na het plakken weer te verwijderen). Voor gebruik van regels uit verschillende bronnen klikt u op de knoppen in de gewenste volgorde. Als u bijvoorbeeld wilt dat de regels van B boven de regels van A in de uitvoer verschijnen, klik dan eerst op B en daarna op A.

Als u de knop Automatisch na bronselectie naar volgende onopgeloste conflict gaan gebruikt (zie sectie (Automatisch doorgaan), is het verstandig om dit uit te schakelen voordat u uit diverse bronnen regels selecteert en deze daarna wilt gaan bewerken. Als u dit nalaat zal KDiff3 naar het volgende conflict springen na het selecteren van de eerste invoer.

Het is vaak handig om de samenvoegingsuitvoer te kunnen bewerken. In de samenvattingskolom is een "m" te zien voor iedere regel die handmatig is bewerkt. Wanneer bijvoorbeeld de verschillen zodanig zijn uitgelijnd dat eenvoudig de invoer kiezen niet het gewenste resultaat oplevert, dan kunt u de gewenste tekst markeren en de normale manier van kopiëren en plakken gebruiken voor het samenvoegen.

Soms verschijnt de tekst "<Geen regel in de bron>" in een regel als die ofwel door automatisch samenvoegen ofwel door bewerken verwijderd is, en er geen andere regels in die groep overblijven. Dit is een plaatshouder voor de groep voor als u zich bedenkt en weer een bron aangeeft. De tekst verschijnt niet in het opgeslagen bestand of in gekopieerde of geplakte selecties.

De tekst "<Samenvoegconflict>" verschijnt in het klembord als u tekst met zo'n regel kopieert en plakt. Maar wees alsnog voorzichtig.

Kiezen van invoer A, B, of C voor alle conflicten

Het normale samenvoegen begint door het automatisch oplossen van eenvoudige conflicten. Maar het menu Samenvoegen biedt wat acties voor andere veelvoorkomende zaken. Als u dezelfde bron voor de meeste conflicten wilt gebruiken, kunt u A, B of C overal kiezen, of alleen voor de overgebleven niet-opgeloste conflicten, of voor de niet-opgeloste witruimteconflicten. Als u elk apart onderscheid zelf wilt bepalen, kunt u Elk onderscheid maken bij conflicten instellen. Of als u terug wilt gaan naar de automatische keuzes van KDiff3 kiest u Eenvoudige conflicten automatisch oplossen. KDiff3 herstart het samenvoegen dan. Voor acties die uw vorige wijzigingen aanpassen vraagt KDiff3 om uw instemming alvorens door te gaan.

Opmerking

Als u één van de bronnen voor onopgeloste witruimte-conflicten kiest en de optie Getallen negeren (als witruimte behandelen) of C/C++ commentaar negeren (als witruimte behandelen) bij het item Diff is gekozen in de instellingendialoog, dan worden wijzigingen in getallen respectievelijk commentaar ook als witruimte behandeld.

Automatisch samenvoegen van trefwoorden en geschiedenis (Log) uit versiebeheer

Veel systemen voor versiecontrole gebruiken speciale trefwoorden in het bestand. (bijv. "$Date$", "$Header$", "$Author$", "$Log$", etc.). Deze regels worden aangepast tijdens het inchecken in het version control system (VCS). Bijvoorbeeld "$Date$" zal veranderen in "$Date: 2005/03/22 18:45:01 $". Omdat deze regel in iedere versie van het bestand verschillend is, is daarom het handmatig ingrijpen noodzakelijk tijdens het samenvoegen.

KDiff3 heeft de mogelijkheid om dit soort items automatisch in item Samenvoegen in de instellen. Bij eenvoudige regels die overeenkomen met de instellingen voor Reguliere expressie voor automatisch samenvoegen voor alle invoerbestanden, zal KDiff3 kiezen voor de regel uit B of - indien beschikbaar - uit C. (Het is bovendien noodzakelijk dat voor de vergelijking de regels uitgelijnd zijn en dat de voorgaande regels geen conflicten hebben). Dit automatisch samenvoegen kunt u naar keuze onmiddellijk na het starten van het samenvoegen uitvoeren (door het inschakelen van de optie Bij starten van samenvoegen automatisch reguliere expressie gebruiken) of later via menu-item SamenvoegenAutomatisch samenvoegen d.m.v. reguliere expressie uitvoeren.

Ook het automatisch samenvoegen van de geschiedenis van versiebeheer (ook "log" genoemd) is ondersteund. De geschiedenis samenvoegen kunt u naar keuze onmiddellijk na het starten van het samenvoegen uitvoeren door het inschakelen van de keuze Geschiedenis versiebeheer samenvoegen bij aanvang van samenvoegen in het item Samenvoegen in de instellingendialoog of later via het menu-item SamenvoegenAutomatisch geschiedenisconflicten oplossen

Meestal begint de geschiedenis van het versiebeheer met een regel waarin het trefwoord "$Log$" voor komt. Dit moet overeenkomen met de Reguliere expressie voor begin van geschiedenis. KDiff3 bepaalt welke opvolgende regels ook in de geschiedenis thuishoren door te kijken naar de voorafgaande tekens die voor het trefwoord "$Log$" staan. Als dezelfde "voorafgaand commentaar"-tekens ook in volgende regels verschijnen, dan worden deze regels ook in de geschiedenis opgenomen.

Tijdens elke check-in schrijft het VCS een unieke regel met daarin informatie over de versie, datum en tijdstip gevolgd door regels met commentaar van de gebruiker. Deze regels vormen samen een geschiedenisitem. Deze geschiedenis groeit met elke check-in met het meest recente item bovenaan (na de beginregel van de geschiedenis).

Wanneer bij parallelle ontwikkeling twee of meer ontwikkelaars een tak van een bestand inchecken dan verschijnen bij het samenvoegen van de geschiedenis verschillende items met conflicten. Omdat het samenvoegen van deze takken vervelend kan zijn, komt KDiff3 met twee mogelijke strategieën: Gewoon de geschiedenisitems van beide ontwikkelaars bovenaan invoegen of de geschiedenisitems sorteren via een door de gebruiker opgegeven trefwoord.

De gewoon-toevoegen-van-alle-items-methode is makkelijker om in te stellen. KDiff3 heeft alleen maar een methode nodig om vast te stellen welke regels bij een geschiedenis-item horen. De meeste VCS voegen een lege regel toe onder elke geschiedenis-item. Als er geen andere lege regels zijn dan is dit voldoende voor KDiff3. Maak eenvoudig een lege Reguliere expressie voor begin van een geschiedenis aan in item Samenvoegen in de instellingendialoog. Als het lege regel criterium niet voldoende is dan kunt u een normale expressie aanmaken voor het detecteren van het begin van het geschiedenis-item.

Merk op dat KDiff3 duplicaat geschiedenis-items zal verwijderen. Als een geschiedenis-item meerdere keren aanwezig is in de geschiedenis van een invoerbestand dan blijft deze maar één keer bewaart in het uitvoerbestand.

Als u de geschiedenis op volgorde wilt leggen dan moet u opgeven hoe de sorteersleutel is opgebouwd. Gebruik haakjes in de Reguliere expressie voor het begin van een geschiedenis in item Samenvoegen in de instellingendialoog voor het groeperen van gedeeltes van de reguliere expressie die u later wilt gebruiken voor de sorteersleutel. Geef vervolgens in de Sorteervolgorde van het begin van geschiedenis met door komma's "," gescheiden lijst op van nummers die de volgorde aangeven in de reguliere expressie.

Omdat het niet gemakkelijk is om dit in een keer goed te krijgen, kunt u de reguliere expressie uitproberen en daarna zo nodig verbeteren in een speciaal dialoogvenster door het gebruik van de knop Reguliere expressies testen.

Voorbeeld: neem een geschiedenis aan die lijkt op dit:

/**************************************************************************
** HISTORY:    $Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp $
**
**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
**  Samengevoegde branch simon_branch_15.
**
**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
**  Snelheid van subroutine convertToMesh() verbeterd.
**  crash opgelost.
**************************************************************************/

De beginregel van de geschiedenis komt overeen met de reguliere expressie ".*\$Log.*\$.*". Daarna volgen de geschiedenisitems.

De regel met het trefwoord "$Log$" begint met twee keer "*" waarna een spatie volgt. KDiff3 gebruikt de eerste regel met niet-witruimte als "voorafgaand commentaar" en concludeert dat de geschiedenis eindigt in de eerste regel zonder dit voorafgaand commentaar. In dit voorbeeld eindigt de laatste regel met een tekenreeks die ook start met twee keer "*", maar in plaats van een spatie volgt meer keer "*". Met deze regel eindigt daarom de geschiedenis.

Als sorteren niet vereist is dan kan de beginregel met de reguliere expressie van het geschiedenisitem er uitzien als dit. (Deze regel is opgesplitst in tweeën omdat het anders niet zou passen.)

\s*\\main\\\S+\s+[0-9]+ (jan|feb|maa|apr|mei|jun|jul|aug|sep|okt|nov|dec)
 [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*

Meer details over reguliere expressies kunt u lezen in de documentatie over reguliere expressies. Merk op dat "\s" (kleine letter "s") overeenkomt met witruimte en "\S" (Hoofdletter "S") overeenkomt met niet-witruimte. In ons voorbeeld bestaat de beginregel van ons geschiedenis-item als eerste informatie over de versie met de reguliere expressie "\\main\\\S+", de datum bestaande uit de dag "[0-9]+", maand "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)" en jaar "[0-9][0-9][0-9][0-9]", de tijd "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" en tenslotte de gebruikersnaam van de ontwikkelaar ".*".

Merk op dat de tekens van het "voorafgaand commentaar" (in het voorbeeld "**") al verwijderd zijn door KDiff3 voor de poging tot uitlijnen, daarom begint de reguliere expressie met een overeenkomst voor een of meer witruimte-tekens "\s*". Omdat commentaar-tekens kunnen verschillen in ieder bestand (bijv. C/C++ gebruikt andere commentaar-tekens dan een Perl script) let KDiff3 zelf op de tekens van voorafgaand commentaar en hoeven deze daarom niet opgegeven te worden in de reguliere expressie.

Als u een gesorteerde geschiedenis vereist. Dan moet de sorteersleutel berekend worden. Hiervoor moeten de relevante delen in de reguliere expressie gegroepeerd worden door haakjes. (De extra haakjes kunnen er ook in blijven als sorteren van de geschiedenis is uitgeschakeld).

\s*\\main\\(\S+)\s+([0-9]+) (jan|feb|maa|apr|mei|jun|jul|aug|sep|okt|nov|dec)
 ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)

Tussen de haken vindt u nu 1. versie-info, 2. dag, 3. maand, 4. jaar, 5. tijd, 6. naam. Maar als we op datum en tijd willen sorteren dan moeten we een sleutel creëren waarvan de onderdelen een andere volgorde hebben: eerst het jaar, gevolgd door de maand, dag, tijd, versienummer en naam. De sorteersleutel moet daarom zijn als volgt "4,3,2,5,1,6".

Omdat de namen van maanden niet handig zijn voor het op volgorde leggen ("Apr" zou dan de eerste zijn) detecteert KDiff3 in welke volgorde de namen van maanden zijn opgegeven en gebruikt in plaats daarvan dat nummer ("Apr"->"04"). En als een kaal nummer is gevonden dan zal dit worden omgezet naar een viercijferig getal met voorloopnullen voor het op volgorde leggen. Tenslotte zal de sorteersleutel voor de beginregel van de geschiedenis er als volgt uit zien:

2001 04 0002 10:45:41 integration_branch_12   tom

Lees voor meer informatie ook de sectie Instellingen samenvoegen.