Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Everyday Git. Usare Git per lo sviluppo embedde...

Everyday Git. Usare Git per lo sviluppo embedded - Luca Ottaviano

Avatar for Better Embedded

Better Embedded

September 24, 2012
Tweet

More Decks by Better Embedded

Other Decks in Technology

Transcript

  1. Chi sono • Luca Ottaviano • [email protected] • @lucaotta •

    Sviluppatore su sistemi embedded presso Develer • Qt certified developer • Sviluppatore Python Luca Ottaviano – [email protected]
  2. Sistemi di controllo revisione • Wikipedia: “il controllo versione è

    la gestione di versioni multiple di un insieme di informazioni” • Repository • Struttura dati che mantiene file, directory • Ogni cambiamento tracciato nella storia si chiama revisione (commit) • Working copy • Copia locale del repository ad una certa revisione Luca Ottaviano – [email protected]
  3. Operazioni principali • Checkout • Crea una working copy locale

    di un repository • Update • Aggiorna la working copy all'ultima versione sul repository • Revert • Riporta un file nella working copy alla versione del repository Luca Ottaviano – [email protected]
  4. Operazioni principali (2) • Commit • Salva i cambiamenti nel

    repository • Devono essere atomici, cioè implementare una sola funzionalità • Bisect • Ricerca binaria del commit errato a partire dall'ultima versione funzionante • Tutti i commit devono essere atomici • Codice sempre compilabile! Luca Ottaviano – [email protected]
  5. Sistemi di controllo versione popolari • CVS • Storia rappresentata

    come delta • Granularità al file • SVN • Storia rappresentata come delta • Granularità: directory • Checkout parziali • Sistemi centralizzati Luca Ottaviano – [email protected]
  6. Git: sistema di controllo versione distribuito • Distribuito: ogni client

    ha l'intera storia del progetto • Offline: tutte (o quasi) le operazioni non richiedono collegamento al server • Veloce: tutte le operazioni sono fatte in locale (eccetto gli update) • Ridondato: non c'è un singolo punto di fallimento • Sicuro: non si può modificare la storia senza che qualcuno se ne accorga • Bisect nativo Luca Ottaviano – [email protected]
  7. Git: operazioni principali • Checkout • Git clone • Update

    • Git pull • Commit • Git commit -a • Git push Luca Ottaviano – [email protected] git pull oppure git checkout git commit -a + git push L'operazione di revert si fa con git checkout
  8. Flusso di lavoro (1) • Lavora con snapshot della working

    copy • Salva lo stato della working copy e pochi altri metadati • I file non modificati sono riferimenti allo snapshot precedente Luca Ottaviano – [email protected]
  9. Flusso di lavoro (2) • Si fanno modifiche ai file

    • Si aggiungono i file alla staging area • Si effettua un commit • Stati di un file • Unstaged • Staged • Committed Luca Ottaviano – [email protected]
  10. Commit • Snapshot della working copy ad un certo istante

    + metadati (autore, messaggio, data) • Può avere zero, uno o due commit padri • Identificato da un hash di 40 byte (SHA-1) Luca Ottaviano – [email protected]
  11. Checkout • Riporta i file della working copy allo stato

    in cui erano quando è stato fatto il commit • Può aggiungere e rimuovere file • Non funziona se ci sono modifiche locali ai file • Sintassi: $ git checkout f5aa747586ec2 # Ritorna allo stato di testing­branch # (fra poco vediamo i branch) $ git checkout testing­branch Luca Ottaviano – [email protected]
  12. Branch • È un puntatore ad un commit • Il

    branch di default è 'master' • Il puntatore si sposta automaticamente in avanti quando si fa un commit Luca Ottaviano – [email protected]
  13. Repository remoti • Scaricare un repository remoto: git clone •

    Perchè 'clone'? • Questo aggiunge un 'remote', cioè un altro repository git • Il remote di default si chiama 'origin' $ git clone [email protected]:develersrl/bertos.git Cloning into bertos... remote: Counting objects: 35251, done. remote: Compressing objects: 100% (7106/7106), done. remote: Total 35251 (delta 27927), reused 35251 (delta 27927) Receiving objects: 100% (35251/35251), 7.89 MiB | 1.32 MiB/s, done. Resolving deltas: 100% (27927/27927), done. Luca Ottaviano – [email protected]
  14. Repository remoti (2) • I branch remoti sono in sola

    lettura • Per fare modifiche si deve creare un branch locale • Di default viene scaricato solo il branch 'master' • Altri branch vanno aggiunti a mano $ git branch ­a * master remotes/origin/master remotes/origin/testing $ git checkout ­t origin/testing Branch testing set up to track remote branch testing from origin. Switched to a new branch 'testing' Luca Ottaviano – [email protected]
  15. Come aggiornare la copia locale • git pull: riceve le

    modifiche dal repository remoto • In realtà fa fetch e merge • git push: invia le modifiche al repository remoto • Non funziona se il branch remoto è andato avanti Luca Ottaviano – [email protected]
  16. Git senza un server remoto # entro nella directory con

    i sorgenti di un progetto $ cd project $ git init . $ git commit ­a ­m “Primo commit” # Fatto! Adesso ho un repository git funzionante! # Faccio delle modifiche... $ vim bar.c # ...e salvo i cambiamenti $ git add bar.c $ git commit ­m “Fix bug” • Si può creare un repository locale per lavorare da soli • Utile per progetti personali, script etc. Luca Ottaviano – [email protected]
  17. Gestione dei branch # creare un branch $ git branch

    testing # creare e spostarsi sul branch $ git checkout ­b testing Luca Ottaviano – [email protected]
  18. Gestione dei branch (2) # modifica di un file $

    vim foo.c # commit $ git commit ­a ­m “Useful stuff” # qual è la situazione? Luca Ottaviano – [email protected]
  19. Gestione dei branch (4) # cosa succede se faccio un

    commit adesso? $ vim bar.c $ git commit ­a ­m “Other changes” Luca Ottaviano – [email protected]
  20. Merge • Unione di due branch, si crea un commit

    con due padri • Ricerca automatica del migliore antenato comune • (Eventuale) risoluzione dei conflitti Luca Ottaviano – [email protected]
  21. Come ricevere aggiornamenti (advanced) • git fetch origin: scarica i

    nuovi commit da origin • git merge origin/master: integra le modifiche nel nostro branch Luca Ottaviano – [email protected]
  22. Luca Ottaviano – [email protected] Come inviare i commit (advanced) •

    Il comando 'push' aggiorna i branch remoti • Non funziona se il branch remoto è andato avanti • Bisogna fare 'fetch' e 'merge' prima di riprovarci • Non si può distruggere il lavoro di altri • git push <repo> <mio_branch> • git push <repo> <mio_branch>:<branch_remoto>
  23. Let's Talk e-mail web office +39 055 3984627 (218) [email protected]

    www.develer.com twitter @lucaotta Credits Le immagini sono prese dal libro “Pro Git” http://git-scm.com/book