– Situazione –



– Situazione –

0 0


Git_and_Github

presentation about Git and GitHub for high school computer science students. (Language is Italian)

On Github fazo96 / Git_and_Github

fazo96.github.io/Git_and_Github

A cura di Enrico Fasoli

Situazione

Sviluppare un Software in gruppo

Come condividiamo il lavoro?

Chiavetta USB

  • non funziona in remoto
  • un utente alla volta

Email

  • richiede una connessione
  • problematico con file grandi

Cloud

  • richiede una connessione
  • non si capisce chi ha cambiato cosa
  • crea una dipendenza da un servizio esterno
  • Lento!

Ci vuole qualcosa di meglio

  • che funzioni offline
  • che permetta di viaggiare nel tempo
  • che registri l'autore di ogni modifica
  • che non dipenda da sistemi centralizzati

Esempi

  • Subversion (SVN)
  • Perforce
  • CVS

Ma perchè non scegliere il migliore?

  • creato per gestire lo sviluppo di Linux
  • completamente libero, decentralizzato, multipiattaforma, integrabile
  • indipendente dal trasporto: funziona online via email o server dedicati, o offline via chiavette USB
  • Git è semplice, non ha nemmeno un'interfaccia grafica
  • Git è però difficile da comprendere, perchè è molto potente

Installazione

Per Windows dal sito git-scm.como installando GitHub Desktop (consigliato)

Per Linux tramite il Package Manager

Per OSX tramite Homebrew

Concetti

Per capire meglio Git, partiamo da alcuni suoi concetti di base

Repository

Contiene tutti i dati relativi a un progetto

Ogni copia di un repository è un repository

Contiene la working directory e una cartella .git con tutti i dati di git

Working Directory

rappresenta la copia di lavoro dei file

In altre parole, sono i file che si trovano in questo momento nella cartella della repository e con cui state lavorando.

Tutti i dati di git sono salvati nella cartella nascosta .git del vostro repository

Commit

  • rappresenta una modifica ad una repository
  • contiene solo cosa è stato cambiato, e un riferimento al commit su cui va applicato
  • è anche una trasformazione applicata sul commit precedente
  • il primo commit di una repository si applica sul vuoto, dunque non ha riferimento al commit precedente

Remote

Copia di un repository, spesso remota

Git offre numerosi strumenti per interagire con essi

Branch

Puntatore a un commit

Sono usati per tenere traccia di diversi rami di sviluppo. Quello principale si chiama master di default e punta, per convenzione, all'ultimo commit.

HEAD

Puntatore a un commit speciale

Indica l'ultimo commit che è stato estratto nella W.D.

Esempio: quando dovete lavorare su un commit, lo estraete nella W.D. per farci delle modifiche. L'HEAD viene spostato per puntare al commit che avete estratto.

Gitignore

File speciale

il file .gitignore nella cartella di un repository specifica quali file e cartelle Git deve ignorare.

Esempio: se usate Netbeans, noterete che genera un sacco di file. La maggior parte di essi sono temporanei e non vanno tracciati usando git, altrimenti si crea solo disordine inutile.

Potete trovare esempi di gitignore già pronti su internet e adattarli

Comandi e Operazioni

Vediamo adesso quali sono i comandi più importanti.

Nota: su Linux, è sempre possibile consultare il manuale di un comando! Alternativamente, una ricerca su internet può aiutare molto!

Config

Cambia la configurazione globale o per repository

$ git config [--global] (nome) (valore)

Nota: è importante configurare il nome e la email

$ git config --global name "Enrico Fasoli"
$ git config --global email "enrico.fasoli1996@gmail.com"

Init

Crea un repository

$ git init

Partendo da una cartella di file esistenti (o vuota) viene creato un repository vuoto (senza commit)

Status

Informazioni sullo stato della working directory

$ git status

Vi informa su cosa succede nella W.D., sulla posizione dell'HEAD e altre informazioni.

  • Una W.D. sporca contiene delle modifiche non salvate in un commit
  • Mostra i file selezionati da includere nel prossimo commit

Checkout

Estrae un commit nella working directory

$ git checkout (riferimento...)

Permette di estrarre lo stato di una repository ad un certo commit nella W.D.

Può anche essere usato per creare nuovi branch

Attenzione: questa operazione sposta l'HEAD al riferimento che è stato estratto.

Add

Seleziona i file da aggiungere al prossimo commit

$ git add (file o cartelle...)

Permette di scegliere quali file o cartelle (o tutto usando il flag -A) aggiungere al prossimo commit

Attenzione: questa operazione sposta l'HEAD al riferimento che è stato estratto.

Diff

Mostra le differenze tra l'HEAD e la W.D.

$ git diff [argomenti]

Diff è un utilissimo comando che mostra cosa è stato cambiato tra l'HEAD e la W.D..

Può anche essere usato per vedere la differenza tra due riferimenti ad esempio tra due commit o due branch.

Commit

Crea un nuovo commit

$ git commit [-m "messaggio"]

Include i file selezionati con add in un nuovo commit, che si baserà sull'HEAD corrente.

Attenzione: questa operazione sposta l'HEAD al nuovo commit.

Log

Mostra un elenco di commit

$ git log [argomenti]

Partendo dall'HEAD, mostra la catena di commit su cui esso si basa. Tramite argomenti può essere configurato per mostrare altre informazioni in diverso formato.

Stash

Permette di salvare separatamente la W.D. per poi estrarla di nuovo in un secondo momento

$ git stash [apply/pop/drop/list/show]
  • git stash salva lo stato corrente e pulisce la W.D.
  • git stash list mostra la lista di stati salvati
  • git stash pop (stato) estrae l'ultimo stato salvato (o uno in particolare) in W.D. e lo elimina dagli stash
  • git stash apply (stato) come pop ma non elimina lo stato dagli stash

Tag

Aggiunge un'etichetta a un commit

$ git tag "etichetta"

Permette di etichettare un commit. Spesso usato per marcare la versione del software

  • Si può anche usare il comando per mostrare una lista di tag e gestirle
  • Si ricorda che un'etichetta è un riferimento valido a un commit

Concetti Avanzati

E operazioni associate

Per gli utenti esperti!

Merge

Include i commit di un branch nel branch corrente.

$ git merge [opzioni] (branch)

Questa operazione pericolosa può risultare in un Conflict

Rebase

Sposta la base del primo commit di un branch su un'altro commit

$ git rebase [opzioni] (branch/commit)

Questa operazione pericolosa può risultare in un Conflict

Conflict

Accade quando Git non può risolvere automaticamente un merge o rebase

Quando accade, git va in uno stato di conflitto e inserisce nella W.D. i file modificati per includere entrambe le versioni di ogni parte che causa un conflitto.

Il conflitto si risolve aggiustando manualmente i file e confermando le modifiche a git. Alternativamente si può annullare l'operazione che ha causato il conflitto.

Nota: in caso di conflitto, non andare nel panico e leggere attentamente l'output di git status!

Reset

Sposta il puntatore a un branch all'HEAD corrente

$ git reset --(hard|mixed|soft) [opzioni] (branch)

Questa operazione è pericolosa e può causare la perdita di commit!

Remote

Copie remote di un repository

Git supporta una serie di protocolli per comunicare con i remote

  • SSH, il più sicuro e veloce anche da scuola
  • HTTP(s), ottimo per copie in sola lettura
  • File System, ottimo per chiavette USB

Clone

Clona un repository remoto

$ git clone [URL...]

Permette di creare una copia locale completa di un repository remoto

Nota: aggiunge automaticamente un remote chiamato origin con l'URL dato

$ git clone https://github.com/utente/repo.git

Remote

Gestione dei remote

$ git remote (add|remove|rename|...) (nome) [URL...]

Permette di aggiungere, eliminare, modificare i remote di una repository

Nota: di solito il server principale viene chiamato origin

$ git remote add origin https://github.com/utente/repo.git
$ git remote rename origin github

Fetch

Controlla le differenze tra la copia locale e il remote dato

$ git fetch [-u] [remote] [riferimento]

Permette di controllare lo stato del remote

Push

Invia informazioni a un remote

$ git push [-u] [(remote) (riferimento)]

Permette di pushare un branch locale a un remote, aggiornandolo

Pull

Scarica informazioni dal branch remoto

$ git pull [-u] [(remote) (riferimento)]

Permette di aggiornare la copia locale dal remote dato

GitHub

E altri servizi di hosting per git

Ne esistono tanti

ma GitHub è il più usato

Alcuni possono essere installati su un vostro server

Servizi Aggiuntivi

Offerti da GitHub e parzialmente dalla competizione
  • Issue Tracking per il Project Management
  • Releases per rilasciare binari
  • GitHub Pages per hostare siti web statici
  • Funzioni Social
  • GitHub Student Developer Pack

Passiamo alla pratica

fazo96.github.io/Git_and_Github A cura di Enrico Fasoli