11429
Commento:
|
11463
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 152: | Linea 152: |
== Nuovo stato del progetto == Digitare:{{{ |
0. Visualizzare il nuovo status digitando:{{{ |
Linea 168: | Linea 165: |
}}} Dato che non sono stati modificati file pre-esistenti, ma creati di nuovi ('''Git''' sta mostrando le cartelle create), dobbiamo come nel caso precedente aggiungere a mano i file che ci servono.<<BR>> In questo caso pero', per i fini del progetto non serve aggiungere tutti i file. I file ''object'' infatti non servono, dato che vengono creati ogni volta dalla compilazione, così come l'eseguibile. Non ha senso metterli sotto configurazione, ed è anche dannoso (a lungo andare i file binari tengono ad ingrossare il repository).<<BR>>È possibile cancellarli a mano, ma andrebbe fatto ogni volta. Oppure potrebbero essere non aggiunti al repository, ma rimarrebbero sempre in mezzo. '''Git''' permette di '''filtrare''' i file che non vogliamo, utilizzando '''.gitignore'''. |
}}}Dato che non sono stati modificati file pre-esistenti, ma creati di nuovi ('''Git''' sta mostrando le cartelle create), dobbiamo come nel caso precedente aggiungere a mano i file che ci servono. In questo caso per i fini del progetto non serve aggiungere tutti i file. I file ''object'' infatti non servono, dato che vengono creati ogni volta dalla compilazione, così come l'eseguibile. Non ha senso metterli sotto configurazione ed è anche dannoso (a lungo andare i file binari aumenteranno le dimensioni del repository).<<BR>>È possibile cancellarli a mano, ma andrebbe fatto ogni volta. Oppure potrebbero essere non aggiunti al repository, ma rimarrebbero sempre in mezzo. '''Git''' permette di '''filtrare''' i file che non vogliamo, utilizzando '''.gitignore''' nel prossimo paragrafo. |
Linea 177: | Linea 173: |
Questo file permette di specificare quali file devono essere esclusi dal repository. E' un semplice file di testo con un pattern per riga. Deve essere creato nella root del repository, dove si trova `.git`. I pattern possono essere file o cartelle. Nel nostro caso escluderemo la cartella `bin` e i file oggetto `.o`. | Questo file permette di specificare quali file devono essere esclusi dal repository. È un semplice file di testo con un pattern per riga. Deve essere creato nella root del repository, dove si trova `.git`. I pattern possono essere file o cartelle. Nel nostro caso escluderemo la cartella `bin` e i file oggetto `.o`. |
Linea 200: | Linea 196: |
}}} | }}}in cui si vede come ora siano assenti i file inclusi in `.gitignore`. |
Linea 204: | Linea 200: |
Possiamo vedere come manchino adesso file e cartelle che abbiamo escluso, e si sia aggiunto {{{.gitignore}}} che e' un file come gli altri. Aggiungiamo tutto e committiamo. Per evitare di scrivere a mano ogni file, possiamo utilizzare "." per indicare tutti i files. {{{ |
0. Aggiungere e commitare tutti i file. Per evitare di scrivere a mano ogni file, è possibile utilizzare il simbolo "'''.'''" per indicarli tutti:{{{ |
Linea 208: | Linea 202: |
git commit -a -m "Aggiunti sorgenti e Makefile" | }}} 0. Eseguire il commit:{{{ git commit -a -m "Aggiunti sorgenti e Makefile" }}}verrà restituito il seguente output{{{ |
Problemi in questa pagina? Segnalali in questa discussione
Introduzione
Il comando commit è l'azione che nel software Git permette di aggiungere, rimuovere e modificare i file del repository. Nella seguente pagina viene mostrato come utilizzarlo e come monitorare lo stato del repository attraverso un esempio pratico.
Stato iniziale
Lo stato del repository e ulteriori informazioni sono consultabili tramite i comandi:
git status
git log
git lg (alias del comando log precedentemente creato)
Supponendo di aver creato il progetto gitproject come mostrato in precedenza e di essersi spostati al suo interno:
cd gitproject
Il comando:
git status
restituirà inizialmente le seguenti stringhe:
Sul branch master Commit iniziale nothing to commit (create/copy files and use "git add" to track)
Il comando dice che non c'è niente da committare perché non è stata eseguita nessuna modifica.
Il comando:
git lg
restituirà:
fatal: bad default revision 'HEAD'
Il comando da errore perché essendo il repository appena creato non esiste ancora un log.
Creazione primo file
Creare il primo file del progetto digitando:
echo Inizio progetto > README
Eseguire il comando:
git status
verrà restituito il messaggio:
Sul branch master Commit iniziale Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
Git avvisa che è presente un nuovo file nella cartella, ma che è nello stato untracked, ovvero che non viene tenuto in conto dal repository.
Aggiungere il file al repository
Il nuovo file deve essere aggiunto manualmente al repository attraverso il comando:
git add README
Eseguire quindi lo status:
git status
ottenendo:
Sul branch master Commit iniziale Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: README
Adesso il file si trova nello stato di stage, ovvero è pronto per essere committato all'interno del repository. In breve i file in stato stage sono quelli pronti per essere committati, le cui modifiche ovvero verranno salvate nel repository.
Effettuare il commit
Per applicare le modifiche fatte si utilizza il comando commit con i seguenti falg:
-a per committare tutti i files in stato stage;
-m per inserire il messaggio associato al commit che altrimenti verrebbe richiesto in una finestra interattiva.
Procedere quindi con il commit.
Digitare:
git commit -a -m "README aggiunto"
Si visualizzerà il messaggio:
[master (root-commit) 4510db0] README aggiunto 1 file changed, 1 insertion(+) create mode 100644 README
Controllare lo status:
git status
che restituirà:
Sul branch master nothing to commit, working directory clean
Lo stato è in clean, ovvero la nostra cartella adesso è allineata col repository (dato che si sono appena sincronizzati).
Controllo del log
Il controllo del log è possibile attraverso il comando standard git log, tuttavia viene qui mostrata l'utilità di aver creato l'alias git lg.
Controllare il log con il comando alias:
git lg
Si visualizzerà:
* e9ea39b (HEAD, master) - user : README aggiunto (30 seconds ago)
Il log contiene la lista dei commit. Avendo fatto solamente un commit abbiamo un'unica riga dove sono rappresentati:SHAID: ogni commit e' identificato da un checksum SHA. Questa e' una particolarità di Git che lo differenzia da molti altri prodotti simili. Semplificando si può dire che è un ID univoco per ogni commit che permette di distinguerlo dagli altri. L'ID è molto lungo ma in genere viene mostrata solo una piccola parte.
Branch: quando si crea un repository, viene creato un branch di default chiamato master. Qua viene scritto il nome del branch cui appartiene il commit. HEAD è un segnaposto che indica in che punto ci troviamo nel repository. Dato che abbiamo appena committato, HEAD coincide col nostro stato (verrà mostrato avanti a cosa serve).
Nome utente: il nome dell'utente che ha eseguito il commit. Collaborando con altri utenti verrà mostrato l'identificativo di ognuno.
Messaggio: è il messaggio scritto nel commit. In particolare è solo la prima riga nel caso in cui il messaggio sia composto da più righe.
Timestamp: mostra a quando risale il commit.
Controllare il log con comando standard:
git log
Il messaggio visualizzato:
commit e9ea39bb9e5d93584eb8af4cbe037622ff123ef8 Author: user <user@mail.com> Date: Thu Dec 4 14:39:46 2014 +0100 README aggiunto
Come è possibile immaginare, quando si hanno lunghi log il comando customizzato si rivela molto utile (oltre al fatto, come verrà mostrato, che rappresenta graficamente il branching).
Aggiunta di altri file
Vengono qui aggiunti ulteriori file al progetto come un file sorgente minimale ~/gitproject/src/main.cpp e un makefile ~/gitproject/Makefile.
Creazione file
Digitare i seguenti comandi (ogni blocco rappresenta un unico comando):
mkdir src
printf '#include <iostream>\nint main() {\n\tstd::cout << "Benvenuti su Git!" << std::endl;\n\treturn 0;\n}\n' > src/main.cpp
echo 'vpath %.cpp ./src'$'\n'$'\n''src = main.cpp'$'\n\n''objects = $(patsubst %.cpp,obj/%.o,$(src))'$'\n\n''$(objects): | obj'$'\n\n''obj:'$'\n\t''@mkdir -p $@'$'\n\n''obj/%.o : %.cpp'$'\n\t''@echo $<'$'\n\t''@$(CXX) $(CXXFLAGS) -c $< -o $@'$'\n\t''mkdir bin'$'\n\t''@$(CXX) $(LDFLAGS) -o bin/main $(objects)'$'\n\n''clean:'$'\n\t''rm -fr bin/ obj/'$'\n' > Makefile
Il comando:
ls -altr
dovrebbe riportare la seguente situazione:
total 24 drwxrwxr-x 20 user group 4096 Dec 4 14:37 .. -rw-rw-r-- 1 user group 16 Dec 4 14:38 README drwxrwxr-x 8 user group 4096 Dec 4 14:40 .git drwxrwxr-x 2 user group 4096 Dec 4 14:42 src -rw-rw-r-- 1 user group 258 Dec 4 14:42 Makefile drwxrwxr-x 4 user group 4096 Dec 4 14:42 .
Creare l'eseguibile digitando i comandi:
make
Il comando:
bin/main
dovrebbe restituire il messaggio:
Benvenuti su Git!
Visualizzare il nuovo status digitando:
git status
verrà visualizzato:
Sul branch master Untracked files: (use "git add <file>..." to include in what will be committed) Makefile bin/ obj/ src/ nothing added to commit but untracked files present (use "git add" to track)
Dato che non sono stati modificati file pre-esistenti, ma creati di nuovi (Git sta mostrando le cartelle create), dobbiamo come nel caso precedente aggiungere a mano i file che ci servono.
In questo caso per i fini del progetto non serve aggiungere tutti i file. I file object infatti non servono, dato che vengono creati ogni volta dalla compilazione, così come l'eseguibile. Non ha senso metterli sotto configurazione ed è anche dannoso (a lungo andare i file binari aumenteranno le dimensioni del repository).
È possibile cancellarli a mano, ma andrebbe fatto ogni volta. Oppure potrebbero essere non aggiunti al repository, ma rimarrebbero sempre in mezzo.
Git permette di filtrare i file che non vogliamo, utilizzando .gitignore nel prossimo paragrafo.
.gitignore
Questo file permette di specificare quali file devono essere esclusi dal repository. È un semplice file di testo con un pattern per riga. Deve essere creato nella root del repository, dove si trova .git. I pattern possono essere file o cartelle. Nel nostro caso escluderemo la cartella bin e i file oggetto .o.
Creare il file:
echo 'bin/'$'\n''*.o'$'\n' > .gitignore
Il comando:
cat .gitignore
dovrebbe restituire le seguenti stringhe:
bin/ *.o
Nella prima riga viene esclusa la cartella bin (per escludere cartelle occorre mettere / alla fine), e tutti i file con estensione .o.
Analizzare lo status:
git status
Risulterà:
Sul branch master Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore Makefile src/ nothing added to commit but untracked files present (use "git add" to track)
in cui si vede come ora siano assenti i file inclusi in .gitignore.
Modifiche al repository
Aggiungere e commitare tutti i file. Per evitare di scrivere a mano ogni file, è possibile utilizzare il simbolo "." per indicarli tutti:
git add .
Eseguire il commit:
git commit -a -m "Aggiunti sorgenti e Makefile"
verrà restituito il seguente output
[master e1e5a46] Aggiunti sorgenti e Makefile 3 files changed, 28 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 src/main.cpp
Vediamo a che punto sta il nostro repository adesso:
git status # On branch master nothing to commit (working directory clean) git lg * e1e5a46 (HEAD, master) - user : Aggiunti sorgenti e Makefile (25 seconds ago) * e9ea39b - user : README aggiunto (8 minutes ago)
Il contenuto della cartella e' sincronizzato col repository, ed e' stato aggiunto il commit fra i log.
Proviamo adesso a modificare un file gia' presente nel repository, mostrando la data nel messaggio:
sed -i "s/Benvenuti/`date`: Benvenuti/" src/main.cpp cat src/main #include <iostream> int main() { std::cout << "Thu Dec 4 14:48:20 CET 2014: Benvenuti su Git!" << std::endl; return 0; } make clean rm -fr bin/ obj/ make ./src/main.cpp mkdir bin bin/main Thu Dec 4 14:48:20 CET 2014: Benvenuti su Git!
Vediamo che e' successo nel frattempo:
git status # 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: src/main.cpp # no changes added to commit (use "git add" and/or "git commit -a")
Vediamo che il file src/main.cpp e' stato modificato, ma che le modifiche non sono ancora state registrate nel repository. Per farlo, occorre committare (evitiamo di parlare dello stash in questa fase) il file. I file modificati vengono committati col comando commit (il flag -a sta ad indicare tutti i file modificati):
git commit -a -m "Aggiunta data in stampa." [master 1412239] Aggiunta data in stampa. 1 file changed, 1 insertion(+), 1 deletion(-)
Vediamo lo stato del repository:
git status # On branch master nothing to commit (working directory clean) git lg * 1412239 (HEAD, master) - user : Aggiunta data in stampa. (15 seconds ago) * e1e5a46 - user : Aggiunti sorgenti e Makefile (3 minutes ago) * e9ea39b - user : README aggiunto (10 minutes ago)
Possiamo vedere che adesso il repository e' sincronizzato col contenuto della cartella, e che il commit con le modifiche e' stato aggiunto.