Git

Page last edited 406 giorni 20 ore fa
Da wiki.betaingegneria.it.

Sistema di versionamento Git[modifica]

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Fonte

Manuale rapido

Principali comandi[modifica]

init[modifica]

Inizializzazione di un repository. Si va nella cartella da versionare e si lancia

  $ git init

Git crea una cartella .git:

  marcob@js:/var/www/customer1/atmweb$ ll
  totale 176
  drwxr-xr-x 11 marcob   marcob   4096 lug  3 10:21 ./
  drwxrwxr-x 13 www-data www-data 4096 giu 20 16:26 ../
  drwxr-xr-x  2 marcob   marcob   4096 lug  3 09:41 css/
  -rw-r--r--  1 marcob   marcob   2027 lug  3 09:41 delete.php
  -rw-r--r--  1 marcob   marcob   4799 lug  3 10:08 download.php
  -rw-r--r--  1 marcob   marcob    493 lug  3 09:41 error_set.php
  -rw-r--r--  1 marcob   marcob    615 lug  3 09:41 files.php
  drwxrwxr-x  7 marcob   marcob   4096 lug  3 10:21 .git/
  drwxr-xr-x  2 marcob   marcob   4096 lug  3 09:41 helper/
  ...

add[modifica]

Ora voglio importare i file nel repository, ma non tutti: le copie di backup dell'editro non mi interessano (possono chiamarsi *.bak o *~) Si edita il file exclude marcob@js:atmweb/.git/info$ nano exclude

  # git ls-files --others --exclude-from=.git/info/exclude
  # Lines that start with '#' are comments.
  # For a project mostly in C, the following would be a good set of
  # exclude patterns (uncomment them if you want to use them):
  # *.[oa]
  *~
  *.bak
  smarty/cache/*
  smarty/templates_c/*

Ho aggiunto le quattro ultime righe. Altri esempi:

  # a comment - this is ignored
  # no .a files
  *.a
  # but do track lib.a, even though you're ignoring .a files above
  !lib.a
  # only ignore the root TODO file, not subdir/TODO
  /TODO
  # ignore all files in the build/ directory
  build/
  # ignore doc/notes.txt, but not doc/server/arch.txt
  doc/*.txt
  # ignore all .txt files in the doc/ directory
  doc/**/*.txt

Ora posso importare solo i file buoni (sono alla prima importazione per cui li importo tutti):

  $ git add \*

status[modifica]

cosa è successo?

  marcob@js:atmweb$ git status
  # On branch master
  #
  # Initial commit
  #
  # Untracked files:
  #   (use "git add <file>..." to include in what will be committed)
  #
  #     css/
  #     delete.php
  #     download.php
  #     error_set.php
  #     files.php
  #     helper/
  #     images/
  ...
  #     utility.php
  nothing added to commit but untracked files present (use "git add" to track)

ora il commit.

commit[modifica]

  $ git commit
  
  Importazione iniziale  <-- qui scrivo quello che voglio
  
  # Please enter the commit message for your changes. Lines starting

Una volta uscito dall'editor vedo questo interessante log a video:

  [master (root-commit) 559473f] Importazione iniziale
   Committer: Marco Barbato <marcob@js.bach.org>
  Your name and email address were configured automatically based
  on your username and hostname. Please check that they are accurate.
  You can suppress this message by setting them explicitly:
  
      git config --global user.name "Your Name"
      git config --global user.email you@example.com
  
  After doing this, you may fix the identity used for this commit with:
  
      git commit --amend --reset-author
  
   69 files changed, 7692 insertions(+)
   create mode 100644 costanti.php
   create mode 100644 css/calendar.css
   ... (seguono tutti i file "committati")

log[modifica]

La storia del repository (equivalente a history di hg)

  marcob@js:$ git log
  commit 626214d434d8895979bf3996245b550f96f10a2d
  Author: Marco Barbato <marcob@js.bach.org>
  Date:   Wed Jul 3 11:57:34 2013 +0200
  
      eliminate vecchie directory CVS
  
  commit d70f70a71b393297b4b99a97d3382e9c1a103985
  Author: Marco Barbato <marcob@js.bach.org>
  Date:   Wed Jul 3 11:55:36 2013 +0200
  
      Importazione iniziale 03/07/2013
  marcob@js:$

diff[modifica]

Git ci da la possibilità anche di vedere qual è la differenza tra i file modificati e l'ultima versione non staged. Il comenado è semplicemente

  $ git diff

che genera un output contenete le differenze di tutti i file modificati rispetto all'ultima versione committata:

   diff --git a/costanti.php b/costanti.php
   index 35e5850..e32a83a 100755
   --- a/costanti.php
   +++ b/costanti.php
   @@ -117,9 +117,11 @@ else
           if (!defined('LOCAL_ROOT'))
           {
                   define('LOCAL_ROOT',);
   +       }
           if (!defined('ROOT_KW'))
           {
                   define('ROOT_KW','root');
   +       }
           if (!defined('TEST_BANNER'))
           {
                   define('TEST_BANNER', );
   @@ -128,6 +130,7 @@ else
           if (!defined('SCHEDULER_HOST'))
   ...

e così via, secondo l'output tradizionale del comando Linux diff.

Tuttavia è anche possibile redirigere questo output su programmi visuali come meld (ovviamente verranno lanciate, una alla volta, tante istanze quantii sono i file nella coda dei modificati:

   $ git difftool -t meld

e si apre meld con la differenza tra la versione in lavorazione e quella confermata).

È possibile anche visualizzare le differenze per uno solo dei file:

   $ git difftool -t meld launch.php

esportare un repository in remoto[modifica]

Creare il repository locale...[modifica]

  marcob@js:$ mkdir /path/to/your/project  ---> crea la directory
  marcob@js:$ cd /path/to/your/project     ---> entra dentro la directory
  marcob@js:$ git init                     ---> crea il repository Git

... ed esportarlo in remoto[modifica]

  marcob@js:$ git remote add origin https://myuser@myremoterepo.com/myuser/project.git ---> crea il repository in remoto

Attenzione, due precisazioni:

1) origin è il nickname, l'alias per il repository remoto myremoterepo.com/myuser/; quando vogliamo collegarci o fare qualche operazione lo citiamo:

  $ git push origin master

per esempio istruisce il client git a spingere (push) sul repository remoto di nome origin il contenuto del branch master che è il branch predefinito che viene creato alla creazione del repository locale.

2) il comando precedente aggiunge in locale il repository remoto alla lista dei repository remoti (che potrebbero anche essere più di uno). Ma il repository remoto deve già esistere (io di solito lo creo da interfaccia web e poi lo collego con git remote add). Per vedere i repository remoti configurati nel presente progetto si lancia

  $ git remote show origin
   Password for 'https://myuser@myremoterepo.com': 
   * remote origin
     Fetch URL: https://myuser@myremoterepo.com/myuser/project
     Push  URL: https://myuser@myremoterepo.com/myuser/project
     branch HEAD: master
     Branch remoti:
        database tracked
        master   tracked
     Branch locali configurati per 'git pull':
        database merge con il remote database
        master   merge con il remote master
     Ref locali configurati per 'git push':
        database pushes to database (aggiornato)
        master   pushes to master   (aggiornato)

Se invece il repository locale esiste già?[modifica]

  marcob@js:$ cd /path/to/my/repo        ---> entra dentro la directory
  marcob@js:$ git remote add origin https://myuser@myremoterepo.com/myuser/project.git
  marcob@js:$ git push -u origin --all # pushes up the repo and its refs for the first time
  marcob@js:$ git push -u origin --tags # pushes up any tags
  Password for 'https://myuser@myremoterepo.com': 
  Total 0 (delta 0), reused 0 (delta 0)
  To myuser@myremoterepo.com/project
   * [new tag]         v1.0 -> v1.0
   * [new tag]         v1.1 -> v1.1
   * [new tag]         v1.2 -> v1.2
   * [new tag]         v1.3 -> v1.3
   * [new tag]         v1.4 -> v1.4
   * [new tag]         v1.4.1 -> v1.4.1
   * [new tag]         v1.4.2 -> v1.4.2
   * [new tag]         v1.5 -> v1.5
   * [new tag]         v1.5.1 -> v1.5.1
Attenzione!!![modifica]

Prima di effettuare un push non devono esserci modifiche pendenti! Occorre prima eseguire un commit e poi il push!

push[modifica]

Aggiorno un repository remoto. Una volta eseguito un commit in locale, occorre aggiornare anche la versione in remoto a mano. Come detto prima, un push deve essere preceduto da un commit.

  marcob@js:$ git push origin master
  Password for 'https://myuser@myremoterepo.com': 
  Counting objects: 16, done.
  Delta compression using up to 4 threads.
  Compressing objects: 100% (10/10), done.
  Writing objects: 100% (10/10), 2.34 KiB, done.
  Total 10 (delta 5), reused 0 (delta 0)
  To https://myuser@myremoterepo.com/myuser/myproject.git
     b92d960..538d960  master -> master
  marcob@js:$ 
  
  • origin è il repository remoto
  • master è il nome della ramificazione (branch) a cui ci riferiamo

Quindi il senso del comando è spingi nel server origin il ramo master

tag[modifica]

Creare un'etichetta con annotazione (tag) è facile.

  $ git tag -a v1.4 -m 'my version 1.4'
  $ git tag
  v0.1
  v1.3
  v1.4

Cancellare un tag[modifica]

  $ git tag -d <tag-string>

esempio

  $ git tag -d v1.1

archive[modifica]

Crea un tarball della directory che si vuole esportare. Portarsi prima dentro la directory:

  $ cd /var/www/myapp
  $ git archive -o latest.zip HEAD

così crea uno zip alla testa (l'ultimissima release)

  $ ls /var/www/myapp
  totale 360
  drwxrwxr-x  7 marcob   marcob     4096 set 24 10:49 ./
  drwxrwxr-x 22 www-data www-data   4096 ago  5 11:31 ../
  -rw-r--r--  1 marcob   marcob      535 set 23 12:23 const.php
  drwxrwxr-x  2 marcob   marcob     4096 set 23 17:48 css/
  -rw-r--r--  1 marcob   marcob     1771 set 23 12:23 edit.php
  drwxrwxr-x  8 marcob   marcob     4096 set 23 18:10 .git/
  -rw-rw-r--  1 marcob   marcob       61 ago  5 11:34 .gitignore
  drwxrwxr-x  2 marcob   marcob     4096 set 23 12:23 images/
  -rw-r--r--  1 marcob   marcob     2164 set 23 12:23 index.php
  -rw-rw-r--  1 marcob   marcob   265808 set 24 10:49 latest.zip

Push su bitbucket[modifica]

Set up your local directory

Set up Git on your machine if you haven't already.

  mkdir /path/to/your/project
  cd /path/to/your/project
  git init
  git remote add origin https://user@bitbucket.org/user/projectname.git

Create your first file, commit, and push

  echo "My Name" >> contributors.txt
  git add contributors.txt
  git commit -m 'Initial commit with contributors'
  git push -u origin master