hgbook

annotate it/ch03-tour-merge.xml @ 879:4688f8ac941d

User should use nxml-mode for emacs
author Dongsheng Song <dongsheng.song@gmail.com>
date Wed Oct 21 15:43:16 2009 +0800 (2009-10-21)
parents c06e8bddfcf9
children 719b03ea27c8
rev   line source
Giulio@735 1 <chapter id="chap:tour-merge">
Giulio@737 2 <?dbhtml filename="una-panoramica-di-mercurial-le-unioni.html"?>
Giulio@737 3 <title>Una panoramica di Mercurial: le unioni</title>
Giulio@737 4
gpiancastelli@853 5 <para id="x_338">Finora abbiamo parlato di come clonare un repository, effettuare modifiche in un repository ed estrarre o trasmettere cambiamenti da un repository all&rsquo;altro. Il nostro prossimo passo sarà quello di <emphasis>unire</emphasis> le modifiche provenienti da repository separati.</para>
Giulio@735 6
Giulio@735 7 <sect1>
Giulio@735 8 <title>Unire flussi di lavoro</title>
Giulio@735 9
Giulio@785 10 <para id="x_339">Le unioni giocano un ruolo fondamentale quando si lavora con uno strumento di controllo di revisione distribuito. Ecco alcuni casi in cui può presentarsi il bisogno di unire tra loro due o più flussi di lavoro.</para>
Giulio@735 11 <itemizedlist>
Giulio@735 12 <listitem>
gpiancastelli@836 13 <para id="x_33a">Alice e Bruno hanno entrambi una copia personale di un repository per un progetto su cui stanno collaborando. Mentre Alice corregge un bug nel suo repository, Bruno aggiunge una nuova funzione nel proprio. Entrambi vogliono che il repository condiviso contenga sia la correzione del bug sia la nuova funzione.</para>
Giulio@735 14 </listitem>
Giulio@735 15 <listitem>
gpiancastelli@853 16 <para id="x_33b">Cinzia lavora frequentemente su più attività differenti alla volta per un singolo progetto, ognuna isolata al sicuro nel proprio repository. Lavorando in questo modo, Cinzia ha spesso bisogno di unire una parte del proprio lavoro con un&rsquo;altra.</para>
Giulio@735 17 </listitem>
Giulio@735 18 </itemizedlist>
Giulio@735 19
Giulio@785 20 <para id="x_33c">Dato che abbiamo spesso bisogno di eseguire unioni, Mercurial ci viene in aiuto agevolando questo processo. Per capire come funzionano le unioni, seguiamone una passo per passo. Cominceremo creando ancora un altro clone del nostro repository (vedete quante volte spuntano fuori?) apportandovi poi alcune modifiche.</para>
Giulio@735 21
Giulio@735 22 &interaction.tour.merge.clone;
Giulio@735 23
gpiancastelli@853 24 <para id="x_33d">Ora abbiamo due copie di <filename>hello.c</filename> con contenuti differenti e le cronologie dei due repository divergono l&rsquo;una dall&rsquo;altra, come illustrato nella <xref linkend="fig:tour-merge:sep-repos"/>. Ecco la copia del nostro file presente nel primo repository.</para>
Giulio@735 25
Giulio@735 26 &interaction.tour.merge.cat1;
Giulio@735 27
gpiancastelli@853 28 <para id="x_722">Ed ecco la versione leggermente differente contenuta nell&rsquo;altro repository.</para>
Giulio@735 29
Giulio@735 30 &interaction.tour.merge.cat2;
Giulio@735 31
Giulio@735 32 <figure id="fig:tour-merge:sep-repos">
gpiancastelli@833 33 <title>Le cronologie divergenti dei repository <filename class="directory">mio-hello</filename> e <filename class="directory">mio-nuovo-hello</filename></title>
Giulio@735 34 <mediaobject>
Giulio@735 35 <imageobject><imagedata fileref="figs/tour-merge-sep-repos.png"/></imageobject>
Giulio@735 36 <textobject><phrase>XXX add text</phrase></textobject>
Giulio@735 37 </mediaobject>
Giulio@735 38 </figure>
Giulio@735 39
gpiancastelli@853 40 <para id="x_33f">Sappiamo già che l&rsquo;estrazione dei cambiamenti dal nostro repository <filename class="directory">mio-hello</filename> non avrà alcun effetto sulla directory di lavoro.</para>
Giulio@735 41
Giulio@735 42 &interaction.tour.merge.pull;
Giulio@735 43
gpiancastelli@836 44 <para id="x_340">Tuttavia, il comando <command role="hg-cmd">hg pull</command> dice qualcosa a proposito di <quote>teste</quote> (in inglese, heads).</para>
Giulio@737 45
Giulio@737 46 <sect2>
Giulio@737 47 <title>Le teste di un repository</title>
Giulio@737 48
gpiancastelli@853 49 <para id="x_341">Come ricorderete, Mercurial memorizza l&rsquo;identità del genitore di ogni changeset. Se un cambiamento possiede un genitore, lo chiamiamo figlio o discendente del genitore. Una testa è un changeset che non ha figli. Quindi, la revisione di punta è una testa, perché la revisione più recente in un repository non possiede alcun figlio. Ci sono occasioni in cui un repository può contenere più di una testa.</para>
Giulio@735 50
Giulio@735 51 <figure id="fig:tour-merge:pull">
gpiancastelli@833 52 <title>I contenuti del repository dopo aver propagato i cambiamenti da <filename class="directory">mio-hello</filename> a <filename class="directory">mio-nuovo-hello</filename></title>
Giulio@735 53 <mediaobject>
Giulio@735 54 <imageobject>
Giulio@735 55 <imagedata fileref="figs/tour-merge-pull.png"/>
Giulio@735 56 </imageobject>
Giulio@735 57 <textobject><phrase>XXX add text</phrase></textobject>
Giulio@735 58 </mediaobject>
Giulio@735 59 </figure>
Giulio@735 60
gpiancastelli@853 61 <para id="x_343">Dalla <xref linkend="fig:tour-merge:pull"/>, potete vedere l&rsquo;effetto della propagazione dei cambiamenti dal repository <filename class="directory">mio-hello</filename> al repository <filename class="directory">mio-nuovo-hello</filename>. La cronologia già presente in <filename class="directory">mio-nuovo-hello</filename> non viene toccata, ma al repository è stata aggiunta una nuova revisione. Riferendoci alla <xref linkend="fig:tour-merge:sep-repos"/>, possiamo vedere che nel nuovo repository l&rsquo;<emphasis>identificatore di changeset</emphasis> rimane lo stesso, ma il <emphasis>numero di revisione</emphasis> è cambiato. (Questo, incidentalmente, è un buon esempio del perché sia inopportuno usare i numeri di revisione per discutere i changeset.) Possiamo vedere le teste di un repository utilizzando il comando <command role="hg-cmd">hg heads</command>.</para>
Giulio@735 62
Giulio@735 63 &interaction.tour.merge.heads;
Giulio@735 64 </sect2>
Giulio@735 65
Giulio@735 66 <sect2>
gpiancastelli@853 67 <title>Effettuare l&rsquo;unione</title>
Giulio@735 68
Giulio@737 69 <para id="x_344">Cosa succede se proviamo a usare normalmente il comando <command role="hg-cmd">hg update</command> per aggiornare la directory di lavoro alla nuova punta?</para>
Giulio@735 70
Giulio@735 71 &interaction.tour.merge.update;
Giulio@735 72
gpiancastelli@853 73 <para id="x_345">Mercurial ci sta dicendo che <command role="hg-cmd">hg update</command> non è in grado di effettuare un&rsquo;unione. Il comando non aggiornerà la directory di lavoro se pensa che potremmo voler eseguire un&rsquo;unione, a meno che non gli chiediamo esplicitamente di farlo. (Incidentalmente, forzare l&rsquo;aggiornamento tramite <command>hg update -C</command> provocherebbe la perdita di tutte le modifiche contenute nella directory di lavoro e non ancora inserite nel repository.)</para>
gpiancastelli@853 74
gpiancastelli@853 75 <para id="x_723">Per avviare un&rsquo;unione tra le due teste, usiamo il comando <command role="hg-cmd">hg merge</command>.</para>
Giulio@735 76
Giulio@735 77 &interaction.tour.merge.merge;
Giulio@735 78
gpiancastelli@853 79 <para id="x_347">Il contenuto del file <filename>hello.c</filename> viene sistemato. L&rsquo;operazione aggiorna la directory di lavoro in modo che contenga le modifiche provenienti da <emphasis>entrambe</emphasis> le teste, cosa che si riflette sia nell&rsquo;elenco visualizzato dal comando <command role="hg-cmd">hg parents</command> sia nei contenuti del file <filename>hello.c</filename>.</para>
Giulio@735 80
Giulio@735 81 &interaction.tour.merge.parents;
Giulio@735 82 </sect2>
Giulio@735 83
Giulio@735 84 <sect2>
gpiancastelli@853 85 <title>Inserire i risultati dell&rsquo;unione nel repository</title>
gpiancastelli@853 86
gpiancastelli@853 87 <para id="x_348">Ogni volta che eseguiamo un&rsquo;unione, il comando <command role="hg-cmd">hg parents</command> mostrerà due genitori fino a quando non invocheremo <command role="hg-cmd">hg commit</command> per inserire i risultati dell&rsquo;unione nel repository.</para>
Giulio@735 88
Giulio@785 89 &interaction.tour.merge.commit;
Giulio@735 90
Giulio@737 91 <para id="x_349">Ora abbiamo una nuova revisione di punta che, come potete notare, possiede <emphasis>entrambe</emphasis> le nostre vecchie teste come genitori. Queste sono le stesse revisioni che erano state precedentemente mostrate da <command role="hg-cmd">hg parents</command>.</para>
Giulio@735 92
Giulio@735 93 &interaction.tour.merge.tip;
Giulio@735 94
gpiancastelli@853 95 <para id="x_34a">Nella <xref linkend="fig:tour-merge:merge"/>, potete vedere una rappresentazione di quanto accade alla directory di lavoro durante l&rsquo;unione e di come questo abbia effetto sul repository quando avviene l&rsquo;inserimento. Durante l&rsquo;unione, la directory di lavoro possiede due changeset genitori che poi diventano i genitori del nuovo changeset.</para>
Giulio@735 96
Giulio@735 97 <figure id="fig:tour-merge:merge">
gpiancastelli@853 98 <title>Lo stato della directory di lavoro e del repository durante l&rsquo;unione e dopo l&rsquo;inserimento</title>
Giulio@735 99 <mediaobject>
Giulio@735 100 <imageobject>
Giulio@735 101 <imagedata fileref="figs/tour-merge-merge.png"/>
Giulio@735 102 </imageobject>
Giulio@735 103 <textobject><phrase>XXX add text</phrase></textobject>
Giulio@735 104 </mediaobject>
Giulio@735 105 </figure>
Giulio@735 106
gpiancastelli@853 107 <para id="x_69c">Talvolta si dice che un&rsquo;unione è composta da due <emphasis>parti</emphasis>: la parte sinistra è costituita dal primo genitore elencato da <command role="hg-cmd">hg parents</command> e la parte destra dal secondo. Se per esempio la directory di lavoro si fosse trovata alla revisione 5 prima che cominciassimo l&rsquo;unione, quella revisione sarebbe diventata la parte sinistra dell&rsquo;unione.</para>
Giulio@735 108 </sect2>
Giulio@735 109 </sect1>
Giulio@735 110
Giulio@735 111 <sect1>
Giulio@737 112 <title>Risolvere i conflitti tra cambiamenti</title>
Giulio@737 113
gpiancastelli@836 114 <para id="x_34b">La maggior parte delle unioni è semplice, ma a volte vi troverete a unire cambiamenti in cui ognuna delle due parti modifica le stesse porzioni degli stessi file. A meno che entrambe le modifiche siano identiche, questa situazione risulterà in un <emphasis>conflitto</emphasis> che dovrete cercare di riconciliare decidendo come combinare i diversi cambiamenti in un risultato coerente.</para>
Giulio@735 115
Giulio@735 116 <figure id="fig:tour-merge:conflict">
Giulio@737 117 <title>Modifiche in conflitto a un documento</title>
Giulio@735 118 <mediaobject>
Giulio@735 119 <imageobject><imagedata fileref="figs/tour-merge-conflict.png"/></imageobject>
Giulio@735 120 <textobject><phrase>XXX add text</phrase></textobject>
Giulio@735 121 </mediaobject>
Giulio@735 122 </figure>
Giulio@735 123
Giulio@785 124 <para id="x_34d">La <xref linkend="fig:tour-merge:conflict"/> illustra un esempio di due diversi cambiamenti a uno stesso documento che sono in conflitto tra loro. Siamo partiti da una singola versione del file, a cui poi abbiamo apportato alcune modifiche mentre qualcun altro faceva modifiche differenti allo stesso testo. Nella risoluzione del conflitto tra i cambiamenti, il nostro compito è quello di decidere che cosa dovrebbe contenere il file.</para>
Giulio@785 125
Giulio@785 126 <para id="x_34e">Mercurial non è dotato di alcuna funzione predefinita per gestire i conflitti. Invece, richiama un programma esterno, di solito uno che mostra un qualche tipo di interfaccia grafica per la risoluzione dei conflitti, trovato tra i tanti strumenti di unione differenti che è probabile siano installati sul vostro sistema. Come prima cosa, Mercurial prova a cercare alcuni strumenti di unione completamente automatici; poi, se non riesce a trovarli (perché il processo di risoluzione richiede una guida umana) o se non sono presenti, prova a richiamare diversi strumenti grafici di unione.</para>
Giulio@737 127
gpiancastelli@853 128 <para id="x_34f">&Egrave; anche possibile far eseguire a Mercurial uno specifico programma, impostando il valore della variable d&rsquo;ambiente <envar>HGMERGE</envar> al nome del vostro programma preferito.</para>
Giulio@735 129
Giulio@735 130 <sect2>
Giulio@785 131 <title>Usare uno strumento grafico di unione</title>
Giulio@735 132
Giulio@737 133 <para id="x_350">Il mio strumento grafico preferito per gestire le unioni è <command>kdiff3</command>, che userò per descrivere le caratteristiche comuni a queste applicazioni. Potete vedere <command>kdiff3</command> in azione nella <xref linkend="fig:tour-merge:kdiff3"/>. Il tipo di unione che sta eseguendo si chiama <emphasis>unione a tre vie</emphasis>, perché ci sono tre differenti versioni di un file che ci interessano. La porzione superiore della finestra è divisa in tre pannelli:</para>
Giulio@735 134 <itemizedlist>
gpiancastelli@848 135 <listitem><para id="x_351">a sinistra troviamo la versione <emphasis>base</emphasis> del file, cioè la versione più recente da cui discendono le due versioni che stiamo cercando di unire;</para>
Giulio@735 136 </listitem>
Giulio@737 137 <listitem><para id="x_352">nel mezzo troviamo la <quote>nostra</quote> versione del file, con i contenuti che abbiamo modificato;</para>
Giulio@735 138 </listitem>
Giulio@737 139 <listitem><para id="x_353">a destra troviamo la <quote>loro</quote> versione del file, quella che proviene dal changeset che stiamo cercando di incorporare.</para>
Giulio@735 140 </listitem></itemizedlist>
gpiancastelli@853 141 <para id="x_354">Il pannello sottostante contiene il <emphasis>risultato</emphasis> corrente dell&rsquo;unione. Il nostro compito è quello di sostituire tutto il testo in rosso, che indica conflitti irrisolti, con una qualche combinazione ragionevole della <quote>nostra</quote> e della <quote>loro</quote> versione del file.</para>
Giulio@737 142
Giulio@737 143 <para id="x_355">Tutti e quattro questi pannelli sono <emphasis>collegati tra loro</emphasis>: se ci spostiamo in verticale o in orizzontale in un pannello qualsiasi, gli altri vengono aggiornati per mostrare le sezioni corrispondenti dei rispettivi file.</para>
Giulio@735 144
Giulio@735 145 <figure id="fig:tour-merge:kdiff3">
Giulio@737 146 <title>Usare <command>kdiff3</command> per unire diverse versioni di un file</title>
Giulio@735 147 <mediaobject>
Giulio@735 148 <imageobject>
Giulio@735 149 <imagedata width="100%" fileref="figs/kdiff3.png"/></imageobject>
Giulio@735 150 <textobject>
Giulio@735 151 <phrase>XXX add text</phrase>
Giulio@735 152 </textobject>
Giulio@735 153 </mediaobject>
Giulio@735 154 </figure>
Giulio@735 155
Giulio@737 156 <para id="x_357">Per ogni porzione conflittuale del file, possiamo scegliere di risolvere il conflitto usando una qualche combinazione di testo dalla versione base, dalla nostra, o dalla loro. Possiamo anche modificare manualmente il file risultante in ogni momento, nel caso avessimo bisogno di effettuare ulteriori cambiamenti.</para>
Giulio@737 157
gpiancastelli@853 158 <para id="x_358">Esistono <emphasis>molti</emphasis> strumenti per gestire l&rsquo;unione di file, davvero troppi per elencarli qui. Si differenziano a seconda della piattaforma per cui sono disponibili e delle loro particolari forze e debolezze. La maggior parte è calibrata per unire file contenenti testo semplice, mentre alcuni sono orientati a particolari formati di file (generalmente XML).</para>
Giulio@737 159 </sect2>
Giulio@737 160
Giulio@737 161 <sect2>
Giulio@737 162 <title>Un esempio risolto</title>
Giulio@737 163
Giulio@737 164 <para id="x_359">In questo esempio, riprodurremo la cronologia delle modifiche ai file della <xref linkend="fig:tour-merge:conflict"/> vista in precedenza. Per cominciare, creiamo un repository con una versione base del nostro documento.</para>
Giulio@735 165
Giulio@735 166 &interaction.tour-merge-conflict.wife;
Giulio@735 167
Giulio@735 168 <para id="x_35a">Cloniamo il repository e apportiamo un cambiamento al file.</para>
Giulio@735 169
Giulio@735 170 &interaction.tour-merge-conflict.cousin;
Giulio@735 171
gpiancastelli@853 172 <para id="x_35b">E ora aggiungiamo un altro clone, per simulare qualcun altro che effettui un cambiamento al file. (Questo suggerisce l&rsquo;idea che non è affatto inusuale ritrovarsi a unire tra loro i propri repository contenenti attività isolate, risolvendo i conflitti incontrati nel corso di questo processo.)</para>
Giulio@735 173
Giulio@735 174 &interaction.tour-merge-conflict.son;
Giulio@735 175
Giulio@737 176 <para id="x_35c">Avendo creato due versioni differenti del file, predisponiamo un ambiente adeguato a eseguire la nostra unione.</para>
Giulio@735 177
Giulio@735 178 &interaction.tour-merge-conflict.pull;
Giulio@735 179
gpiancastelli@853 180 <para id="x_35d">In questo esempio, imposterò la variabile d&rsquo;ambiente <envar>HGMERGE</envar> per dire a Mercurial di usare il comando non interattivo <command>merge</command>. Questo comando è incluso in molti sistemi di tipo Unix. (Se state seguendo questo esempio sul vostro computer, non preoccupatevi di impostare <envar>HGMERGE</envar>. Vi verrà presentata un&rsquo;applicazione grafica da utilizzare per unire i file, che è un&rsquo;alternativa di gran lunga preferibile.)</para>
Giulio@735 181
Giulio@735 182 &interaction.tour-merge-conflict.merge;
Giulio@735 183
gpiancastelli@853 184 <para id="x_35f">Dato che <command>merge</command> non riesce a risolvere il conflitto tra i cambiamenti, inserisce alcuni <emphasis>marcatori di unione</emphasis> all&rsquo;interno del file che esibisce i conflitti, per indicare quali righe sono in conflitto e se quelle righe provengono dalla nostra versione del file o dalla loro.</para>
gpiancastelli@853 185
gpiancastelli@853 186 <para id="x_360">Dal modo in cui <command>merge</command> termina, Mercurial riconosce che non è stato in grado di operare con successo, quindi ci dice quali comandi abbiamo bisogno di eseguire se vogliamo rifare l&rsquo;operazione di unione. Questo potrebbe essere utile se, per esempio, stessimo lavorando con un&rsquo;applicazione grafica per la gestione delle unioni e la chiudessimo perché siamo confusi o realizziamo di aver commesso un errore.</para>
gpiancastelli@853 187
gpiancastelli@853 188 <para id="x_361">Nel caso in cui l&rsquo;unione automatica o manuale fallisca, nulla ci impedisce di <quote>correggere</quote> i file interessati per conto nostro, per poi inserire i risultati della nostra unione nel repository:</para>
Giulio@735 189
Giulio@735 190 &interaction.tour-merge-conflict.commit;
Giulio@735 191
Giulio@735 192 <note>
gpiancastelli@853 193 <title>Dov&rsquo;è il comando <command>hg resolve</command>?</title>
Giulio@735 194
Giulio@737 195 <para id="x_724">Il comando <command>hg resolve</command> è stato introdotto nella verisone 1.1 di Mercurial rilasciata nel dicembre 2008. Se state usando una versione più vecchia (eseguite <command>hg version</command> per controllare) questo comando non sarà presente. Nel caso la vostra versione di Mercurial sia precedente alla 1.1, vi consiglio vivamente di installare una versione più recente prima di affrontare unioni complicate.</para>
Giulio@735 196 </note>
Giulio@735 197 </sect2>
Giulio@735 198 </sect1>
Giulio@735 199
Giulio@735 200 <sect1 id="sec:tour-merge:fetch">
Giulio@735 201 <title>Semplificare la sequenza di estrazione-unione-inserimento</title>
Giulio@735 202
Giulio@737 203 <para id="x_362">Il processo di unione dei cambiamenti appena delineato è molto semplice, ma richiede di eseguire tre comandi in sequenza.</para>
Giulio@735 204 <programlisting>hg pull -u
Giulio@735 205 hg merge
Giulio@735 206 hg commit -m 'Incorporati i cambiamenti remoti'</programlisting>
gpiancastelli@853 207 <para id="x_363">Nel caso dell&rsquo;inserimento finale, avete anche bisogno di includere un messaggio di commit, che sarà quasi sempre composto da testo <quote>standard</quote> non particolarmente interessante.</para>
gpiancastelli@853 208
gpiancastelli@853 209 <para id="x_364">Se fosse possibile, sarebbe comodo ridurre il numero di passi necessari. In effetti, Mercurial viene distribuito con un&rsquo;estensione chiamata <literal role="hg-ext">fetch</literal> pensata proprio per questo scopo.</para>
Giulio@785 210
gpiancastelli@836 211 <para id="x_365">Mercurial fornisce un meccanismo flessibile per consentire ad altre persone di estendere le sue funzionalità, preservando le dimensioni ridotte e la manutenibilità del proprio nucleo. Alcune estensioni aggiungono nuovi comandi che potete usare dalla riga di comando, mentre altre lavorano <quote>dietro le quinte</quote>, per esempio accrescendo la funzionalità della modalità server predefinita di Mercurial.</para>
Giulio@785 212
gpiancastelli@853 213 <para id="x_366">L&rsquo;estensione <literal role="hg-ext">fetch</literal> aggiunge un nuovo comando chiamato, naturalmente, <command role="hg-cmd">hg fetch</command>. Questa estensione agisce come una combinazione di <command role="hg-cmd">hg pull -u</command>, <command role="hg-cmd">hg merge</command> e <command role="hg-cmd">hg commit</command>. Comincia propagando verso il repository corrente i cambiamenti estratti da un altro repository. Se si accorge che i cambiamenti hanno aggiunto una nuova testa al repository, aggiorna la directory di lavoro alla nuova testa, poi avvia il processo di unione e infine, se l&rsquo;unione ha successo, ne inserisce il risultato nel repository con un messaggio di commit generato automaticamente. Se non sono state aggiunte nuove teste, il comando si limita ad aggiornare la directory di lavoro alla nuova revisione di punta.</para>
gpiancastelli@853 214
gpiancastelli@853 215 <para id="x_367">Abilitare l&rsquo;estensione <literal role="hg-ext">fetch</literal> è facile. Aprite il file <filename role="special">.hgrc</filename> che si trova nella vostra directory personale e andate alla sezione <literal role="rc-extensions">extensions</literal> (oppure createla se non esiste già). Poi aggiungete una riga che contenga semplicemente <quote><literal>fetch=</literal></quote>.</para>
Giulio@735 216
Giulio@735 217 <programlisting>[extensions]
Giulio@735 218 fetch =</programlisting>
Giulio@735 219
gpiancastelli@853 220 <para id="x_368">(Normalmente, la parte a destra del simbolo <quote><literal>=</literal></quote> indicherebbe dove trovare l&rsquo;estensione, ma dato che l&rsquo;estensione <literal role="hg-ext">fetch</literal> è compresa nella distribuzione standard, Mercurial sa già dove andarla a cercare.)</para>
Giulio@735 221 </sect1>
Giulio@735 222
Giulio@735 223 <sect1>
Giulio@735 224 <title>Rinominare, copiare e unire</title>
Giulio@735 225
gpiancastelli@853 226 <para id="x_729">Durante la vita di un progetto, vorremo spesso cambiare la disposizione dei suoi file e delle sue directory. Queste modifiche possono essere tanto semplici quanto rinominare un singolo file, o tanto complesse quanto ristrutturare l&rsquo;intera gerarchia dei file nell&rsquo;ambito del progetto.</para>
Giulio@737 227
Giulio@737 228 <para id="x_72a">Mercurial supporta questi tipi di cambiamenti in maniera fluida, a patto che gli diciamo quello che stiamo facendo. Se vogliamo rinominare un file, dovremmo usare il comando <command>hg rename</command><footnote>
Giulio@785 229 <para id="x_72b">Se siete utenti Unix, sarete felici di sapere che il comando <command>hg rename</command> si può abbreviare in <command>hg mv</command>.</para>
gpiancastelli@853 230 </footnote> per cambiare il nome del file, in modo che Mercurial possa comportarsi in maniera appropriata nel caso più tardi effettuassimo un&rsquo;unione.</para>
gpiancastelli@853 231
gpiancastelli@853 232 <para id="x_72c">Tratteremo l&rsquo;uso di questi comandi in maniera più estesa nella <xref linkend="chap:daily.copy"/>.</para>
Giulio@735 233 </sect1>
Giulio@735 234 </chapter>