summaryrefslogtreecommitdiffhomepage
path: root/it-it/git-it.html.markdown
blob: 521538a1f090f894fda2e3ef88275817fb0f0260 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
---
category: tool
tool: git
contributors:
    - ["Jake Prather", "http://github.com/JakeHP"]
    - ["Leo Rudberg" , "http://github.com/LOZORD"]
    - ["Betsy Lorton" , "http://github.com/schbetsy"]
    - ["Bruno Volcov", "http://github.com/volcov"]
translators:
    - ["Christian Grasso", "http://chris54721.net"]
filename: LearnGit-it.txt
lang: it-it
---

Git è un sistema di
[controllo versione distribuito](https://it.wikipedia.org/wiki/Controllo_versione_distribuito)
e di gestione del codice sorgente.

Git esegue una serie di _snapshot_ per salvare lo stato di un progetto, così
facendo può fornirti la possibilità di gestire il tuo codice e di salvarne lo
stato assegnando delle versioni.

## Basi del controllo versione

### Cos'è il controllo versione?

Il controllo versione (_Version Control_ o _Versioning_) è un sistema che
registra le modifiche apportate a uno o più file nel tempo.

### Controllo versione centralizzato e distribuito

* Il controllo versione centralizzato si concentra sulla sincronizzazione, il
  monitoraggio e il backup dei file.
* Il controllo versione distribuito si concentra sulla condivisione delle
  modifiche. Ogni modifica ha un identificatore univoco.
* I sistemi distribuiti non hanno una struttura definita. Si potrebbe creare
  ad esempio un sistema centralizzato simile a SVN utilizzando Git.

[Ulteriori informazioni](http://git-scm.com/book/it/v1/Per-Iniziare-Il-Controllo-di-Versione)

### Perchè usare Git?

* Consente di lavorare offline.
* Collaborare con altre persone è semplice!
* Utilizzare i branch (rami di sviluppo) è semplice!
* Git è veloce.
* Git è flessibile.

## Architettura di Git

### Repository

Un insieme di file, cartelle, registrazioni della cronologia e versioni.
Immaginalo come una struttura dati del codice, con la caratteristica che ogni
"elemento" del codice ti fornisce accesso alla sua cronologia delle revisioni,
insieme ad altre cose.

Un repository comprende la cartella .git e il working tree.

### Cartella .git (componente del repository)

La cartella .git contiene tutte le configurazioni, i log, i rami e altro.
[Lista dettagliata](http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html)

### Working Tree (componente del repository)

Si tratta semplicemente delle cartelle e dei file presenti nel repository.
Spesso viene indicato come "directory di lavoro" ("working directory").

### Index (componente della cartella .git)

L'Index è l'area di staging di Git. Si tratta di un livello che separa il
working tree dal repository. Ciò fornisce agli sviluppatori più controllo su
cosa viene inviato al repository.

### Commit

Un commit è uno snapshot di una serie di modifiche apportate al working tree.
Ad esempio, se hai aggiunto 5 file e ne hai rimossi 2, ciò sarà registrato in
un commit. Il commit può essere pushato (inviato) o meno ad altri repository.

### Branch (ramo)

Un branch (ramo) è essenzialmente un puntatore all'ultimo commit che hai
effettuato. Effettuando altri commit, il puntatore verrà automaticamente
aggiornato per puntare all'ultimo commit.

### Tag

Un tag è un contrassegno applicato a un punto specifico nella cronologia dei
commit. Di solito i tag vengono utilizzati per contrassegnare le versioni
rilasciate (v1.0, v1.1, etc.).

### HEAD e head (componenti della cartella .git)

HEAD (in maiuscolo) è un puntatore che punta al branch corrente. Un repository
può avere solo 1 puntatore HEAD *attivo*.

head (in minuscolo) è un puntatore che può puntare a qualsiasi commit. Un
repository può avere un numero qualsiasi di puntatori head.

### Stadi di Git
* _Modified_ - Un file è stato modificato, ma non è ancora stato effettuato
  un commit per registrare le modifiche nel database di Git
* _Staged_ - Un file modificato è stato contrassegnato per essere incluso nel
  prossimo commit
* _Committed_ - È stato effettuato un commit e le modifiche sono state
  registrate nel database di Git

## Comandi

### init

Crea un repository Git vuoto. Le impostazioni e le informazioni del repository
sono salvate nella cartella ".git".

```bash
$ git init
```

### config

Utilizzato per configurare le impostazioni, sia specifiche del repository, sia
a livello globale. Le impostazioni globali sono salvate in `~/.gitconfig`.

```bash
$ git config --global user.email "email@example.com"
$ git config --global user.name "Nome utente"
```

[Ulteriori informazioni su git config](http://git-scm.com/docs/git-config)

### help

Fornisce una documentazione molto dettagliata di ogni comando.

```bash
# Mostra i comandi più comuni
$ git help

# Mostra tutti i comandi disponibili
$ git help -a

# Documentazione di un comando specifico
# git help <nome_comando>
$ git help add
$ git help commit
$ git help init
# oppure git <nome_comando> --help
$ git add --help
$ git commit --help
$ git init --help
```

### Ignorare file

Per impedire intenzionalmente che file privati o temporanei vengano inviati
al repository Git.

```bash
$ echo "temp/" >> .gitignore
$ echo "privato.txt" >> .gitignore
```


### status

Mostra le differenza tra lo stato attuale del working tree e l'attuale commit
HEAD.

```bash
$ git status
```

### add

Aggiunge file alla staging area, ovvero li contrassegna per essere inclusi nel
prossimo commit. Ricorda di aggiungere i nuovi file, altrimenti non saranno
inclusi nei commit!

```bash
# Aggiunge un file nella directory attuale
$ git add HelloWorld.java

# Aggiunge un file in una sottocartella
$ git add /path/to/file/HelloWorld.c

# Il comando supporta le espressioni regolari
$ git add ./*.java

# Aggiunge tutti i file non ancora contrassegnati
$ git add --all
```

Questo comando contrassegna soltanto i file, senza effettuare un commit.

### branch

Utilizzato per gestire i branch (rami). Puoi visualizzare, modificare, creare o
eliminare branch utilizzando questo comando.

```bash
# Visualizza i branch e i remote
$ git branch -a

# Crea un nuovo branch
$ git branch nuovoBranch

# Elimina un branch
$ git branch -d nomeBranch

# Rinomina un branch
$ git branch -m nomeBranch nuovoNomeBranch

# Permette di modificare la descrizione di un branch
$ git branch nomeBranch --edit-description
```

### tag

Utilizzato per gestire i tag.

```bash
# Visualizza i tag esistenti
$ git tag
# Crea un nuovo tag
# L'opzione -m consente di specificare una descrizione per il tag.
# Se l'opzione -m non viene aggiunta, Git aprirà un editor per consentire
# l'inserimento del messaggio.
$ git tag -a v2.0 -m 'Versione 2.0'
# Mostra informazioni relative a un tag
# Include informazioni sul creatore del tag, la data di creazione, e il
# messaggio assegnato al tag oltre alle informazioni sul commit.
$ git show v2.0
```

### checkout

Consente di cambiare branch o ripristinare i file a una revisione specifica.
Tutti i file nel working tree vengono aggiornati per corrispondere alla versione
presente nel branch o nel commit specificato.

```bash
# Effettua il checkout di un repository - il branch predefinito è 'master'
$ git checkout
# Effettua il checkout di un branch specifico
$ git checkout nomeBranch
# Crea un nuovo branch e ne effettua il checkout
# Equivalente a "git branch <nomeBranch>; git checkout <nomeBranch>"
$ git checkout -b nuovoBranch
```

### clone

Clona, o copia, un repository esistente in una nuova directory. Inoltre,
aggiunge dei branch _remote-tracking_, utilizzati per monitorare i branch
remoti corrispondenti a quelli locali, e consentendo così di inviare le
modifiche al repository remoto.

```bash
# Clona learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
# Clona solo l'ultima revisione di un repository
$ git clone --depth 1 https://github.com/adambard/learnxinyminutes-docs.git
# Clona solo un branch specifico
$ git clone -b master-cn https://github.com/adambard/learnxinyminutes-docs.git --single-branch
```

### commit

Effettua uno _snapshot_ dello stato attuale del working tree e registra le
modifiche in un nuovo commit. Il commit contiene, oltre alle modifiche apportate,
anche l'autore e una descrizione.

```bash
# Crea un nuovo commit con un messaggio
$ git commit -m "Aggiunta la funzione multiplyNumbers() in HelloWorld.c"

# Aggiunge (git add) automaticamente i file modificati o eliminati (ESCLUSI
# i nuovi file) e quindi effettua il commit
$ git commit -a -m "Modificato foo.php e rimosso bar.php"

# Modifica l'ultimo commit (il comando elimina il commit precedente e lo
# sostituisce con uno nuovo)
$ git commit --amend -m "Messaggio corretto"
```

### diff

Mostra la differenza tra un file nel working tree e la sua versione nell'index,
in un branch o ad un commit specifico.

```bash
# Mostra la differenza tra il working tree e l'index
$ git diff

# Mostra la differenza tra l'index e il commit più recente
$ git diff --cached

# Mostra la differenza tra il working tree e un commit specifico
$ git diff <commit>

# Mostra la differenza tra due commit
$ git diff <commit1> <commit2>
```

### grep

Consente di effettuare una ricerca veloce nel repository.

```bash
# Cerca "variableName" nei file Java
$ git grep 'variableName' -- '*.java'

# Cerca una riga contenente "arrayListName" E "add" oppure "remove"
$ git grep -e 'arrayListName' --and \( -e add -e remove \)
```

Impostazioni relative a `git grep`:

```bash
# Mostra il numero delle righe
$ git config --global grep.lineNumber true

# Rende i risultati più leggibili
$ git config --global alias.g "grep --break --heading --line-number"
```

### log

Mostra la cronologia dei commit inviati al repository.

```bash
# Mostra tutti i commit
$ git log

# Mostra ogni commit su una sola riga
$ git log --oneline

# Mostra solo i commit legati ai merge
$ git log --merges
```

### merge

Effettua un "merge", ovvero unisce le modifiche di un branch in quello attuale.

```bash
# Unisce il branch specificato a quello attuale
$ git merge nomeBranch

# Genera un commit in ogni caso dopo aver eseguito il merge
$ git merge --no-ff nomeBranch
```

### mv

Rinomina o sposta un file.

```bash
# Rinomina un file
$ git mv HelloWorld.c HelloNewWorld.c

# Sposta un file
$ git mv HelloWorld.c ./new/path/HelloWorld.c

# Forza l'esecuzione del comando
# Se un file "nuovoNomeFile" esiste già nella directory, verrà sovrascritto
$ git mv -f nomeFile nuovoNomeFile
```

### pull

Aggiorna il repository effettuando il merge delle nuove modifiche.

```bash
# Aggiorna il branch attuale dal remote "origin"
$ git pull

# Di default, git pull aggiorna il branch attuale effettuando il merge
# delle nuove modifiche presenti nel branch remote-tracking corrispondente
$ git pull

# Aggiorna le modifiche dal branch remoto, quindi effettua il rebase dei commit
# nel branch locale
# Equivalente a: "git pull <remote> <branch>; git rebase <branch>"
$ git pull origin master --rebase
```

### push

Invia ed effettua il merge delle modifiche da un branch locale ad uno remoto.

```bash
# Invia ed effettua il merge delle modifiche dal branch "master"
# al remote "origin".
# git push <remote> <branch>
$ git push origin master

# Di default, git push invia ed effettua il merge delle modifiche
# dal branch attuale al branch remote-tracking corrispondente
$ git push

# Per collegare il branch attuale ad uno remoto, basta aggiungere l'opzione -u
$ git push -u origin master
```

### stash

Salva lo stato attuale del working tree in una lista di modifiche non ancora
inviate al repository con un commit che possono essere applicate nuovamente
in seguito.

Questo comando può essere utile se, ad esempio, mentre stai effettuando delle
modifiche non ancora completate, hai bisogno di aggiornare il repository locale
con `git pull`. Poichè non hai ancora effettuato il commit di tutte le modifiche,
non sarà possibile effettuare il pull. Tuttavia, puoi utilizzare `git stash` per
salvare temporaneamente le modifiche e applicarle in seguito.

```bash
$ git stash
```

Ora puoi effettuare il pull:

```bash
$ git pull
```

A questo punto, come già suggerito dall'output del comando `git stash`, puoi
applicare le modifiche:

```bash
$ git stash apply
```

Infine puoi controllare che tutto sia andato bene:

```bash
$ git status
```

Puoi visualizzare gli accantonamenti che hai effettuato finora utilizzando:

```bash
$ git stash list
```

### rebase (attenzione)

Applica le modifiche effettuate su un branch su un altro branch.
*Non effettuare il rebase di commit che hai già inviato a un repository pubblico!*

```bash
# Effettua il rebase di experimentBranch in master
$ git rebase master experimentBranch
```

[Ulteriori informazioni](https://git-scm.com/book/it/v1/Diramazioni-in-Git-Rifondazione)

### reset (attenzione)

Effettua il reset del commit HEAD attuale ad uno stato specifico.
Questo comando consente di annullare `merge`, `pull`, `commit`, `add` e altro.
Tuttavia, può essere pericoloso se non si sa cosa si sta facendo.

```bash
# Effettua il reset della staging area (annullando le aggiunte e le rimozioni
# di file dal repository, senza modificare il working tree)
$ git reset

# Effettua il reset completo della staging area, ovvero annulla qualsiasi
# modifica al repository eliminando definitivamente anche tutte le modifiche
# ai file non inviate e ripristinando il working tree
$ git reset --hard

# Effettua il reset del branch attuale al commit specificato (lasciando il
# working tree intatto)
$ git reset 31f2bb1

# Effettua il reset completo del branch attuale al commit specificato,
# eliminando qualsiasi modifica non inviata
$ git reset --hard 31f2bb1
```

### rm

Consente di rimuovere un file dal working tree e dal repository.
Per eliminare un file solo dal working tree ma non dal repository, è invece
necessario utilizzare `/bin/rm`.

```bash
# Elimina un file nella directory attuale
$ git rm HelloWorld.c

# Elimina un file da una sottocartella
$ git rm /pather/to/the/file/HelloWorld.c
```