zwischendurch
[gitmagic.git] / it / basic.txt
blobb312ec3dd25e1725a469df362056793257e9b197
1 == Trucchi di base  ==
3 Piuttosto che immergerci nel mare di comandi di Git, bagnamoci un po' i
4 piedi con i seguenti esempi elementari. Nonostance la loro semplicità,
5 ognuno di loro è utile. In effetti, durante i miei mesi iniziali
6 d'utilizzazione di Git, non mi sono mai avventurato al di là di del
7 materiale in questo capitolo.
9 === Salvare lo stato corrente ===
11 Siete sul punto di fare qualcosa di drastico? Prima di proseguire,
12 catturate lo stato di tutti i files nella directory corrente:
14  $ git init
15  $ git add .
16  $ git commit -m "Il mio primo backup"
18 Qualora le cose dovessero andare per il peggio, potrete sempre
19 ripristinare la versione salvatae:
21  $ git reset --hard
23 Per salvare un nuovo state:
25  $ git commit -a -m "Un altro backup"
27 === Aggiungere, rimuovere e rinominare files ===
29 Le istruzioni che abbiamo appena visto tengono traccia solo dei files
30  che erano presenti nel momento dell'esecuzione di *git add*. Ma se
31  aggiungete nuovi files o sottocartelle, dovrete dirlo a Git:
33  $ git add readme.txt Documentation
35 Analogamente se volete che Git ignori alcuni files:
37  $ git rm kludge.h obsolete.c
38  $ git rm -r incriminating/evidence/
40 Git rimuoverà questi files per voi, se non l'avete ancora fatto.
42 Un file può essere rinominato rimuovendo il vecchio nome e aggiungendo
43 il nuovo nome. È anche possibile usare la scorciatoia *git mv* che segue
44 la stessa sintassi del comando *mv*. Ad esempio:
46  $ git mv bug.c feature.c
48 === Annullare/Ripristino avanzati ===
50 A volte può capitare che vogliate solamente ritornare indietro e
51 dimenticare le modifiche effettuate dopo un certo punto, perché sono
52 tutte sbagliate. In quel caso:
54  $ git log
56 vi nostra una lista dei commits più recenti, accompagnati dal loro
57 codice SHA1:
59 ----------------------------------
60 commit 766f9881690d240ba334153047649b8b8f11c664
61 Author: Bob <bob@example.com>
62 Date: Tue Mar 14 01:59:26 2000 -0800
64     Sostituzione di prinf() con write()
66 commit 82f5ea346a2e651544956a8653c0f58dc151275c
67 Author: Alice <alice@example.com>
68 Date:   Thu Jan 1 00:00:00 1970 +0000
70     Commit iniziale
71 ----------------------------------
73 I primi caratteri del codice SHA1 sono sufficienti per specificare un
74 commit; alternativamente copiate e incollate l'intero codice SHA1.
75 Digitate:
77  $ git reset --hard 766f
79 per reinstaurare lo stato corrspondente al commit corrente e
80 permanetemente cancellare i commits più recenti.
82 Altre volte potrebbe capitarvi di voler fare solo un breve salto in uno
83 stato precedente. In questo caso eseguite:
85  $ git checkout 82f5
87 Questo vi riporta indietro nel tempo, preservando i commits più recenti.
88 Bisogna però sapere che, come in ogni viaggio nel tempo in un film di
89 fantascienza, se ora modificate e sottomettete un commit vi ritroverete
90 in una realtà alternativa, perché avrete fatto delle azioni differenti
91 rispetto alla realtà originaria.
93 Questa realtà parallela viene chiamata 'ramificazione' o 'branch', et
94 <<branch,vi dirò di più in proposito in seguito>>. Per ora è abbastanza
95 ricordare che
97  $ git checkout master
99 vi riporta al presente. In oltre, per evitare che Git si lamenti,
100 ricordatevi di fare un commit o un reset delle vostre modifiche prima di
101 fare un checkout.
103 Per riprendere l'analogia con i videogiochi digitate:
105 - *`git reset --hard`* : carica un vecchio salvataggio e cancella
106   tutte le partite salvate più recenti di quella appena caricata.
108 - *`git checkout`* : carica una vecchia partita, ma se ci giocate, lo
109   stato della partita sarà diverso da quello dei salvataggi successivi
110   che avete fato inizialmente. Da ora in poi ogni volta che salvate una
111   partita finirete in un branch separata che rappresenta la realtà
112   parallela in cui siete entrati. <<branch,Ci occuperemo di questo più
113   tardi>>.
116 Potete scegliere di ripristinare files e sottocartelle particolari
117 aggiungendoli alla fine del seguente comando:
119  $ git checkout 82f5 un.file un-altro.file
121 Fate però attenzione: questa forma di *checkout* può sovrascrivere dei
122 files senza avvertimenti. Per evitare incidenti, fate un commit prima di
123 eseguire un comando di checkout, specialmente se siete alle prime armi
124 con Git. In generale, ogni volta che non siete sicuri delle conseguenze
125 di comando, che sia di Git o no, eseguite prima *git commit -a*.
127 Non vi piace copiare e incollare codice hash? Allora utilizzate:
129  $ git checkout :/"Il mio primo b"
131 per saltare direttamente al commit che inizia con quel messaggio. Potete
132 anche chiedere, ad esempio, il quintultimo stato salvato:
134  $ git checkout master~5
136 === Annullare (revert) ===
138 In una corte di giustizia, certi avvenimenti possono essere stralciati
139 dal processo verbale. Analogamente, potete selezionare degli specifici
140 commit da annullare.
142  $ git commit -a
143  $ git revert 1b6d
145 annulla solo l'ultimo commit con il dato codice hash. Il revert viene
146 registrato come un nuovo commit, fatto che potrete verificare eseguendo
147 un *git log*.
149 === Generare un diario delle modifiche (changelog) ===
151 Certi progetti richiedono un
152 http://it.wikipedia.org/wiki/Changelog[changelog].  Createlo digitando:
154  $ git log > ChangeLog
156 === Scaricare dei files ===
158 Fate una copia di un progetto gestito da Git digitando:
160  $ git clone git://server/percorso/verso/files
162 Ad esempio, per ottenere tutti i files che ho usato per creare questo
163 sito:
165  $ git clone git://git.or.cz/gitmagic.git
167 Avremo molto da dire a proposito del comando *clone* tra poco.
169 === L'ultima versione ===
171 Se avete già scaricato una copia di un progetto usando *git clone*,
172 potete aggiornarla all'ultima versione con:
174  $ git pull
176 === Pubblicazione istantanea ===
178 Immaginate di aver scritto uno script che volete condividere con altri.
179 Potreste semplicemente dire loro di scaricarlo dal vostro computer, ma
180 le fanno mentre state migliorando lo script o sperimentando con delle
181 modifiche, potrebbero finire nei guai. Naturalmente, questo tipo di
182 situazioni sono la ragione per cui esistono i cicli di rilascio. Gli
183 sviluppatori possono lavorare frequentemente ad un progetto, ma
184 rilasciano il codice solo quando hanno l'impressione che sia
185 presentabile. 
187 Per fare questo con Git, nella cartella che contiene lo script eseguite:
189  $ git init
190  $ git add .
191  $ git commit -m "Prima versione"
193 In seguito dite agli utenti di eseguire:
195  $ git clone il.vostro.computer:/percorso/verso/lo/script
197 per scaricare il vostro script. Questo assume che tutti abbiamo accesso
198 ssh al vostro computer. Se non fosse il caso, esguite *git daemon* e
199 dite ai vostri utenti di eseguire invece:
201  $ git clone git://il.vostro.computer/percorso/verso/lo/script
203 A partire da questo momento, ogni volta che il vostro script è pronto
204 per essere rilasciato, eseguite:
206  $ git commit -a -m "Nuova versione"
208 e i vostri utenti potranno aggiornare la loro versione andando
209 nella cartella che contiene lo script e digitando:
211  $ git pull
213 I vostri utenti non si ritroveranno mai più con una versione del vostro
214 script che non volete che vedano.
216 === Che cosa ho fatto? ===
218 Ritroverete le modifiche fatte dall'ultimo commit con:
220  $ git diff
222 Oppure quelle a partire da ieri con:
224  $ git diff "@{yesterday}"
226 O tra una versione specifica e due versioni fa:
228  $ git diff 1b6d "master~2"
230 In ogni caso il risultato è una patch che può essere applicata con *git
231 apply*.
232 Potete anche provare:
234  $ git whatchanged --since="2 weeks ago"
236 Spesso esamino invece la storia dei commits con
237 http://sourceforge.net/projects/qgit[qgit], per via della sua
238 sfolgorante interfaccia, oppure http://jonas.nitro.dk/tig/[tig],
239 un'interfaccia in modalità testo che funziona bene anche con le
240 connessioni più lente. Alternativamente, installate un server web,
241 lanciate *git instaweb* e lanciate il vostro browser.
244 === Esercizio ===
247 Siano A, B, C, D quattro commits successivi, dove B è identico a A, con
248 l'eccezione che alcuni files sono stati rimossi. Vogliamo rimettere i
249 files in D. Come possiamo fare?
251 Ci sono almeno tre soluzioni. Assumiamo che siao in D:
253   1. La differenza tra A e B sono i files rimossi. Possiamo creare una
254   patch che rappresenti la differenza e applicarla:
256    $ git diff B A | git apply
258   2. Visto che i files in questioni sono presenti in A, possiamo
259   recuperarli:
261    $ git checkout A foo.c bar.h
263   3. Possiamo anche pensare al passo da A a B come ad una modifica che
264   vogliamo annullare:
266    $ git revert B
268 Quel è la scelta migliore? Quella che preferite! È facile ottenere
269 quello che volete con Git, e spesso ci sono diversi modi di ottenerlo.