forked from GuITeX/guidagit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
guidagit.tex
1663 lines (1516 loc) · 83.2 KB
/
guidagit.tex
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
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% LICENZA
%
% Quest'opera è stata rilasciata sotto la licenza
% Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Italy.
% Per leggere una copia della licenza visita il sito web
% http://creativecommons.org/licenses/by-nc-sa/2.5/it/
% o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San
% Francisco, California, 94105, USA.
%
% This work is licensed under the Creative Commons
% Attribution-NonCommercial-ShareAlike 2.5 Italy License. To view a copy of this
% license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/it/deed.en or
% send a letter to Creative Commons, 171 Second Street, Suite 300, San
% Francisco, California, 94105, USA.
%
% For info send a mail to pietro.giuffri@gmail.com
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[b5paper,11pt,oneside]{guidatematica}
\ProvidesFile{guidagit.tex}[2013/11/07 v.1.0 Una guida introduttiva a Git per
progetti LaTeX]
\usepackage[os=win]{menukeys}
\usepackage{ccicons,quoting,hyperref}
\hypersetup{
pdftitle={Una guida introduttiva a Git per progetti \LaTeX},
pdfauthor={Mosè Giordano, Pietro Giuffrida},
breaklinks=true, % permette di spezzare i link su più righe
bookmarksnumbered, % inserisce i numeri delle sezioni nei segnalibri
%%% opzioni dei colori di guidatematica.cls
colorlinks,linkcolor={blue},
citecolor={blue!80!black},urlcolor={blue},
}
\lstset{basicstyle=\small\ttfamily,
keywordstyle=\color{blue},
commentstyle=\color{red},
stringstyle=\color{purple},
frame=lines,
breaklines = true, % per mandare a capo le righe troppo lunghe
breakautoindent = true, % indenta le righe spezzate
breakindent = 30pt, % indenta le righe di 30pt
language=bash,
showspaces=false,
showstringspaces=false,
showtabs=false,
emph={touch,mkdir,echo,rm},
emphstyle=\color{blue},
escapechar={£},
}
% comando per scrivere `GiT' con lo stile di `TeX', da usare nel titolo. Ho
% copiato la definizione del comando `\TeX'.
\newcommand{\GiT}{G\kern-.1667em\lower.5ex\hbox{I}\kern-.125emT\@}
\newsavebox{\codetitlebox}
\begin{document}
\frontmatter{}
\begin{lrbox}{\codetitlebox}
\begin{minipage}{0.4\textwidth}
\lstset{basicstyle=\large\ttfamily,
classoffset=0,
morekeywords={git},keywordstyle=\color{blue},
classoffset=1,stringstyle=,
morekeywords={dependencies},keywordstyle=\color[HTML]{A0522D},
frame=shadowbox,frameround=ffff,rulesepcolor=\color[cmyk]{1,0,1,0.6}}
\begin{lstlisting}
git commit -m"£\normalfont\LaTeX£"
\end{lstlisting}
\end{minipage}
\end{lrbox}
\title{%
\usebox{\codetitlebox}\\[\bigskipamount]
\GiT{} 4 \LaTeX{} \\
Una guida introduttiva a Git \\
per progetti \LaTeX}
\author{Mosè Giordano, Pietro Giuffrida}
\frontmatter{}
\GetFileInfo{guidagit.tex}
\date{\fileversion{} del \filedate}
\maketitle
\cleardoublepage{}
\chapter{Licenza d'uso}
\label{cha:licenza}
Dato il carattere ludico della presente guida, abbiamo scelto come licenza la
Creative Commons \emph{Attribuzione}, \emph{Non Commerciale}, \emph{Condividi
allo stesso modo} 2.5 Italy. Un riassunto della licenza in linguaggio
accessibile a tutti è reperibile sul sito ufficiale
\url{http://creativecommons.org/licenses/by-nc-sa/2.5/it/}.
\bigskip\noindent\textsc{tu sei libero:}
\begin{itemize}
\item Di riprodurre, distribuire, comunicare al pubblico, esporre in pubblico,
rappresentare, eseguire e recitare quest'opera.
\item Di modificare quest'opera.
\end{itemize}
\textsc{alle seguenti condizioni:}
\begin{itemize}
\item[\Large\ccAttribution] Devi attribuire la paternità dell'opera nei modi
indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da
non suggerire che essi avallino te o il modo in cui tu usi l'opera.
\item[\Large\ccNonCommercial] Non puoi usare quest'opera per fini commerciali.
\item[\Large\ccShareAlike] Se alteri o trasformi quest'opera, o se la usi per
crearne un'altra, puoi distribuire l'opera risultante solo con una licenza
identica o equivalente a questa.
\end{itemize}
\chapter{Presentazione della guida}
\label{cha:presentazione-guida}
In questa guida mostreremo come utilizzare Git per tener traccia delle modifiche
rilevanti e delle versioni elaborate nel corso dell'elaborazione di un documento
scritto con \LaTeX, un programma di composizione tipografica di alta qualità.
Qui non si spiegherà il funzionamento di \LaTeX{}, per maggiori informazioni su
questo programma si possono consultare l'ottima guida di~\cite{pantieri:latex} e
la documentazione in italiano reperibile a partire dal sito del \guit{}
(\url{http://www.guitex.org}).
Solo i primi tre capitoli sono indispensabili. Nel
capitolo~\ref{cha:introduzione-vcs} si proverà a convincere il lettore
dell'utilità dei programmi per il controllo delle revisioni (VCS), saranno
presentati i VCS in generale e verranno trattate le basi del funzionamento di
Git in particolare. Nel capitolo~\ref{cha:installare-git} sarà brevemente
spiegato come installare Git nei vari sistemi operativi. Nel
capitolo~\ref{cha:git-latex} saranno illustrati i passaggi fondamentali per la
creazione di un \emph{repository} locale del proprio progetto, per il
salvataggio progressivo delle versioni, e quindi per svolgere eventuali
operazioni di ripristino. Il capitolo~\ref{cha:repository-remoti} è dedicato
alla gestione di un \emph{repository} remoto, utile per la collaborazione con
altre persone su un comune progetto. Infine il
capitolo~\ref{cha:riepilogo-comandi} presenta un breve riepilogo schematico di
tutti i comandi introdotti nella guida.
Installando Git vengono fornite due interfacce grafiche (GUI), \texttt{git-gui}
e \texttt{gitk}, ma questa guida non si occuperà di descrivere l'uso di alcuna
interfaccia grafica. Tutti i comandi e i passaggi illustrati vanno eseguiti
tramite terminale. Chi non dovesse avere familiarità con la linea di comando
può leggere la guida di~\cite{giacomelli:console}. Spesso indicheremo i comandi
da eseguire nel seguente modo:
\begin{lstlisting}
~/progetto$ git log -4 -p -- main.tex
\end{lstlisting} %$
Il carattere \texttt{\$} rappresenta il \emph{prompt} del terminale, cioè
l'invito a inserire un nuovo comando. Ciò che si trova alla sinistra del
\emph{prompt} è il percorso della cartella in cui il comando viene eseguito. In
genere questo percorso è puramente esemplificativo e può essere ignorato. Tutto
ciò che si trova alla destra del \emph{prompt} è il comando vero e proprio che
dovrà essere eseguito dall'utente. Dunque, nell'esempio precedente il comando va
eseguito copiando, o riscrivendo, in un terminale \texttt{git log -4 -p -{}-
main.tex} e premendo il tasto Invio. Fra parentesi ad angolo \meta{\dots} sono
riportate le parti di un comando che non devono essere ricopiate così come sono
ma andranno sostituite dall'utente, come spiegato nella guida di volta in volta.
Per maggiori informazioni sui vari comandi Git illustrati, loro opzioni e
argomenti è possibile consultare la documentazione presene sul proprio computer
eseguendo il comando \texttt{man git-}\meta{azione} e sostituendo ad
\meta{azione} l'azione Git che si vuole approfondire. Così, per saperne di più
su \texttt{git commit} si dovrà eseguire \texttt{man git-commit}.
Non abbiamo esperienza né di Git né di \LaTeX{} su sistemi operativi non
Unix-like. Un minimo di compatibilità con altri sistemi è garantita dal fatto
che i comandi tipici della shell Unix sono evidenziati e commentati, in modo che
l'utente di altri sistemi operativi o abituato all'uso di GUI possa sostituirli
svolgendo altrimenti le medesime attività. I comandi di Git dovrebbero invece
restare i medesimi in ogni sistema operativo, per quanto anche in questo caso le
medesime attività possano essere svolte mediante GUI.
Non siamo esperti di informatica, ma troviamo bello far le cose, per quanto
possibile, con le nostre mani, sapere cosa fa la macchina e avere l'illusione
che nel rapporto quasi-simbiotico con il computer siamo noi a decidere.
I lettori possono contribuire a migliorare e ampliare le prossime versioni di
questa guida con le loro critiche e i loro suggerimenti contattando gli autori
oppure contribuendo direttamente al \emph{repository} presente all'indirizzo
\url{https://github.com/GuITeX/guidagit}.
\begin{flushright}
\begin{minipage}{0.6\textwidth}\centering
\textsc{Gli autori} \\[1.5ex]
\textsc{Mosè Giordano} \\
\texttt{giordano dot mose at libero dot it} \\[0.5ex]
\textsc{Pietro Giuffrida} \\
\texttt{pietro dot giuffri at gmail dot com} \\
\end{minipage}
\end{flushright}
\newpage
\tableofcontents
\mainmatter{}
\chapter{Introduzione ai VCS}
\label{cha:introduzione-vcs}
\section{Cos'è un VCS?}
\label{sec:cose-vcs}
Un \emph{version control system}, abbreviato in VCS, è un programma che permette
di tener traccia di tutte le modifiche e le evoluzioni effettuate nel corso
della stesura di un codice o di un qualsiasi progetto su supporto digitale.
Un software VCS permette di mantenere una copia del proprio codice sorgente, sia
in locale sia in remoto, senza incorrere in un eccessivo dispendio di energie e
senza deconcentrarsi eccessivamente dalla stesura del proprio testo. In linea
di principio un VCS permette di tenere sotto controllo qualsiasi documento, sia
esso una foto, un documento realizzati con programma di videoscrittura, un
foglio di calcolo, ecc\dots ma un VCS dà il meglio di sé con i file di testo
semplice, non formattato, poiché permette di vedere tutte le modifiche apportate
di volta in volta al file. Proprio per questo l'uso principale dei VCS è quello
di controllare lo sviluppo dei software. Anche il codice dei documenti \LaTeX{}
si scrive su file di testo semplice e quindi un software VCS è particolarmente
adatto a essere utilizzato in accoppiata con \LaTeX.
L'insieme dei file e cartelle facenti parte di un progetto controllato da un
VCS, comprendente tutta la cronologia delle modifiche, si chiama
\emph{repository}. L'operazione di registrazione di una modifica di uno o più
file all'interno \emph{repository} si chiama \emph{commit}.
I VCS si dividono in due grandi classi: \emph{sistemi centralizzati} e
\emph{sistemi distribuiti}. I VCS più vecchi sono di tipo centralizzato
(\emph{centralized version control system}, CVCS), cioè il \emph{repository}
principale si trova su un server remoto centrale a cui tutti gli utenti che
vogliono utilizzarlo devono fare riferimento. Con il passare del tempo ci si è
resi conto che questo meccanismo pone pesanti limiti, perché ogni operazione
legata al VCS (controllare la cronologia, registrare una modifica, ecc\dots)
deve necessariamente essere fatta in un momento in cui si dispone di una
connessione alla rete in cui si trova il server centrale. Inoltre questo
comporta dei tempi relativamente lunghi per alcune operazioni semplici e
frequenti a causa al fatto che è necessario inviare attraverso la rete la
richiesta di una certa operazione al server, il quale elabora la richiesta e
invia al richiedente la risposta nuovamente attraverso la rete. Quando negli
anni passati le connessioni a Internet non raggiungevano le velocità attuali era
spesso tedioso aspettare tanto tempo per ottenere l'output di queste operazioni.
Dunque in un CVCS si è completamente dipendenti dal server centrale che contiene
il \emph{repository} del progetto, con l'ulteriore conseguenza che se il server
remoto viene spento dal suo gestore o compromesso da malintenzionati tutto il
lavoro può essere perduto. Per questi e altri motivi si sono diffusi in seguito
i sistemi distribuiti (\emph{distributed version control system}, DVCS), nei
quali ogni utente del progetto ha una copia dell'intero \emph{repository} sul
proprio sistema e, se lo si desidera, è possibile inviare una copia del proprio
\emph{repository} su un server remoto per metterlo in condivisione con altre
persone. Un DVCS può quindi riprodurre il flusso di lavoro di un CVCS ma senza
avere i suoi aspetti negativi legati alle limitazioni di dover lavorare
necessariamente con l'unico server centrale.
Fra i più famosi CVCS ricordiamo Concurrent Versions System (abbreviato in CVS)
e Subversion (SVN), i DVCS più noti invece sono Bazaar (bzr), Git e Mercurial
(hg).
% Se tutto ciò non è sufficientemente convincente per usare un VCS si può vedere
% http://tug.org/pracjourn/2007-3/henningsen/henningsen.pdf e
% http://www.charlietanksley.net/philtex/using-a-version-control-system/
\section{Perché usare un VCS?}
\label{sec:perche-usare-vcs}
\begin{quoting}
Supponi che tu stia lavorando per tutta la notte su un documento importante,
come la tesi di laurea o un articolo. Il giorno dopo ti svegli e ti chiedi
come mai una scimmia abbia usato la tua tastiera per scrivere parole casuali
che non formano un discorso di senso compiuto. A questo punto un VCS ti
permetterà di ritornare all'ultima versione corretta del tuo documento.
\end{quoting}
Questo esempio, tratto da un commento da \textsf{h0b0} sul sito TeX Stack
Exchange,\footnote{\url{http://tex.stackexchange.com/questions/1118\#comment1442\_1118}.}
spiega abbastanza bene perché sia utile un VCS. Naturalmente i VCS non sono gli
unici software con funzioni simili. Anche i programmi di videoscrittura come
Libreoffice Writer o Microsoft Word hanno delle funzioni per registrare le
modifiche ai documenti, ma i VCS forniscono un controllo maggiore su quali
modifiche devono effettivamente essere registrate. I VCS offrono anche la
possibilità di aggiungere ai \emph{commit} un messaggio descrittivo, in modo da
poter rivedere successivamente la ragione dei cambiamenti apportati in passato.
A differenza della cronologia in Writer o Word, un VCS non è legato a uno
specifico editor di testo \LaTeX{}, anche se alcuni editor possono fornire una
migliore integrazione con i VCS rispetto ad altri.
I VCS possono essere usati per tenere una copia di backup dei propri documenti
\LaTeX. Il primo rozzo metodo che probabilmente molti hanno provato è quello di
creare copie del documento principale con nomi complicati e misteriosi del tipo
\filestyle{documento5.tex}, \filestyle{Copia di documento.tex},
\filestyle{documento\_20090524.tex}, \filestyle{documento-OK\_ieri.tex} e così
via. Quando la cartella di lavoro inizia ad affollarsi con decine di documenti
simili si capisce che districarsi in questa foresta di file è tutto meno che
elegante o utile. I software di backup oppure di \emph{file hosting} online
hanno esattamente questo stesso scopo, ma questi programmi generalmente creano
una nuova versione dei file ogni volta che viene salvata una modifica
nell'editor di testo, anche se la modifica consiste nell'aggiunta di un punto o
nella cancellazione di uno spazio superfluo. Come già detto, i VCS forniscono
un controllo migliore su cosa deve e cosa non deve essere monitorato e i
messaggi associati alle modifiche registrate nel VCS rendono la consultazione
della cronologia molto più significativa rispetto al solo elenco di date e orari
di modifiche.
Come già detto, i VCS permettono di inviare una copia della propria cartella di
lavoro, comprensiva di tutta la cronologia, a un \emph{repository} remoto.
Questo può essere l'unica postazione a cui diverse persone che lavorano su un
unico documento devono fare riferimento. Il lavoro di gruppo è dunque
notevolmente facilitato. Inoltre i DVCS permettono generalmente di impostare
più di un \emph{repository} remoto su cui copiare il proprio \emph{repository}
locale, creando quindi numerose copie differenti di backup. In realtà, sebbene
possa essere utile, è spesso scomodo avere più di uno o due \emph{repository}
remoti in quanto tutte le operazioni di sincronizzazione vanno ripetute per
ciascun \emph{repository}.
I VCS rendono semplice la condivisione di file su più computer. Chi lavora su
un documento dal computer fisso di casa, sul proprio laptop e sul computer del
lavoro potrà salvare il \emph{repository} su una penna USB o su un server in
remoto e lavorare su un unico progetto senza correre il rischio di fare
confusione fra differenti copie dei documenti.
Tutte le revisioni di un \emph{repository} in un VCS sono identificate con una
stringa numerica o alfanumerica, che permette di ritrovarle successivamente. È
possibile anche aggiungere un'etichetta (\emph{tag}) con un nome significativo a
una determinata versione del \emph{repository} per identificare una specifica
copia. Le etichette permettono di ritrovare quella particolare versione del
documento più facilmente rispetto all'uso della stringa identificativa standard.
Se per esempio si dà al proprio documento un numero di versione come quelli che
si assegnano ai software (cosa frequente per i pacchetti e le classi di \LaTeX{}
oppure per i manuali), l'etichetta potrebbe essere il numero di versione. Si
potrebbe anche etichettare la versione di un articolo che è stato inviato a una
rivista. Quando il revisore dell'articolo invia i commenti sull'articolo, che
nel frattempo è stato modificato, grazie alle etichette sarà facile ripescare la
copia dell'articolo a cui lui fa
riferimento;\footnote{Applicazione suggerita da \textsf{Andrew Stacey} su TeX
Stack Exchange: \url{http://tex.stackexchange.com/a/1124}.}
lo stesso si potrebbe fare per identificare la copia di un documento inviata a
un proprio amico.
Infine con il meccanismo del \emph{branching} è possibile mantenere delle
modifiche sperimentali parallelamente a una versione ``stabile''. In un
documento \LaTeX{} potrebbe trattarsi di una sezione che non si è sicuri si
voglia aggiungere al documento finale. Invece nel caso di un pacchetto o di una
classe \LaTeX{} il \emph{branching} permette di fare esperimenti \TeX{}nici
senza aver paura di perdere la versione stabile del file sulla quale si potrà
continuare a lavorare. Un altro possibile utilizzo dei branch è quello di
creare una copia del documento in cui andare a salvare solo alcune delle
modifiche compiute nella copia principale (\emph{cherry-picking}). Questo può
essere utile per i laureandi che vogliono avere una copia personale della
propria tesi differente da quella da consegnare al proprio relatore, per
assecondare, per esempio, le sue bizzarre richieste riguardanti i margini e
l'interlinea del documento.\footnote{Idea proposta da \textsf{yoda} su Stack
Overflow: \url{http://stackoverflow.com/a/6190412}.}
Riepilogando, un VCS richiede un certo, seppur minimo, lavoro da parte
dell'utente, ma l'utente è ripagato dall'avere il controllo totale di quello che
viene registrato, la possibilità di rivedere una cronologia commentata che
mostra anche le differenze fra ciascuna versione, la capacità di ripristinare in
ogni momento il progetto a una delle versioni precedenti se necessario,
l'opportunità di creare dei \emph{branch} per sperimentare sui propri file senza
alcun timore di perdere il lavoro precedente, la possibilità di condividere un
progetto in tempo reale su più postazioni e con più persone. Probabilmente un
software di \emph{file hosting} andrebbe ugualmente bene per file semplici, ma
un VCS offre un controllo non ancora raggiunto da quei programmi e spesso il
desiderio di avere l'ultima parola sul risultato finale è il motivo per il quale
un utente passa dai classici software di videoscrittura a \LaTeX{}.
\section{Git: the stupid content tracker}
\label{sec:git}
{\em\footnotesize Questo paragrafo è stato in parte tradotto da
\url{http://git-scm.com/book/ch1-3.html}.}
\vspace{0.5\baselineskip}
\noindent
Questa guida descrive in particolare uno dei più diffusi DVCS in circolazione,
sicuramente quello con la comunità più attiva: Git. Git è software libero
essendo rilasciato sotto licenza GPL ed è disponibile, oltre che nei
\emph{repository} delle varie distribuzioni GNU/Linux, all'indirizzo
\url{http://git-scm.com}. Git è stato creato da Linus Torvalds, inventore del
kernel Linux, perché aveva bisogno di un buon VCS per gestire lo sviluppo di
Linux.
Git permette di tenere traccia delle modifiche apportate a un progetto
registrando una copia dei file del progetto in un database. Sostanzialmente Git
scatta una foto dei file presenti nella cartella nel momento in cui si effettua
il \emph{commit}. Per essere efficiente, se un file non è stato modificato in
un \emph{commit} Git non lo memorizza nuovamente nel \emph{repository} ma crea
un semplice collegamento all'ultima versione precedentemente salvata di quello
stesso file.
Per controllare continuamente l'integrità dei dati Git utilizza un sistema,
detto \emph{checksum}, che associa a ogni stato di un progetto una sequenza di
bit che la identifica. Nella fattispecie Git utilizza l'algoritmo SHA-$1$ che
restituisce una stringa esadecimale detta \emph{hash} composta da $40$ caratteri
alfanumerici (numeri da \texttt{0} a \texttt{9} e lettere da \texttt{a} a
\texttt{f}) che può apparire così:
\begin{lstlisting}
43c5858e91a7090b834dd9f09ddfae1061901ee4
\end{lstlisting}
In questo modo è impossibile modificare un file del progetto senza che Git se ne
renda conto. Per fare riferimento a una particolare versione del progetto si
indica il corrispondente \emph{hash} oppure da una forma abbreviata dell'hash
costituita da un certo numero dei caratteri iniziali, per esempio i primi sette
oppure otto.
% Si può rifare questa figura anche con TikZ
\begin{figure}
\centering
\includegraphics{18333fig0106-tn}
\caption{Working directory, staging area e git directory. Immagine presa da:
\url{http://progit.org/book/ch1-3.html}.}
\end{figure}
Prima di iniziare a metterci al lavoro c'è un'ultima cosa da sapere su Git. I
file possono trovarsi in tre stati chiamati, in inglese, \emph{committed},
\emph{modified} e \emph{staged}. \emph{Commited} significa che il file è stato
salvato nel proprio database locale; \emph{modified} indica che il file è stato
modificato ma non ancora salvato nel database con un \emph{commit};
\emph{staged} significa che il file è stato modificato e la sua versione attuale
verrà salvata nel database con il \emph{commit} successivo, cioè è preparato per
essere aggiunto nella nuova revisione. Un progetto Git può quindi essere
suddiviso in tre sezioni principali: la \emph{git directory}, la
\emph{working directory} e la \emph{staging area}. La prima è dove Git conserva
i metadati e gli oggetti del database del proprio progetto. La
\emph{working directory} è, come dice il nome stesso, la ``cartella di lavoro'',
ossia una copia di una versione del progetto a nostra disposizione per l'uso e
la modifica dei file. L'ultima sezione, la \emph{staging area}, è un semplice
file, generalmente contenuto nella cartella Git, che conserva le informazioni su
ciò che dovrà entrare nel \emph{commit} successivo.
Con Git si lavora più o meno così:
\label{list:lavoro-git}
\begin{enumerate}
\item si modifica uno o più file presenti nella \emph{working directory};
\item si aggiunge un suo \emph{snapshot}, cioè una loro copia, nella
\emph{staging area};
\item si esegue un \emph{commit}, cioè l'operazione con la quale i file vengono
copiati così come sono presenti alla \emph{staging area} all'interno della Git
\emph{directory} in maniera definitiva. Al \emph{commit} viene associato
l'\emph{hash} che identifica univocamente la versione del progetto così
salvata.
\end{enumerate}
Se una particolare versione di un file si trova nella cartella git è considerato
\emph{committed}. Se è stato modificato e aggiunto alla \emph{staging area} esso
è detto \emph{staged}. Se è stato modificato da quando è stata aperta la cartella
di lavoro ma non ancora aggiunto alla \emph{staging area} allora il file è detto
\emph{modified}.
\chapter{Installare Git}
\label{cha:installare-git}
Gli utenti dei sistemi operativi Mac OS e Windows possono scaricare la versione
più recente di Git dal sito \url{http://git-scm.com}. Dopo aver terminato
l'installazione, si ha la possibilità di usare Git sia tramite interfaccia
grafica, sia tramite un shell o, per gli utenti Windows, nel più noto Prompt dei
Comandi. Altre GUI sono disponibili all'indirizzo
\url{http://git-scm.com/downloads/guis}.
Gli utenti di OS X potrebbero avere difficoltà nell'installare Git sul proprio
computer. Una nuova misura di sicurezza presente a partire dalla versione 10.8
potrebbe impedire di eseguire il programma di installazione in quanto non è
stato certificato da Apple. Per aggirare questo ostacolo si deve aprire
normalmente il file \textsc{DMG} scaricato e poi tenere premuto il tasto
\keys{\ctrlmac} mentre si fa click sull'icona del file con estensione
\texttt{.pkg}. In questo modo il programma di installazione di Git verrà
normalmente eseguito.
Gli utenti dei sistemi operativi GNU/Linux o altri sistemi Unix possono
compilare il codice sorgente di Git scaricabile all'indirizzo
\url{https://github.com/git/git} oppure installarlo usando il proprio gestore
pacchetti. Insieme a Git verranno installate le interfacce grafiche predefinite
\texttt{git-gui} e \texttt{gitk}. Ecco i comandi da utilizzare per installare
Git nelle principali distribuzioni: Debian/Ubuntu
\begin{lstlisting}
$ apt-get install git
\end{lstlisting}
Fedora
\begin{lstlisting}
$ yum install git
\end{lstlisting}
Gentoo
\begin{lstlisting}
$ emerge --ask --verbose dev-vcs/git
\end{lstlisting}
Arch Linux
\begin{lstlisting}
$ pacman -S git
\end{lstlisting}
FreeBSD
\begin{lstlisting}
$ cd /usr/ports/devel/git
$ make install
\end{lstlisting}
Solaris 11 Express
\begin{lstlisting}
$ pkg install developer/versioning/git
\end{lstlisting}
OpenBSD
\begin{lstlisting}
$ pkg_add git
\end{lstlisting}
\chapter{Git e \LaTeX}
\label{cha:git-latex}
Vogliamo sviluppare un documento con \LaTeX, utilizzando Git come VCS. Git non
funziona in modo particolarmente esotico. Si tratta semplicemente di creare una
directory, di posizionare in essa i nostri file \filestyle{.tex} e di dire a Git
di considerare tale directory come un \emph{repository}.
\section{Creazione e inizializzazione del \emph{repository}}
\label{sec:iniz-repo}
\begin{lstlisting}
~$ mkdir progetto
~$ cd progetto
~/progetto$ touch np_main.tex
~/progetto$ git init
~/progetto$ git add .
~/progetto$ git commit -am "Inizializzazione del nuovo progetto"
\end{lstlisting}
Vediamo con calma i singoli passaggi. I primi tre comandi servono
rispettivamente per creare la directory (\texttt{mkdir} \meta{nome directory}),
per spostarsi al suo interno (\texttt{cd} \meta{nome directory}) e per creare un
file vuoto chiamato \filestyle{np\_main.tex} (\texttt{touch} \meta{nome file}).
I passaggi successivi, eseguiti sempre dall'interno della cartella in cui si
troverà il progetto, sono quelli specifici di Git:
\begin{itemize}
\item con \texttt{git init} si crea un nuovo \emph{repository} vuoto, cioè
essenzialmente la cartella nascosta chiamata \filestyle{.git/} che conterrà
l'intero database. Questo comando va dato solo al momento della creazione di
un nuovo \emph{repository} e poi non sarà più necessario riutilizzarlo;
\item \texttt{git add .} aggiunge l'argomento (in questo caso `\filestyle{.}',
che è un'abbreviazione del percorso della cartella in cui siamo posizionati)
alla \emph{staging area} del \emph{repository} appena creato;
\item col comando \texttt{commit -am``}\meta{nota di versione}\texttt{''}
effettuiamo il commit che, come detto, salva una copia dei file contenuti
nella \emph{staging area} all'interno del database. Nella cronologia delle
modifiche, a questa operazione risulterà associato il messaggio \meta{nota di
versione}.
\end{itemize}
Così facendo saremo già pronti a lavorare con il nostro editor di fiducia sul
file \filestyle{.tex} appena creato.
Per continuare il lavoro sul nostro documento e registrare i suoi cambiamenti
dobbiamo eseguire le seguenti operazioni (il seguente elenco puntato deve essere
confrontato con quello presente nel paragrafo~\ref{sec:git} a
pagina~\pageref{list:lavoro-git}):
\begin{enumerate}
\item si modificano i file del codice sorgente presenti nella cartella con il
nostro editor di testo di fiducia, oppure se ne aggiungono di nuovi (per
esempio possono essere aggiunte nuove figure);
\item si aggiungono i file che vogliamo registrare nel successivo \emph{commit}
alla \emph{staging area} con il comando \texttt{git add} \meta{file}, dove al
posto di \meta{file} va sostituito l'elenco, separato da uno spazio, dei file
di interesse. Per maggiori informazioni sull'aggiunta di file a un progetto
Git vedi il paragrafo~\ref{sec:aggiungere-rimuovere-file};
\item si effettua un \emph{commit} con il comando \texttt{git commit}. A questo
punto si aprirà l'editor di testo predefinito di Git per l'inserimento del
messaggio del \emph{commit}. Vedi il
paragrafo~\ref{sec:configurazioni-basilari} per sapere come configurare
l'editor predefinito di Git e il paragrafo~\ref{sec:messaggi-commit} per
maggiori informazioni sui messaggi dei \emph{commit}.
\end{enumerate}
I punti 2 e 3 possono essere eseguiti insieme se si vogliono aggiungere alla
\emph{staging area} tutti i file che risultano \emph{modified} nella
\emph{working directory} utilizzando il comando \texttt{git commit -a}.
Prima di eseguire un \emph{commit} si possono modificare più file, se ne possono
aggiungere di nuovi o se ne possono cancellare altri. Nel \emph{commit} verranno
memorizzati tutti i cambiamenti presenti nella \emph{staging area} e solamente
quelli, cioè non verranno considerati i file modificati ma non preparati per la
nuova revisione.
\subsection{Messaggi dei \emph{commit}}
\label{sec:messaggi-commit}
In Git, a differenza di altri software VCS, è necessario specificare un
messaggio di \emph{commit} non vuoto. Se quando registriamo un nuovo
\emph{commit} con il comando \texttt{git commit} non specifichiamo un messaggio
con l'opzione \texttt{-m} si aprirà l'editor di testo associato per default a
Git in cui potremo scrivere il messaggio del \emph{commit}. Se si utilizza un
editor di testo per scrivere il messaggio di un \emph{commit} è possibile
inserire messaggi estesi su più righe. Generalmente si utilizza la seguente
convenzione:
\begin{itemize}
\item nella prima riga del messaggio, che non deve superare i 50 caratteri, si
inserisce una breve e riassuntiva descrizione del \emph{commit} che si sta
registrando. Il testo del messaggio in questo primo rigo può non essere
correttamente formattato, per esempio può essere assente la punteggiatura o un
corretto utilizzo dei caratteri maiuscoli;
\item si lascia la seconda riga vuota e a partire dalla terza si scrive un
paragrafo contenente una descrizione più dettagliata delle modifiche
apportate. Il testo di questo paragrafo deve utilizzare la punteggiatura
opportuna e i caratteri maiuscoli dove necessario. Anche le righe di questo
paragrafo non dovrebbero superare i 72 caratteri;
\item si possono inserire altri paragrafi per descrivere ulteriormente le
modifiche lasciando una riga vuota fra un paragrafo e il successivo e seguendo
le convenzioni illustrate nel punto precedente.
\end{itemize}
Nei messaggi il carattere \lstinline|#| viene interpretato come carattere di
commento e ha lo stesso utilizzo del carattere \lstinline[language=TeX]|%| in
\LaTeX, cioè tutto ciò che in una riga si trova alla destra del carattere
\lstinline|#| verrà ignorato. Si noti che all'apertura dell'editor di testo per
la modifica del messaggio sono presenti, alla fine del file, delle righe di
commento contenenti delle informazioni relative al \emph{commit} che si sta
registrando. Queste righe possono essere ignorate.
\section{Aggiungere e rimuovere file del progetto}
\label{sec:aggiungere-rimuovere-file}
Per controllare lo stato di un \emph{repository} Git esiste il comando
\texttt{git status}. Questo comando ci permette di monitorare costantemente la
situazione di tutti i file e fornisce spesso dei suggerimenti utili (in lingua
inglese) sulle operazioni che possono essere eseguite sui file. Se dopo aver
effettuato un \emph{commit} si sono modificati dei file, l'output di questo
comando sarà qualcosa di simile a ciò che segue
\begin{lstlisting}
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: TODO
# modified: git4latex.tex
#
no changes added to commit (use "git add" and/or "git commit -a")
\end{lstlisting}
In questo esempio nella \emph{working directory} sono presenti due file, tutti e
due \emph{modified} ma non \emph{staged}, come ben spiegato da Git. Nell'ultima
riga dell'output Git ci suggerisce anche come aggiungere i file alla
\emph{staging area}, cioè usando i già visti \texttt{git add} \meta{file} oppure
\texttt{git commit -a}. Se aggiungiamo il file \filestyle{git4latex.tex} alla
\emph{staging area} l'output di \texttt{git status} diventerà
\begin{lstlisting}
$ git add git4latex.tex
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: git4latex.tex
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: TODO
#
\end{lstlisting}
Adesso \texttt{git4latex.tex} compare nell'elenco dei file che faranno parte del
prossimo \emph{commit}. Ci viene anche suggerito come rimuovere un file dalla
\emph{staging area}, usando \texttt{git reset HEAD} \meta{file}, ma riprenderemo
questo discorso nel paragrafo~\ref{sec:annullare-modifiche-non-salvate}. Non è
necessario che tutti i file siano spostati nella \emph{staging area} prima di
effettuare un nuovo \emph{commit}, possiamo spostare solo quelli che vogliamo
registrare nella revisione successiva.
Se dopo aver spostato un file nella \emph{staging area} lo modifichiamo
nuovamente, questo apparirà sia nell'elenco dei file che faranno parte del nuovo
\emph{commit} sia in quello dei file \emph{modified} ma non \emph{staged}
\begin{lstlisting}
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: git4latex.tex
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: TODO
# modified: git4latex.tex
#
\end{lstlisting}
Succede questo perché Git non ricorda semplicemente l'elenco dei file che sono
pronti per entrare nella nuova revisione, ma memorizza nella \emph{staging area}
una copia del file così com'era al momento dell'esecuzione del comando
\texttt{git add} \meta{file}. Prima di effettuare il \emph{commit} quindi è
bene controllare che il file sia solo fra quelli \emph{to be committed} e non
anche fra i file \emph{not staged for commit}, per evitare di inserire nel
\emph{commit} un file alla versione sbagliata. Un metodo semplice per rimediare
a questo pericolo è quello di usare \texttt{git commit -a}, ma questo è
possibile solo se si vogliono aggiungere al \emph{commit} tutti i file che
risultano \emph{modified}.
Il comando \texttt{git add} permette di aggiungere al \emph{repository}
qualsiasi file presente nella \emph{working directory}, anche quelli non ancora
conosciuti da Git.\footnote{In effetti subito dopo aver creato il
\emph{repository} con \texttt{git init}, Git non conosceva nessun file, noi
glieli abbiamo presentati con \texttt{git add} \meta{file}.} Per esempio, se
abbiamo creato un file per la bibliografia, chiamato
\filestyle{bibliografia.bib}, del nostro documento la situazione sarà la
seguente
\begin{lstlisting}
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# bibliografia.bib
nothing added to commit but untracked files present (use "git add" to track)
\end{lstlisting} %$
I file \emph{untracked} sono quelli non ancora seguiti da Git poiché non ancora
conosciuti. Come avrete probabilmente già capito, e come suggerito anche
dall'output del comando, per rendere noto a Git il file dovremo usare
\texttt{git add bibliografia.bib}. Se avessimo provato a effettuare
direttamente un \emph{commit} con \texttt{git commit -a} avremmo ottenuto la
seguente risposta
\begin{lstlisting}
$ git commit -am "aggiungo bibliografia"
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# bibliografia.bib
nothing added to commit but untracked files present (use "git add" to track)
\end{lstlisting} %$
Git si sarebbe accorto della presenza del nuovo file, ma non lo avrebbe aggiunto
automaticamente al progetto. D'altra parte, se avesse rilevato delle modifiche
ai file precedentemente aggiunti al progetto, non si sarebbe nemmeno curato di
comunicarci che il nuovo file non è ancora stato aggiunto al progetto. Si
sarebbe infatti limitato a salvare le modifiche ai file che gli abbiamo
precedentemente detto di gestire. Solo con il comando \texttt{git status}
possiamo controllare con certezza lo stato di tutti i file del
\emph{repository}.
Oltre ad aggiungere file a un \emph{repository} è possibile, naturalmente, anche
rimuoverli. La sintassi è la seguente: \texttt{git rm} \meta{file}, in cui a
\meta{file} va sostituito, come al solito, l'elenco dei file che si vogliono
cancellare. Questo comando elimina il file dalla \emph{working directory} e
aggiunge la cancellazione del file alla \emph{staging area}, ma non crea un
nuovo \emph{commit} che dovrà quindi essere eseguito esplicitamente, senza però
aver bisogno di fare altro. Poiché la cancellazione è memorizzata nella
\emph{staging area}, per rimuovere l'eliminazione accidentale di un file, prima
di effettuare un \emph{commit}, eseguita con \texttt{git rm} \meta{file},
possiamo usare \texttt{git reset HEAD} \meta{file}. Adesso la modifica è
presente solo nella \emph{working directory} (cioè il file è assente dalla
cartella di lavoro), per ripristinarlo useremo \texttt{git checkout -{}-}
\meta{file}. Non c'è bisogno di ricordare a memoria tutte le operazioni per il
ripristino del file,\footnote{Queste operazioni dovrebbero risultare più chiare
dopo avere letto il paragrafo~\ref{sec:annullare-modifiche-non-salvate}.}
queste infatti sono suggerite dall'output di \texttt{git status}.
\begin{lstlisting}
$ git rm bibliografia.bib
rm 'bibliografia.bib'
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: bibliografia.bib
#
$ git reset HEAD bibliografia.bib
Unstaged changes after reset:
M bibliografia.bib
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: bibliografia.bib
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- bibliografia.bib
$ git status
# On branch master
nothing to commit (working directory clean)
\end{lstlisting}
\subsection{Ignorare file del progetto:
\texorpdfstring{\filestyle{.gitignore}}{.gitignore}}
\label{sec:ignorare-file}
Come ormai sappiamo bene, per aggiungere dei file alla \emph{staging area}
dobbiamo usare il comando \texttt{git add} \meta{file}, in cui a \meta{file}
andrà sostituito l'elenco dei file, separati da uno spazio, che si vogliono
includere nel \emph{commit} successivo. Si può scegliere di procedere in due
modi: aggiungere indiscriminatamente tutti i file della cartella corrente al
progetto che stiamo sviluppando; oppure aggiungere un singolo file. Nel primo
caso dovremmo ripetere il comando già usato in fase di inizializzazione:
\begin{lstlisting}
$ git add .
\end{lstlisting}
Nel secondo caso aggiungiamo un singolo file:
\begin{lstlisting}
$ git add np_secondary.tex
\end{lstlisting}
Per quanto possa sembrare eccessivo, io preferisco usare il secondo comando. Mi
accade con estrema frequenza di dover aggiungere dei file a un progetto, e
spesso sono fin troppo distratto da quel che sto scrivendo per occuparmi di quel
che Git si aspetta da me. L'aggiunta indiscriminata di ogni file nella
directory al \emph{repository} presenta però delle controindicazioni. La più
ovvia per chi lavora con \LaTeX{} è la seguente: nel corso dell'elaborazione di
un testo inevitabilmente si procederà alla generazione del documento in pdf a
partire dai sorgenti; \LaTeX{} provvederà quindi alla generazioni di una serie
di file ausiliari (\filestyle{.toc}, \filestyle{.out}, \dots), nonché di un
\textsc{pdf} più o meno inutile. Se eseguissimo il comando \texttt{git add .}
subito dopo una compilazione, evidentemente Git aggiungerebbe alla \emph{staging
area} anche i vari file di lavoro, dal pdf, ai file di log. Per ovviare a
questo inconveniente, e continuare pigramente a eseguire \texttt{git add .}, è
utile creare nella nostra directory di un file denominato
\filestyle{.gitignore} con il seguente contenuto:
\begin{lstlisting}
*.log
*.pdf
*.blg
*.bbl
*.aux
*-blx.bib
*.out
*~
\end{lstlisting}
Il metacarattere \texttt{*} rappresenta una qualsiasi sequenza di caratteri,
quindi, per esempio, \texttt{*.log} indica qualsiasi file che termini con
l'estensione \texttt{.log}. In un file \filestyle{.gitignore} si possono anche
inserire dei commenti con il carattere \lstinline|#|.
Mediante questo file, istruiamo Git a proposito di tutti i file che non fanno
effettivamente parte del progetto, pur essendo presenti nella cartella. Da
questo momento in poi Git si limiterà a ignorarli, il che ci permette di
eseguire prudenzialmente il comando \texttt{git add .} prima di ogni
\emph{commit}. Generalmente Git è usato per gestire solo il codice sorgente di
un progetto, sia esso un programma o un documento \LaTeX, quindi è buona norma
aggiungere all'elenco dei file ignorati tutti quei file, ausiliari o di output,
che vengono generati nella fase di compilazione, del programma o documento, ma
che non fanno parte del codice sorgente propriamente detto. Nel caso di un
documento \LaTeX{} saranno i file con estensione, per esempio, \filestyle{.log},
\filestyle{.aux}, \filestyle{.toc} (per i file ausiliari temporanei) e
\filestyle{.pdf} (per il file di output). L'aggiunta del \textsc{pdf} finale
comporterebbe un inutile duplicato nella cronologia dato che è già presente
l'intero codice sorgente. Inoltre Git è ottimizzato per lavorare con file di
testo semplice e non ha buone prestazioni se nel \emph{repository} sono presenti
file binari che sono modificati frequentemente, quindi la presenza del
\textsc{pdf} appesantisce notevolmente l'intero \emph{repository}. Se si vuole
distribuire il documento finale in formato \textsc{pdf} è preferibile caricarlo
su un apposito sito di \emph{file hosting}.\footnote{Alcuni siti, come
\url{https://bitbucket.org} e \url{http://sourceforge.net}, che offrono la
possibilità di ospitare \emph{repository} git remoti permettono inoltre di
caricare dei file esterni al \emph{repository} proprio come un classico sito
di \emph{file hosting}.}
Non è necessario, ma è preferibile aggiungere anche il file
\filestyle{.gitignore} al \emph{repository} in modo che tutti gli utenti che
condividono il progetto possano avere le stesse configurazioni e non debbano
crearsi ciascuno il proprio \filestyle{.gitignore} in locale.
\section{Consultare la cronologia}
\label{sec:consultare-cronologia}
In Git è possibile, naturalmente, consultare la cronologia dei \emph{commit}
registrati nel \emph{repository} in uso. Il comando da usare è \texttt{git
log}. L'output di questo comando, senza ulteriori opzioni, sarà qualcosa di
questo tipo
\begin{lstlisting}
commit 9e1691276ba70443c56c214a52088814a5f25ec5
Author: Pietro Giuffrida <pietro.giuffri@gmail.com>
Date: Sat Oct 2 19:32:12 2010 +0200
un po' di pulizia
commit 86ee0a0525dd759bb49308b58cf3e761471a04cd
Author: Pietro Giuffrida <pietro.giuffri@gmail.com>
Date: Sat Oct 2 19:31:24 2010 +0200
prime due sezioni
commit 43c5858e91a7090b834dd9f09ddfae1061901ee4
Author: Pietro Giuffrida <pietro.giuffri@gmail.com>
Date: Sat Oct 2 18:53:30 2010 +0200
Ho solo iniziato a lavorare
\end{lstlisting}
È possibile muoversi nella cronologia con i tasti freccia. Nella prima riga di
ogni revisione (che inizia con \texttt{commit}) è riportato l'\emph{hash} esteso
corrispondente, nella seconda l'autore (\texttt{Author}) del \emph{commit},
quindi la data di salvataggio (\texttt{Date}) e il messaggio descrittivo.
È possibile mostrare solo l'elenco degli ultimi $n$ \emph{commit} aggiungendo
l'opzione \texttt{-}\meta{n}. Dunque per mostrare solo l'ultimo \emph{commit}
possiamo usare il comando \texttt{git log -1}. Si può consultare la
cronologia relativa a uno o più specifici file e non all'intero
\emph{repository} passando come argomento del comando l'elenco dei file di
interesse, separati da uno spazio: \texttt{git log -{}-} \meta{file}. Se si
vuole visualizzare solo l'elenco degli ultimi \texttt{n} \emph{commit} relativi
a un determinato elenco di file si possono utilizzare contemporaneamente
l'opzione \texttt{-}\meta{n} e l'argomento \meta{file}. Per esempio il comando
\texttt{git log -3 -{}- main.tex capitolo2.tex} mostrerà gli ultimi tre
\emph{commit} che hanno modificato i file \filestyle{main.tex} e
\filestyle{capitolo2.tex}. Il doppio trattino \texttt{-{}-} serve per far
capire a Git che tutto ciò che segue è l'elenco dei file. In generale non è
obbligatorio utilizzarlo ma diventa necessario per evitare ambiguità nel caso in
cui ci siano rami o etichette con lo stesso nome del file.
Come abbiamo visto, in maniera predefinita \texttt{git log} mostra solo alcune
informazioni dei \emph{commit}. Per mostrare anche le modifiche apportate in
ciascun \emph{commit} nel formato \texttt{diff} si può utilizzare l'opzione
\texttt{-p}. Per esempio, l'esecuzione del comando \texttt{git log -1 -p} potrà
dare un output di questo tipo:
\begin{lstlisting}
commit 5a5f793b0780d2c3352239beca3fc8de432a71b9
Author: Paolino Paperino <paolino.paperino@example.org>
Date: Fri Oct 8 22:32:51 2010 +0200
rimuovo pacchetto `xcolor'
Ora che l'ambiente `lstlisting' non e' piu' colorato
non e' piu' necessario.
diff --git a/git4latex.tex b/git4latex.tex
index 74a1474..a84fb27 100644
--- a/git4latex.tex
+++ b/git4latex.tex
@@ -26,9 +26,6 @@
\usepackage[font=small,format=hang]{caption}
\usepackage{graphicx}
-\usepackage[dvipsnames, usenames]{xcolor}
-\definecolor{GY}{named}{GreenYellow} % SkyBlue
-
\usepackage{listings}
\usepackage{fourier}
\end{lstlisting}
Segnaliamo infine un'altra utile opzione che serve per mostrare come
informazioni del \emph{commit} solo l'\emph{hash} in formato breve e la prima
riga del messaggio. Questa opzione si chiama \texttt{-{}-oneline} ed è utile se
si vuole trovare rapidamente l'\emph{hash} di un \emph{commit} sfogliando le
prime righe dei messaggi di tutti i commit. Per esempio, il primo output di
\texttt{git log} riportato all'inizio di questo paragrafo, con l'opzione
\texttt{-{}-oneline} apparirebbe così:
\begin{lstlisting}
$ git log --oneline
9e16912 un po' di pulizia
86ee0a0 prime due sezioni
43c5858 Ho solo iniziato a lavorare
\end{lstlisting} %$
Per maggiori informazioni è possibile consultare la documentazione di
\texttt{git log} con il comando \texttt{man git-log}.
\section{Annullare e cambiare modifiche precedenti}
\label{sec:annullare-modifiche}
Ci sono vari modi per cambiare le modifiche effettuate in un \emph{repository}
Git, ma per scegliere quella adatta bisogna sapere che tipo di modifica si
desidera annullare. In questo paragrafo presenteremo alcune delle situazioni più
frequenti che si possono incontrare.
\subsection{Annullare modifiche non ancora salvate}
\label{sec:annullare-modifiche-non-salvate}
Se si vogliono annullare tutte le modifiche effettuate a dei file ma non ancora
registrate in un \emph{commit} si può usare il comando
\begin{lstlisting}
$ git reset --hard HEAD
\end{lstlisting} %$
In questo modo l'intera \emph{working directory} viene ripristinata alla stato
corrispondente all'ultimo \emph{commit} della cronologia, indicato con
\texttt{HEAD}.
Se si vogliono riportare allo stato dell'ultimo \emph{commit} registrato solo
determinati file che sono \emph{modified} ma non ancora \emph{staged}, adottando
la terminologia vista all'inizio, senza toccare la restante
\emph{working directory} si può utilizzare il comando
\begin{lstlisting}
$ git checkout -- £\meta{file}£
\end{lstlisting} %$
in cui a \meta{file} va sostituito l'elenco dei file, separati da uno spazio,
che si vogliono ripristinare. Le opzioni e gli argomenti che il comando
\texttt{git commit} può accettare sono numerosi e le operazioni che verranno
eseguite possono essere diverse a seconda delle istruzioni fornite (ma non è
scopo della presente guida spiegare nei dettagli il completo funzionamento di
Git), il doppio trattino \texttt{-{}-} serve per far capire a Git, senza
possibilità di ambiguità, che tutto ciò che si trova dopo è l'elenco dei file e
l'operazione da eseguire è quella qui descritta. Il doppio trattino può essere
omesso se non ci sono possibili ambiguità, per esempio se il file da passare
come argomento non ha lo stesso nome di uno dei \emph{branch} (vedi
paragrafo~\ref{sec:branch}) del \emph{repository}. Il comando \texttt{git
checkout -{}-} \meta{file} può anche essere usato per ripristinare file
accidentalmente cancellati prima effettuare un nuovo \emph{commit}. In questo
caso l'uso del doppio trattino è necessario dal momento che il file cancellato
non si trova nella \emph{working directory} e Git non capirebbe che \meta{file}
è con certezza un elenco di file cancellati. Altri modi per ripristinare file
cancellati saranno visti nel paragrafo~\ref{sec:ripristinare-file}.
Se invece si vogliono solo togliere uno o più file dalla \emph{staging area} ma
lasciare intatta la \emph{working directory} si può usare il comando
\begin{lstlisting}
$ git reset HEAD £\meta{file}£
\end{lstlisting} %$
Come al solito, a \meta{file} va sostituito l'elenco dei file di interesse,
separati da uno spazio. I file tolti dalla \emph{staging area} possono poi
anche essere ripristinati allo stato del \emph{commit} precedente usando il
comando \texttt{git checkout -{}-} \meta{file} illustrato qui sopra.