Operazione di fusione e la finestra di modifica del risultato

Anche la finestra di modifica del risultato della fusione (sotto la finestra di ingresso) ha una riga informativa sovrastante che mostra il Risultato:, il nome del file e [Modificato] se qualcosa è stato variato. Normalmente essa contiene del testo creato dagli automatismi della fusione, ma spesso conterrà anche dei conflitti.

!!! Il salvataggio è disabilitato fino a quando tutti i conflitti non sono risolti !!! (Usa il pulsante Vai al precedente/prossimo conflitto non risolto per ricercare i conflitti rimanenti).

Se i file di ingresso sono solo due, ogni differenza è un conflitto che deve essere risolto manualmente.

Con tre file di ingresso il primo è considerato come base, mentre il secondo e il terzo contengono le modifiche. Quando in qualche riga solo il file B o il file C presenta una differenza, ma non entrambi, allora sarà automaticamente selezionato il file modificato. Solo quando B e C hanno delle differenze sulle stesse righe il programma si accorgerà del conflitto, che dovrà essere risolto manualmente. Quando B e C coincidono, ma differiscono con A, allora sarà selezionato C.

La colonna di sommario

La finestra di modifica del risultato di fusione ha anche una colonna di sommario sulla sinistra. Essa mostra la lettera dell'input da dove la riga è stata selezionata o nulla se tutte le tre sorgenti hanno la stessa riga. Per i conflitti essa mostra un punto interrogativo "?" e la riga mostra "<Conflitto nel fondere>", tutto in rosso. Dato che risolvere conflitti riga per riga richiede molto tempo, le righe sono raggruppate per gruppi con le stesse caratteristiche di differenza e conflitto. Saranno separati solo i conflitti di spazi bianchi dai conflitti di spazi non bianchi in modo da facilitare la fusione dei file in cui l'indentazione, su molte righe, cambia.

Impostare il gruppo attuale e sincronizzare la posizione delle viste di fusione e differenze

Quando si fa clic sulla colonna di sommario col tasto sinistro del mouse in una finestra, l'inizio del gruppo appartenente a quella riga sarà selezionato in tutte le finestre. Questo gruppo diverrà il «gruppo attuale». Esso è evidenziato con l'opzione Colore di fondo per questo intervallo attuale dell'elemento Integrazione nella finestra di dialogo delle impostazioni e una barra nera apparirà sul lato sinistro del testo.

Scegliere gli input A, B o C per il conflitto attuale e per modificarlo

La barra dei pulsanti sotto la barra dei menu contiene tre pulsanti di selezione degli input contenenti le lettere A, B e C. Fai clic nel pulsante di selezione input per inserire (o rimuovere se già inserite) le righe dalle rispettive sorgenti. Per scegliere le righe da più input fai clic nei rispettivi pulsanti nell'ordine necessario. Per esempio se vuoi che nell'output le righe della B appaiano prima delle righe della A, fai prima clic su B quindi su A.

Se usi il pulsante Vai automaticamente al prossimo conflitto non risolto dopo la selezione del sorgente (vedi la sezione Avanzamento automatico), dovresti disabilitarla prima di scegliere le righe da diversi input o se vuoi modificare le righe dopo aver scelto. Altrimenti KDiff3 salterà al prossimo conflitto dopo aver scelto il primo input.

È spesso molto utile modificare direttamente l'output della fusione. La colonna di sommario mostrerà "m" per ogni riga che viene modificata manualmente. Quando per esempio le differenze sono allineate in modo che scegliere semplicemente gli input non sia soddisfacente, allora puoi marcare il testo necessario e usare il normale copia e incolla per inserirlo nell'output di fusione.

Alcune volte, quando una riga viene rimossa dalla fusione automatica o da una modifica manuale e non rimangono altre righe nel gruppo, allora apparirà in questa riga il messaggio <Riga sorgente mancante>. Questa posizione verrà mantenuta dal gruppo nel caso tu cambiassi idea e volessi sezionare qualche altro sorgente. Questo testo non verrà reimmesso nel file salvato o in altre selezioni che desideri copiare ed incollare.

Il testo "<Fondi conflitti>" apparirà negli appunti se copi ed incolli del testo contenente questa riga. Fai comunque attenzione nell'eseguire tale operazione.

Scegliere l'input A, B o C per tutti i conflitti

La normale fusione inizierà risolvendo semplici conflitti automaticamente. Ma il menu Fondi permette altre azioni per altre necessità comuni. Se devi selezionare lo stesso sorgente per molti conflitti, potrai selezionare sempre A, B o C, o solamente per i conflitti non risolti restanti, o per i conflitti di spazi bianchi non risolti. Se vuoi decidere tu stesso ogni singola differenza, puoi Impostare le differenze come conflitti, o se vuoi ritornare all'opzione automatica di KDiff3 seleziona Risolvi automaticamente i conflitti semplici. KDiff3 riavvierà quindi la fusione. Per azioni che cambiano le tue precedenti modifiche KDiff3 ti chiederà conferma prima di procedere.

Nota

Quando si sceglie un sorgente per conflitti non risolti di spazi bianchi e quando vengono utilizzate le opzioni Ignora numeri (tratta come spazio) o Ignora commenti C/C++ (tratta come spazio) dell'elemento Differenze nella finestra di dialogo delle impostazioni, le variazioni nei numeri o nei commenti saranno trattati anch'essi come spazi.

Fusione automatica della cronologia (log) e delle parole chiave del controllo di versione

Molti sistemi di controllo di versione supportano parole chiave speciali nel file. (es. "$Date$", "$Header$", "$Author$", "$Log$", ecc.) Durante il controllo il sistema di controllo di versione (VCS) cambia queste righe. Per esempio "$Date$" cambierà in "$Date: 2005/03/22 18:45:01 $". Dato che questa riga sarà diversa in ogni versione del file, richiederà l'interazione manuale durante la fusione.

KDiff3 offre la fusione automatica per questi elementi nell'elemento Fondi nella finestra di dialogo delle impostazioni. Per righe semplici che corrispondono all'opzione Fondi automaticamente le espressioni regolari in tutti i file di input KDiff3 sceglierà la riga da B o - se disponibile - da C (è inoltre necessario che le righe in questione corrispondano nel confronto e la riga precedente non contenga alcun conflitto). Questa fusione automatica può essere avviata sia immediatamente dopo l'avvio della fusione (attiva l'opzione Avvia la fusione automatica delle espressioni regolari all'avvio di fusione) o in un secondo momento attraverso l'elemento di menu FondiAvvia la fusione automatica delle espressioni regolari.

È supportata anche la fusione automatica per la cronologia del controllo di versione (nota anche come «registro»). La fusione automatica della cronologia può essere eseguita immediatamente all'avvio della fusione attivando l'opzione Fondi la cronologia del controllo di versione all'inizio della fusione dell'elemento Fondi nella finestra di dialogo delle impostazioni, o successivamente tramite l'elemento di menu FondiRisolvi automaticamente i conflitti di cronologia.

Normalmente la cronologia del controllo di versione comincia con una riga contenente la parola chiave "$Log$". Questa deve essere corrisposta dall'opzione Espressione regolare dell'inizio di cronologia. KDiff3 rileva quali righe successiva sono nella cronologia analizzando i caratteri iniziali che precedono la parola chiave "$Log$". Se gli stessi caratteri di «commento iniziale» appaiono anche nelle righe seguenti, anche queste verranno incluse nella cronologia.

Durante il deposito, il VCS scrive una riga univoca che specifica informazioni di versione, data e ora, seguite da righe con commenti dell'utente. Queste righe costituiscono un elemento della cronologia. Questa sezione di cronologia cresce a ogni deposito, e le voci più recenti sono in cima (dopo la riga di inizio della cronologia).

Quando, in sviluppo parallelo, due o più sviluppatori depositano un ramo del file, la cronologia di fusione conterrà diversi elementi che risultano come conflitti durante la fusione dei rami. Siccome fonderli può essere molto noioso, KDiff3 offre aiuto con due possibili strategie: basta che inserisci le informazioni sulla cronologia da entrambi gli sviluppatori in cima o ordini le informazioni della cronologia secondo una chiave definita dall'utente.

Il metodo «inserisci tutti gli elementi e basta» è più facile da configurare. KDiff3 ha bisogno solo di un metodo per rilevare quali righe appartengano a un elemento di cronologia. La maggior parte dei VCS inserisce una riga vuota dopo ogni elemento di cronologia. Se non ci sono altre righe vuote, questo è un criterio sufficiente per KDiff3. Basta che imposti una Espressione regolare di inizio dell'elemento di cronologia vuota nell'elemento Fondi nella finestra di dialogo delle impostazioni. Se il criterio della riga vuota non è sufficiente, puoi specificare un'espressione regolare per rilevare l'inizio degli elementi di cronologia.

Nota che KDiff3 rimuoverà gli elementi di cronologia duplicati. Se un elemento di cronologia compare diverse volte nella cronologia di un file di ingresso, ne rimarrà solo uno nell'uscita.

Se vuoi ordinare la cronologia, devi specificare come costruire la chiave di ordinamento. Usa le parentesi nella Espressione regolare di inizio dell'elemento di cronologia nell'elemento Fondi nella finestra di dialogo delle impostazioni per raggruppare parti dell'espressione regolare che dovrebbero essere usate in seguito per la chiave di ordinamento. Specifica quindi l'opzione Ordine della chiave d'ordinamento d'inizio degli elementi della cronologia, specificando un elenco, separato da «virgole», di numeri che si riferiscono alla posizione del gruppo nell'espressione regolare.

Siccome questo non è così facile da azzeccare al primo colpo, devi poter provare e migliorare le espressioni regolari e la generazione delle chiavi in una finestra apposita premendo il pulsante Prova le espressioni regolari.

Esempio. Prendi in considerazione una cronologia che assomiglia a questa:

/**************************************************************************
** HISTORY:    $Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp $
**
**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
**  Fuso il ramo simon_branch_15.
**
**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
**  Migliorata la velocità della funzione convertToMesh().
**  Crash corretto.
**************************************************************************/

La riga di inizio della cronologia corrisponde all'espressione regolare ".*\$Log.*\$.*". Seguono quindi le voci della cronologia.

La riga con la parola chiave "$Log$" comincia con due «*» dopo i quali segue uno spazio. KDiff3 usa la prima stringa non di spazi come «commento iniziale» e assume che la cronologia si concluda nella prima riga senza questo commento iniziale. In questo esempio l'ultima riga finisce con una stringa che comincia anch'essa con due «*», ma invece di un carattere di spaziatura seguono degli altri «*». Perciò questa riga conclude la cronologia.

Se l'ordinamento della cronologia non è necessario, l'espressione regolare dell'inizio degli elementi di cronologia potrebbe avere questo aspetto (questa riga è divisa in due parti per ragioni di spazio):

\s*\\main\\\S+\s+[0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*

Per dettagli sulle espressioni regolari, vedi la documentazione sulle espressioni regolari. Nota che "\s" (con la minuscola) corrisponde ai caratteri di spaziatura e "\S" (con la maiuscola) corrisponde a qualsiasi carattere non di spaziatura. Nell'esempio l'inizio degli elementi di cronologia contiene prima le informazioni di versione, con espressione regolare "\\main\\\S+", la data in forma di giorno "[0-9]+", mese "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)" e anno "[0-9][0-9][0-9][0-9]", l'ora "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" e infine il nome dello sviluppatore ".*".

Nota che i caratteri di «commento iniziale» (nell'esempio "**") saranno già rimossi da KDiff3 prima del confronto, quindi l'espressione regolare comincia con una corrispondenza per zero o più caratteri di spaziatura, "\s*". Siccome i caratteri dei commenti possono essere diversi in ogni file (per esempio, C e C++ usano dei caratteri diversi rispetto a Perl), KDiff3 si prende cura dei caratteri iniziali dei commenti, e tu non devi specificarli nell'espressione regolare.

Se hai bisogno di una cronologia ordinata, deve essere calcolata la chiave di ordinamento. Per farlo, le parti rilevanti dell'espressione regolare devono essere raggruppate in parentesi (le parentesi aggiuntive possono essere lasciate se l'ordinamento della cronologia viene disabilitato).

\s*\\main\\(\S+)\s+([0-9]+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)

Le parentesi contengono ora: 1. informazioni di versione, 2. giorno, 3. mese, 4. anno, 5. ora, 6. nome. Se vogliamo ordinare per data e ora, dobbiamo costruire una chiave con gli elementi in un altro ordine di apparizione: prima l'anno, poi il mese, il giorno, l'ora, le informazioni di versione e il nome. Quindi, la chiave di ordinamento da specificare è "4,3,2,5,1,6".

Siccome i nomi dei mesi non sono facili da ordinare ("Apr" sarebbe il primo), KDiff3 rileva l'ordine in cui i nomi dei mesi sono stati dati e usa quell'ordine ("Apr" -> "04"). Se viene trovato un numero, verrà trasformato in un valore a quattro cifre con zeri iniziali per l'ordinamento. Infine, la chiave di ordinamento risultante per la prima riga di inizio degli elementi di cronologia sarà:

2001 04 0002 10:45:41 integration_branch_12   tom

Per ulteriori informazioni vedi anche la sezione Impostazioni di fusione.