Git for Dummies




                  a cura di Claudio Mignanti
                       Copyright CC-BY-SA
In{troduzione,stallazione}

 Git è un sistema software di controllo versione
 distribuito, direttamente utilizzabile da riga di
 comando.
 Git è un termine gergale britannico per indicare una persona stupida
 o sgradevole, a causa della difficoltà di utilizzo delle prime versioni, il
 programma è stato definito "il sistema di controllo versione progettato
 per farti sentire più stupido di quanto tu non sia".


 Installazione su debian based:
 apt-get install git-core gitk git-gui
Lista dei comandi essenziali

   git init
   git config
   git status, git commit
   gitk
   git branch
   git merge
   git cherry-pick, git rebase
   git {push,pull,fetch}
   git remote, git clone
GIT INIT

 Git si presenta come un sistema distribuito,
 ogni copia del repository git rappresenta una
 copia completa e indistinguibile. NON è
 un'architettura client-server!
 $ mkdir /tmp/test; cd /tmp/test
 $ git init
 Initialized empty Git repository in
 /tmp/test/.git/

 La cartella /tmp/test contiene un nuovo git
 repository
GIT CONFIG


 Configurare la mail e il nome con cui firmerete i
 commit.

 git config user.name "Gatto Silvestro"
 git config user.email gatto.s@cartoon.com
GIT STATUS, GIT COMMIT

 $ touch newfile
 $ git status
 # Untracked files: ...
 # newfile
 $ git add newfile
 $ git commit --message="aggiungo newfile"
 [master (root-commit) 7e6c98e] aggiungo
 newfile
 TODO: provare le stesse cose
 usando $ git gui
GITK
                           Storia del repository
  $ gitk –all



 Commit selezionato




ID sha1 del commit
selezionato




Modifiche e commenti del
Commit in questione
GIT BRANCH

      $ git checkout 5d53347a5 -b wip #creo branch wip
      un po di commit sia su master che su wip e
      ottengo...
Branch wip (attivo in grassetto) con due commit nuovi
                                                        Branch master con un nuovo commit
Commit attivo in giallo



       Il file pluto esiste su
       branch wip ma non su master

       Pippo esiste su master ma non su wip


      Con $ git branch <nome> seleziono il branch su
      cui lavorare
GIT MERGE

 Per unire le modifiche di due branch diversi uso
 merge
 $ git checkout master
 $ git merge wip
 Merge made by recursive.
 pluto |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 pluto
GIT REBASE, GIT CHERRY-PICK

 Supponiamo di voler prelevare UN commit da
 un branch per metterlo in cima ad un'altro
 branch
 $ git checkout 7e6c98ed0 -b fork
 Switched to a new branch 'fork'
 $ git commit --message="aggiunto makefile"
 [fork 4768253] aggiunto makefile
 $ git checkout master
 Switched to branch 'master'
 $ git cherry-pick 4768253
GIT REBASE, GIT CHERRY-PICK

Prima del cherry-pick




                                      Una copia del commit
                                      iniziale è posta in cima
                                      al branch master.
                                      Il commit iniziale con
                                      hash 4768253 non è
                                            stato spostato
                                      ne i commit
                        successivi/precedenti (se ci
                        sono) sono entrati a far parte di
                        master (come nel merge)
GIT REBASE, GIT CHERRY-PICK
Con $ git rebase -i <sha id>
Possiamo riordinare, fondere, o eliminare commit
che sono tra il checkout attuale e <sha id>

$ git checkout master
$ git branch pre-rebase #salvo la situazione su nuovo branch
$ git rebase -i 5d53347a5
GIT REBASE, GIT CHERRY-PICK
Come prima cosa ho messo il makefile
Ho aggiunto pluto prima di pippo
riordinandoli
Ho ”fuso” 78a98d7 con aa044574 con
squash




                                       Prima del rebase erano
                                       4 commit in questo ordine
GIT REBASE, GIT CHERRY-PICK




             Come prima cosa ho messo il makefile
             Ho aggiunto pluto prima di pippo
             riordinandoli
             Ho ”fuso” 78a98d7 con aa044574 con
             squash
Mhhh

 Per essere un git for dummies si è complicato
                  abbastanza




                 Il tutto con solo 4 commit :)
GIT {PUSH, PULL, FETCH}

 Quando ci si vuole sincronizzare con un
 repository remoto si usano questi comandi.
 git push invia i cambiamanti locali in remoto.
 git fetch preleva i cambiamente remoti SENZA
 applicarli in locale (così puoi ispezzionarli...)
 git pull è come git fetch ma applica i
 cambiamenti remoti in locale
 Git è decentralizzato quindi ogni copia può
 essere vista come un repository remoto.
GIT REMOTE, GIT CLONE

 git remote ti permette di gestire i repository
 remoti.
 Es:
 git remote add test http://mysite.org/git/test
 git clone si può usare per clonare un repository
 remoto noto e configurare automaticamente i
 riferimenti remoti (senza usare git remote)
 Es:
 git clone http://mysite.org/git/test
Un caso reale
EOF




                 ?

                          Copyright CC-BY-SA
      Claudio Mignanti <c.mignanti gmail.com>

Git for dummies

  • 1.
    Git for Dummies a cura di Claudio Mignanti Copyright CC-BY-SA
  • 2.
    In{troduzione,stallazione} Git èun sistema software di controllo versione distribuito, direttamente utilizzabile da riga di comando. Git è un termine gergale britannico per indicare una persona stupida o sgradevole, a causa della difficoltà di utilizzo delle prime versioni, il programma è stato definito "il sistema di controllo versione progettato per farti sentire più stupido di quanto tu non sia". Installazione su debian based: apt-get install git-core gitk git-gui
  • 3.
    Lista dei comandiessenziali  git init  git config  git status, git commit  gitk  git branch  git merge  git cherry-pick, git rebase  git {push,pull,fetch}  git remote, git clone
  • 4.
    GIT INIT Gitsi presenta come un sistema distribuito, ogni copia del repository git rappresenta una copia completa e indistinguibile. NON è un'architettura client-server! $ mkdir /tmp/test; cd /tmp/test $ git init Initialized empty Git repository in /tmp/test/.git/ La cartella /tmp/test contiene un nuovo git repository
  • 5.
    GIT CONFIG Configurarela mail e il nome con cui firmerete i commit. git config user.name "Gatto Silvestro" git config user.email gatto.s@cartoon.com
  • 6.
    GIT STATUS, GITCOMMIT $ touch newfile $ git status # Untracked files: ... # newfile $ git add newfile $ git commit --message="aggiungo newfile" [master (root-commit) 7e6c98e] aggiungo newfile TODO: provare le stesse cose usando $ git gui
  • 7.
    GITK Storia del repository $ gitk –all Commit selezionato ID sha1 del commit selezionato Modifiche e commenti del Commit in questione
  • 8.
    GIT BRANCH $ git checkout 5d53347a5 -b wip #creo branch wip un po di commit sia su master che su wip e ottengo... Branch wip (attivo in grassetto) con due commit nuovi Branch master con un nuovo commit Commit attivo in giallo Il file pluto esiste su branch wip ma non su master Pippo esiste su master ma non su wip Con $ git branch <nome> seleziono il branch su cui lavorare
  • 9.
    GIT MERGE Perunire le modifiche di due branch diversi uso merge $ git checkout master $ git merge wip Merge made by recursive. pluto | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 pluto
  • 10.
    GIT REBASE, GITCHERRY-PICK Supponiamo di voler prelevare UN commit da un branch per metterlo in cima ad un'altro branch $ git checkout 7e6c98ed0 -b fork Switched to a new branch 'fork' $ git commit --message="aggiunto makefile" [fork 4768253] aggiunto makefile $ git checkout master Switched to branch 'master' $ git cherry-pick 4768253
  • 11.
    GIT REBASE, GITCHERRY-PICK Prima del cherry-pick Una copia del commit iniziale è posta in cima al branch master. Il commit iniziale con hash 4768253 non è stato spostato ne i commit successivi/precedenti (se ci sono) sono entrati a far parte di master (come nel merge)
  • 12.
    GIT REBASE, GITCHERRY-PICK Con $ git rebase -i <sha id> Possiamo riordinare, fondere, o eliminare commit che sono tra il checkout attuale e <sha id> $ git checkout master $ git branch pre-rebase #salvo la situazione su nuovo branch $ git rebase -i 5d53347a5
  • 13.
    GIT REBASE, GITCHERRY-PICK Come prima cosa ho messo il makefile Ho aggiunto pluto prima di pippo riordinandoli Ho ”fuso” 78a98d7 con aa044574 con squash Prima del rebase erano 4 commit in questo ordine
  • 14.
    GIT REBASE, GITCHERRY-PICK Come prima cosa ho messo il makefile Ho aggiunto pluto prima di pippo riordinandoli Ho ”fuso” 78a98d7 con aa044574 con squash
  • 15.
    Mhhh Per essereun git for dummies si è complicato abbastanza Il tutto con solo 4 commit :)
  • 16.
    GIT {PUSH, PULL,FETCH} Quando ci si vuole sincronizzare con un repository remoto si usano questi comandi. git push invia i cambiamanti locali in remoto. git fetch preleva i cambiamente remoti SENZA applicarli in locale (così puoi ispezzionarli...) git pull è come git fetch ma applica i cambiamenti remoti in locale Git è decentralizzato quindi ogni copia può essere vista come un repository remoto.
  • 17.
    GIT REMOTE, GITCLONE git remote ti permette di gestire i repository remoti. Es: git remote add test http://mysite.org/git/test git clone si può usare per clonare un repository remoto noto e configurare automaticamente i riferimenti remoti (senza usare git remote) Es: git clone http://mysite.org/git/test
  • 18.
  • 19.
    EOF ? Copyright CC-BY-SA Claudio Mignanti <c.mignanti gmail.com>