Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "Programmazione/Git/RepositoryRemoti"
Differenze tra le versioni 3 e 13 (in 10 versioni)
Versione 3 del 06/12/2014 13.47.13
Dimensione: 13515
Autore: jeremie2
Commento:
Versione 13 del 25/03/2026 10.52.47
Dimensione: 16581
Autore: ivantu
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 3: Linea 3:
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=590616"; rilasci="14.04")>> <<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=590616"; rilasci="24.04 22.04")>>
Linea 7: Linea 7:
In questa pagina vengono mostrati gli strumenti di '''Git''' che rendono possibile il lavoro di più persone ad un progetto. Per fare questo verrà simulata in locale una situazione analoga a quella in cui si utilizzi un repository remoto.

Per poter seguire la seguente guida si presuppone:
 * di aver creato il progetto '''gitproject''' come [[Programmazione/Git#creare|indicato]];
 * di aver elaborato il progetto come mostrato nelle pagine sul [[Programmazione/Git/Commit|Commit]] e sul [[Programmazione/Git/Branch|Branching]].

Verranno create nuovi repository ('''gitproject_2''', '''gitproject_3''', ecc..) che simuleranno repositori locali, mentre '''gitproject''' simulerà il repository remoto. Saranno quindi passati in rassegna i metodi di sincronizzazione.
In questa pagina vengono illustrati gli strumenti di '''Git''' che permettono la collaborazione di più persone a un medesimo progetto. Per facilitare la comprensione, viene simulata localmente una situazione analoga all'utilizzo di un repository remoto.

Per seguire questa guida è necessario:
 * aver [[Programmazione/Git#Creazione_repository|creato il progetto]] '''gitproject''' come indicato nella pagina principale;
 * aver [[Programmazione/Git/Commit|elaborato il progetto]] e [[Programmazione/Git/Branch|gestito le strutture]] del repository.

Verranno create nuove directory ('''gitproject_2''', '''gitproject_3''', ecc.) per simulare i repository locali dei collaboratori, mentre la directory '''gitproject''' originale fungerà da repository remoto centrale.
Linea 17: Linea 17:
In questo esempio verrà creato il progetto locale '''gitproject_2''' sul quale verrà '''clonato''' il repository "remoto" '''gitproject'''.

 0. Creare una nuova cartella in cui vogliamo creare il nuovo repository e spostarsi all'interno:{{{
mkdir ~/gitproject_2
cd ~/gitproject_2
}}}
 0. Clonare il repository '''gitproject''' nella cartella corrente "'''.'''":{{{
git clone ~/gitproject .
}}}Il comando sarebbe stato del tutto analogo anche se '''gitproject''' si fosse trovato su di un server esterno al proprio pc.
 0. Consultare il log:{{{
git lg
}}}che restituirà:{{{
* f61b2e2 (HEAD, origin/master, origin/HEAD, master) - user : Merge branch 'gp-1' (4 minutes ago)
|\
| * d8b610a (origin/gp-1) - user : Modificato codice per issue gp-1. (11 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (6 minutes ago)
|/
* 1412239 - user : Aggiunta data in stampa. (15 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (18 minutes ago)
* e9ea39b - user : README aggiunto (25 minutes ago)
}}}Il log è '''quasi''' uguale a quello [[Programmazione/Git/Branch#log_master|originale]]. Si nota la presenza di altri branch:
In questo esempio viene creato il progetto locale '''gitproject_2''' clonando il repository "remoto" '''gitproject'''.

 0. [[AmministrazioneSistema/ComandiBase#mkdir|Creare]] una nuova directory nella propria '''Home''', digitando nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
 mkdir ~/gitproject_2
 }}}spostarsi al suo interno:{{{
 cd ~/gitproject_2
 }}}
 0. Clonare il repository '''gitproject''' nella directory corrente (indicata dal punto "'''.'''"), digitando nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
 git clone ~/gitproject .
 }}}
 {{{#!wiki note
 La procedura è identica anche nel caso in cui il repository si trovi su un server esterno (tramite protocolli SSH o HTTPS).
 }}}
 0. [[Programmazione/Git#Visualizzazione_della_cronologia|Analizzare]] lo stato dei riferimenti remoti `git lg`. L'output mostrerà i branch remoti contrassegnati dal prefisso '''origin/''':{{{
  * b92d7ff (HEAD -> master, origin/master, origin/HEAD) - Mario Rossi : Merge branch 'gp-1' (18 minuti fa)
  |\
  | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (29 minuti fa)
  * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (22 minuti fa)
  |/
  * 5b235ad - Mario Rossi : Aggiunta data in stampa. (52 minuti fa)
  * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (59 minuti fa)
  * ba12845 - Mario Rossi : README aggiunto (85 minuti fa)
 }}}Il log è '''quasi''' uguale a quello [[Programmazione/Git/Branch#log_master|originale]]. Si nota la presenza di altri branch:
Linea 43: Linea 45:
git remote
}}}che restituirà:{{{
origin
}}}Allo stato attuale ne risulta uno solo, quello clonato.

 ||<tablestyle="text-align: justify; width:100%;" style="border:none;" 5%><<Immagine(Icone/Piccole/note.png,,center)>> ||<style="padding:0.5em; border:none;">'''''Git''' puo avere più repository remoti associati al repository locale. Questo permette molta flessibilità, ma al momento verrà ignorato questo aspetto.'' ||
 git remote
 }}}che restituirà:{{{
 origin
 }}}Allo stato attuale ne risulta uno solo, quello clonato.
 {{{#!wiki note
 Un repository locale può essere collegato a più repository remoti contemporaneamente, garantendo elevata flessibilità nei flussi di lavoro distribuiti.
 }}}
Linea 58: Linea 61:
In questo esempio verrà creato il progetto "locale" '''gitproject_3''' nel quale verrà inizializzato il repository e in un secondo momento sarà sincronizzato manualmente con il repository "remoto" '''gitproject'''.

Il secondo metodo consiste nell'aggiungere manualmente il repository remoto a quello attuale.

 0. Creare una nuova cartella in cui vogliamo creare il nuovo repository e spostarsi all'interno:{{{
mkdir ~/gitproject_3
cd ~/gitproject_3
In questo seguente esempio viene simulata la creazione di un progetto "locale" '''gitproject_3''' inizializzato il repository da zero e successivamente collegato manualmente al repository "remoto" '''gitproject'''.

 0. [[AmministrazioneSistema/ComandiBase#mkdir|Creare]] la directory e [[AmministrazioneSistema/ComandiBase#cd|spostarsi]] all'interno:{{{
 mkdir ~/gitproject_3
 cd ~/gitproject_3
 }}}
 0. Inizializzare il repository:{{{
 git init
 }}}
 0. Tramite il comando '''remote add''' aggiungere il riferimento al repository remoto:{{{
 git remote add origin ~/gitproject
 }}}
 0. Attraverso il comando '''remote''' verificare la configurazione dei repository remoti:{{{
 git remote
 }}}che restituirà:{{{
 origin
 }}}
 0. [[Programmazione/Git#Visualizzazione_della_cronologia|Analizzare]] lo stato dei riferimenti remoti `git lg`. Il cui output sarà{{{
 fatal: bad default revision 'HEAD'
 }}}'''Il repository è vuoto!''' Questo perché è stato aggiunto il repository remoto, ma non è ancora stata fatta la sincronizzazione. Il comando:{{{
 ls -altr
 }}}mostra la seguente situazione dei file nella cartella:{{{
 totale 12
 drwxrwxr-x 3 mario mario 4096 feb 17 02:28 .
 drwxrwxr-x 7 mario mario 4096 feb 17 02:28 .git
 drwxr-x--- 29 mario mario 4096 feb 17 02:29 ..
 }}}
 {{{#!wiki note
 Consultando il log (git lg) verrà restituito un errore (''fatal: bad default revision HEAD'') poiché il repository è ancora vuoto: non è stata ancora eseguita la sincronizzazione dei dati.
 }}}

Per allineare il repository locale con quello remoto è possibile procedere in due modi.

== Primo metodo - Fetch + Merge ==

Il comando '''fetch''' permette di scaricare in locale le modifiche remote, ma '''NON''' di applicarle.

 0. Scaricare localmente le modifiche remote, diyare nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
 git fetch origin
 }}}L'output indicherà il recupero dei `branch master` e `gp-1` sotto forma di riferimenti remoti (`origin/master`, ecc.). Il comando restituirà:{{{
 remote: Enumerazione degli oggetti in corso: 23, fatto.
 remote: Conteggio degli oggetti in corso: 100% (23/23), fatto.
 remote: Compressione oggetti in corso: 100% (15/15), fatto.
 remote: 23 oggetti totali (7 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
 Decompressione degli oggetti in corso: 100% (23/23), 1.91 KiB | 325.00 KiB/s, fatto.
 Da /home/mario/gitproject
  * [nuovo branch] gp-1 -> origin/gp-1
  * [nuovo branch] master -> origin/master
 }}}
 0. Verificare lo stato della directory:
  * Il controllo dei file, digitando nel [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
  ls -altr
  }}}il cui output sarà:{{{
  totale 12
  drwxrwxr-x 3 mario mario 4096 feb 17 02:28 .
  drwxr-x--- 29 mario mario 4096 feb 17 02:29 ..
  drwxrwxr-x 8 mario mario 4096 feb 17 02:32 .git
  }}}ci conferma che nonostante siano state scaricate le modifiche remote, la cartella risulta essere ancora vuota, questo perchè le modifiche scaricate sono interne alla directory `.git` ma non è ancora stata eseguita del tutto la sincronizzazione.
 * [[Programmazione/Git#Visualizzazione_della_cronologia|Analizzare]] lo stato dei riferimenti remoti `git lg`. Il cui output è:{{{
   * b92d7ff (origin/master) - Mario Rossi : Merge branch 'gp-1' (31 minuti fa)
   |\
   | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (42 minuti fa)
   * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (35 minuti fa)
   |/
   * 5b235ad - Mario Rossi : Aggiunta data in stampa. (65 minuti fa)
   * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (71 minuti fa)
   * ba12845 - Mario Rossi : README aggiunto (2 ore fa)
  }}}ci sono i repository remoti, ma non quello locale su cui ci troviamo. E dato che in quello locale non è stato ancora fatto niente, la nostra directory e' vuota.
 0. Integrare le modifiche del branch remoto nel branch locale:{{{
 git merge origin/master
 }}}ora il branch locale `master` sarà allineato a `origin/master` e i file saranno presenti nella directory.
 0. [[Programmazione/Git#Visualizzazione_della_cronologia|Rianalizzare]] lo stato dei riferimenti remoti `git lg`. Il cui output ora sarà:{{{
  * b92d7ff (HEAD -> master, origin/master) - Mario Rossi : Merge branch 'gp-1' (32 minuti fa)
  |\
  | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (44 minuti fa)
  * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (36 minuti fa)
  |/
  * 5b235ad - Mario Rossi : Aggiunta data in stampa. (66 minuti fa)
  * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (73 minuti fa)
  * ba12845 - Mario Rossi : README aggiunto (2 ore fa)
 }}}Adesso i due branch sono allineati (puntano allo stesso commit). Se vediamo il contenuto della cartella:{{{
 ls -altr
 }}}possiamo vedere che e' aggiornato:{{{
 totale 32
 drwxrwxr-x 2 mario mario 4096 feb 17 02:36 src
 -rw-rw-r-- 1 mario mario 16 feb 17 02:36 README
 -rw-rw-r-- 1 mario mario 258 feb 17 02:36 Makefile
 -rw-rw-r-- 1 mario mario 10 feb 17 02:36 .gitignore
 drwxrwxr-x 8 mario mario 4096 feb 17 02:36 .git
 drwxrwxr-x 2 mario mario 4096 feb 17 02:36 doc
 drwxrwxr-x 5 mario mario 4096 feb 17 02:36 .
 drwxr-x--- 29 mario mario 4096 feb 17 02:36 ..
 }}}






== Secondo metodo - Pull ==

Più rapido risulta l'utilizzo del comando '''pull''' che racchiude in se il '''fetch''' e il '''merge''' ed è il comando solitamente utilizzato in questi casi. Verrà creato un nuovo repository '''gitproject_4''' che funga da progetto locale.

 0. Creare una nuova cartella per ospitare il repository '''gitproject_4''' e spostarsi all'interno:{{{
mkdir ~/gitproject_4
cd ~/gitproject_4
}}}
Linea 68: Linea 171:
 0. Tramite il comando '''remote add''' aggiungere il repository remoto:{{{  0. Aggiungere il repository remoto:{{{
Linea 71: Linea 174:
 0. Attraverso il comando '''remote''' elencare i repository remoti:{{{
git remote
}}}che restituirà:{{{
origin
 0. Quindi eseguire il '''pull''':{{{
git pull origin master
}}}che restituirà il seguente output:{{{
remote: Enumerazione degli oggetti in corso: 23, fatto.
remote: Conteggio degli oggetti in corso: 100% (23/23), fatto.
remote: Compressione oggetti in corso: 100% (15/15), fatto.
remote: 23 oggetti totali (7 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
Decompressione degli oggetti in corso: 100% (23/23), 1.91 KiB | 325.00 KiB/s, fatto.
Da /home/mario/gitproject
 * branch master -> FETCH_HEAD
 * [nuovo branch] master -> origin/master
}}}
 0. Verificare il log:{{{
git lg
}}}che risulta essere:{{{
* b92d7ff (HEAD -> master, origin/master) - Mario Rossi : Merge branch 'gp-1' (38 minuti fa)
|\
| * 05b43f8 - Mario Rossi : Modificato codice per issue gp-1. (49 minuti fa)
* | 158633d - Mario Rossi : Aggiunta cartella documentazione. (42 minuti fa)
|/
* 5b235ad - Mario Rossi : Aggiunta data in stampa. (72 minuti fa)
* b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (79 minuti fa)
* ba12845 - Mario Rossi : README aggiunto (2 ore fa)
}}}

È stato quindi creato un repository e sincronizzato il suo contenuto con un repository remoto.

= Pubblicazione modifiche locali =

Verranno qui effettuate delle modifiche nel repository locale '''gitproject_4'''.

 0. Modificare il file `~/gitproject_4/src/main.cpp`, digitando:{{{
sed -i '4 a \\tstd::cout << "Modifica da un altro repository" << std::endl;' src/main.cpp
}}}
 0. Verificare il contenuto del file: {{{
cat src/main.cpp
}}}che risulterà essere:{{{
#include <iostream>
int main() {
 std::cout << "sab 17 feb 2024, 01:26:54, CET: Benvenuti su Git!" << std::endl;
 std::cout << "Issue gp-1 implementata" << std::endl;
 std::cout << "Modifica da un altro repository" << std::endl;
 return 0;
}
}}}
 0. Applicare la modifica effettuando il commit:{{{
git commit -a -m "Aggiunta riga di output."
Linea 78: Linea 224:
}}}il cui output sarà{{{
fatal: bad default revision 'HEAD'
}}}'''Il repository è vuoto!''' Questo perché è stato aggiunto il repository remoto, ma non è ancora stata fatta la sincronizzazione. Il comando:{{{
ls -altr
}}}mostra la seguente situazione dei file nella cartella:{{{
drwxrwxr-x 22 user group 4096 Dec 4 15:06 ..
drwxrwxr-x 3 user group 4096 Dec 4 15:06 .
drwxrwxr-x 7 user group 4096 Dec 4 15:07 .git
}}}

Per poter sincronizzare il repository locale con quello remoto, occorre scaricare le modifiche. Questo viene fatto in due modi.

= Fetch e Pull =

Si vuole prendere il contenuto del repository remoto e sincronizzare quello locale, in maniera da poter prendere le modifiche remote. Il comando {{{fetch}}} permette di scaricare in locale le modifiche remote, ma '''NON''' di applicarle.

{{{
git fetch origin
remote: Counting objects: 23, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 23 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
From /home/user/gitproject
 * [new branch] gp-1 -> origin/gp-1
 * [new branch] master -> origin/master
}}}

Abbiamo scaricato le modifiche remote, ma se guardiamo il contenuto della cartella, risulta essere ancora vuota:

{{{
ls -altr
drwxrwxr-x 22 user group 4096 Dec 4 15:06 ..
drwxrwxr-x 3 user group 4096 Dec 4 15:06 .
drwxrwxr-x 7 user group 4096 Dec 4 15:09 .git
}}}

Questo perche' abbiamo scaricato le modifiche (che stanno dentro .git) ma non abbiamo ancora sincronizzato il tutto. Dal log possiamo vedere meglio quello che e' successo:

{{{
git lg
* f61b2e2 (origin/master) - user : Merge branch 'gp-1' (10 minutes ago)
}}}il cui output ora sarà:{{{
* c1648d4 (HEAD -> master) - Mario Rossi : Aggiunta riga di output. (11 secondi fa)
* b92d7ff (origin/master) - Mario Rossi : Merge branch 'gp-1' (41 minuti fa)
Linea 120: Linea 228:
| * d8b610a (origin/gp-1) - user : Modificato codice per issue gp-1. (17 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (12 minutes ago)
| * 05b43f8 - Mario Rossi : Modificato codice per issue gp-1. (52 minuti fa)
* | 158633d - Mario Rossi : Aggiunta cartella documentazione. (45 minuti fa)
Linea 123: Linea 231:
* 1412239 - user : Aggiunta data in stampa. (21 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (23 minutes ago)
* e9ea39b - user : README aggiunto (31 minutes ago)
}}}

Come possiamo vedere, ci sono i repository remoti, ma non quello locale su cui ci troviamo. E, dato che in quello locale non abbiamo ancora fatto niente, la nostra directory e' vuota.

Effettuamo allora il merge del branch locale con quello remoto, come abbiamo visto precedentemente, e vediamo che succede:

{{{
git merge origin/master
git lg
* f61b2e2 (HEAD, origin/master, master) - user : Merge branch 'gp-1' (11 minutes ago)
|\
| * d8b610a (origin/gp-1) - user : Modificato codice per issue gp-1. (18 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (13 minutes ago)
|/
* 1412239 - user : Aggiunta data in stampa. (22 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (24 minutes ago)
* e9ea39b - user : README aggiunto (32 minutes ago)
}}}

Come possiamo vedere, adesso i due branch sono allineati (puntano allo stesso commit). D'altronde, se vediamo il contenuto della cartella, possiamo vedere che e' aggiornato:

{{{
ls -altr
total 32
drwxrwxr-x 22 user group 4096 Dec 4 15:06 ..
drwxrwxr-x 2 user group 4096 Dec 4 15:11 src
-rw-rw-r-- 1 user group 16 Dec 4 15:11 README
-rw-rw-r-- 1 user group 258 Dec 4 15:11 Makefile
-rw-rw-r-- 1 user group 10 Dec 4 15:11 .gitignore
drwxrwxr-x 8 user group 4096 Dec 4 15:11 .git
drwxrwxr-x 2 user group 4096 Dec 4 15:11 doc
drwxrwxr-x 5 user group 4096 Dec 4 15:11 .
}}}

Potevamo eseguire il tutto con un unico comando, {{{pull}}}. Questo racchiude in se' il {{{fetch}}} ed il {{{merge}}}, ed e' il comando solitamente utilizzato in questi casi. Ricreiamo il repository e vediamo che succede col {{{pull}}} (in una nuova cartella vuota). Il comando {{{pull}}} richiede il nome del repository remoto e il branch di cui fare l'update:

{{{
mkdir /home/user/gitproject_4
cd /home/user/gitproject_4
git init
Initialized empty Git repository in /home/user/gitproject_4/.git/
git remote add origin /home/user/gitproject
git pull origin master
remote: Counting objects: 23, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 23 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
From /home/user/gitproject
 * branch master -> FETCH_HEAD
git lg
* f61b2e2 (HEAD, origin/master, master) - user : Merge branch 'gp-1' (15 minutes ago)
|\
| * d8b610a - user : Modificato codice per issue gp-1. (22 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (17 minutes ago)
|/
* 1412239 - user : Aggiunta data in stampa. (26 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (28 minutes ago)
* e9ea39b - user : README aggiunto (36 minutes ago)
}}}

Abbiamo quindi creato un repository, e sincronizzato il suo contenuto con un repository remoto.

= Pubblicazione modifiche locali =

Possiamo a questo punto effettuare delle modifiche nel nostro nuovo repository:

{{{
sed -i '4 a \\tstd::cout << "Modifica da un altro repository" << std::endl;' src/main.cpp
cat src/main.cpp
#include <iostream>
int main() {
    std::cout << "Thu Dec 4 14:48:20 CET 2014: Benvenuti su Git!" << std::endl;
    std::cout << "Issue gp-1 implementata" << std::endl;
    std::cout << "Modifica da un altro repository" << std::endl;
    return 0;
}
git commit -a -m "Aggiunta riga di output."
[master 0ed9a58] Aggiunta riga di output.
 1 file changed, 1 insertion(+)
git lg
* 0ed9a58 (HEAD, master) - user : Aggiunta riga di output. (15 seconds ago)
* f61b2e2 (origin/master) - user : Merge branch 'gp-1' (23 minutes ago)
|\
| * d8b610a (origin/gp-1) - user : Modificato codice per issue gp-1. (30 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (26 minutes ago)
|/
* 1412239 - user : Aggiunta data in stampa. (34 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (37 minutes ago)
* e9ea39b - user : README aggiunto (44 minutes ago)
}}}

Abbiamo creato un nuovo commit, e dal log possiamo vedere che i due branch master, quello locale e quello remoto, non sono piu' (ovviamente) allineati. Per inviare al repository remoto le mostre modifiche, occorre utilizzare il comando {{{push}}}, specificando sempre il repository remoto e i branch da voler sincronizzare:

{{{
* 5b235ad - Mario Rossi : Aggiunta data in stampa. (75 minuti fa)
* b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (82 minuti fa)
* ba12845 - Mario Rossi : README aggiunto (2 ore fa)
}}}È stato creato un nuovo commit e dal log possiamo vedere che i due branch master, quello locale e quello remoto, non sono più (ovviamente) allineati.

== Push ==

Per inviare le modifiche al repository remoto occorre utilizzare il comando '''push''', specificando sempre il repository remoto e i branch da voler sincronizzare. In questo modo verranno mandate le modifiche nel repository in modo tale che gli altri utenti, una volta sincronizzati con quello remoto, possano percepire le modifiche avvenute.

 0. Effettuare il '''push''':{{{
Linea 221: Linea 242:
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 395 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
}}}questo sarà l'output visualizzato:{{{
Enumerazione degli oggetti in corso: 7, fatto.
Conteggio degli oggetti in corso: 100% (7/7), fatto.
Compressione delta in corso, uso fino a 8 thread
Compressione oggetti in corso: 100% (3/3), fatto.
Scrittura degli oggetti in corso: 100% (4/4), 395 byte | 395.00 KiB/s, fatto.
4 oggetti totali (2 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
Linea 229: Linea 251:
}}}


A questo punto abbiamo mandato nel repository remoto le nostre modifiche, in modo tale che gli altri utenti del repository, una volta sincronizzati con quello remoto, possano percepire le nostre modifiche.

{{{{#!wiki note
'''Errore push'''

A questo punto si potrebbe ottenere il seguente messaggio di errore:

{{{
}}}Tuttavia si potrebbero visualizzare i seguenti '''messaggi di errore''':{{{
Linea 241: Linea 253:
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ../gitproject/
remote: error: Per impostazione predefinita, l'aggiornamento del branch corrente
remote: in un repository non spoglio è negato, perché renderebbe l'indice
remote: e l'albero di lavoro inconsistenti con i dati di cui si è eseguito
remote: il push e richiederebbe 'git reset --hard' per ripristinare la
remote: corrispondenza dell'albero di lavoro con HEAD.
remote:
remote: Puoi impostare la variabile di configurazione
remote: 'receive.denyCurrentBranch' a 'ignore' o 'warn' nel repository
remote: remoto per consentire il push nel branch corrente; ciò nonostante,
remote: questo non è raccomandato a meno che tu non provveda ad aggiornare
remote: il suo albero di lavoro in modo che corrisponda a ciò di cui hai
remote: eseguito il push in qualche altro modo.
remote:
remote: Per non visualizzare più questo messaggio e mantenere comunque
remote: il comportamento predefinito, imposta la variabile di
remote: configurazione 'receive.denyCurrentBranch' a 'refuse'.
To /home/mario/gitproject
Linea 256: Linea 271:
error: failed to push some refs to '/home/user/gitproject'
}}}

Questo perche' il nostro repository remoto non e' di tipo '''bare'''. Al momento ignoriamo questo avviso e, per poter effettuare il push, digitare il seguente comando:

{{{
error: push di alcuni riferimenti su '/home/mario/gitproject' non riuscito

}}}Questo perche' il nostro repository remoto non e' di tipo ''bare''. Al momento verrà ignorato questo avviso.

 0. Per poter ovviare al problema
digitare il seguente comando:{{{
Linea 264: Linea 278:

E poi rieseguire il push. Quando non e' piu' necessario settare lo stesso valore a '''refuse''':

{{{
 0. Effettuare nuovamente il push:{{{
git push origin master
}}}
 0
. Quando non è piu' necessario settare lo stesso valore a '''refuse''':{{{
Linea 269: Linea 283:
}}}

per ripristinare lo stato originale.
}}}}

Per essere sicuri di aver fatto tutto correttamente, andiamo ad uno dei repository creato in precedenza:

{{{
cd /home/user/gitproject_3
}}}

Ed effettuiamo il pull per risincronizzarci col server remoto, che a questo punto avra' le nostre modifiche:

{{{
}}}per ripristinare lo stato originale.

== Verifica ==

Verificare che tutto sia avvenuto nel modo corretto utilizzando un repository creato in precedenza.

 0. Spostarsi nella directory del repository '''gitproject_3''':{{{
cd ~/gitproject_3
}}}
 0. Effettuare il pull per risincronizzarsi col server remoto, sul quale sono state apportate le modifche sviluppate sul '''gitproject_4''':{{{
Linea 284: Linea 294:
From /home/user/gitproject }}}Verrà visualizzato il seguente output:{{{
remote: Enumerazione degli oggetti in corso: 7, fatto.
remote: Conteggio degli oggetti in corso: 100% (7/7), fatto.
remote: Compressione oggetti in corso: 100% (3/3), fatto.
remote: 4 oggetti totali (2 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
Decompressione degli oggetti in corso: 100% (4/4), 375 byte | 375.00 KiB/s, fatto.
Da /home/mario/gitproject
Linea 286: Linea 302:
Updating f61b2e2..0ed9a58    b92d7ff..c1648d4 master -> origin/master
Aggiornamento di b92d7ff..c1648d4
Linea 288: Linea 305:
 src/main.cpp |    1 +  src/main.cpp | 1 +
Linea 290: Linea 307:
}}}
 0. Controllare il log:{{{
Linea 291: Linea 310:
* 0ed9a58 (HEAD, origin/master, master) - user : Aggiunta riga di output. (4 minutes ago)
* f61b2e2 - user : Merge branch 'gp-1' (27 minutes ago)
}}}che risulta essere:{{{
* c1648d4 (HEAD -> master, origin/master) - Mario Rossi : Aggiunta riga di output. (9 minuti fa)
* b92d7ff - Mario Rossi : Merge branch 'gp-1' (50 minuti fa)
Linea 294: Linea 314:
| * d8b610a (origin/gp-1) - user : Modificato codice per issue gp-1. (34 minutes ago)
* | e4064d8 - user : Aggiunta cartella documentazione. (30 minutes ago)
| * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (61 minuti fa)
* | 158633d - Mario Rossi : Aggiunta cartella documentazione. (54 minuti fa)
Linea 297: Linea 317:
* 1412239 - user : Aggiunta data in stampa. (38 minutes ago)
* e1e5a46 - user : Aggiunti sorgenti e Makefile (41 minutes ago)
* e9ea39b - user : README aggiunto (48 minutes ago)
}}}
* 5b235ad - Mario Rossi : Aggiunta data in stampa. (84 minuti fa)
* b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (2 ore fa)
* ba12845 - Mario Rossi : README aggiunto (2 ore fa)
}}}I repository risultano allineati.


Guida verificata con Ubuntu: 22.04 24.04

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

In questa pagina vengono illustrati gli strumenti di Git che permettono la collaborazione di più persone a un medesimo progetto. Per facilitare la comprensione, viene simulata localmente una situazione analoga all'utilizzo di un repository remoto.

Per seguire questa guida è necessario:

Verranno create nuove directory (gitproject_2, gitproject_3, ecc.) per simulare i repository locali dei collaboratori, mentre la directory gitproject originale fungerà da repository remoto centrale.

Clonazione repository

In questo esempio viene creato il progetto locale gitproject_2 clonando il repository "remoto" gitproject.

  1. Creare una nuova directory nella propria Home, digitando nel terminale il seguente comando:

     mkdir ~/gitproject_2

    spostarsi al suo interno:

     cd ~/gitproject_2
  2. Clonare il repository gitproject nella directory corrente (indicata dal punto "."), digitando nel terminale il seguente comando:

     git clone ~/gitproject .
    • La procedura è identica anche nel caso in cui il repository si trovi su un server esterno (tramite protocolli SSH o HTTPS).
  3. Analizzare lo stato dei riferimenti remoti git lg. L'output mostrerà i branch remoti contrassegnati dal prefisso origin/:

      *   b92d7ff (HEAD -> master, origin/master, origin/HEAD) - Mario Rossi : Merge branch 'gp-1' (18 minuti fa)
      |\  
      | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (29 minuti fa)
      * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (22 minuti fa)
      |/  
      * 5b235ad - Mario Rossi : Aggiunta data in stampa. (52 minuti fa)
      * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (59 minuti fa)
      * ba12845 - Mario Rossi : README aggiunto (85 minuti fa)

    Il log è quasi uguale a quello originale. Si nota la presenza di altri branch:

    • origin/master

    • origin/HEAD

    • origin/gp-1

    Questi sono i branch del repository remoto, che sono materialmente quelli creati nel repository originale. origin è il nome di default che Git da a un repository remoto,.

  4. Attraverso il comando remote elencare i repository remoti:

     git remote

    che restituirà:

     origin
    Allo stato attuale ne risulta uno solo, quello clonato.
    • Un repository locale può essere collegato a più repository remoti contemporaneamente, garantendo elevata flessibilità nei flussi di lavoro distribuiti.
  5. Attraverso il comando branch elencare i branch:

    git branch

    che risulterà:

    * master

    solamente un branch locale, master, sincronizzato con il master remoto (più precisamente nel punto in cui punta HEAD remoto).

Sincronizzazione manuale

In questo seguente esempio viene simulata la creazione di un progetto "locale" gitproject_3 inizializzato il repository da zero e successivamente collegato manualmente al repository "remoto" gitproject.

  1. Creare la directory e spostarsi all'interno:

     mkdir ~/gitproject_3
     cd ~/gitproject_3
  2. Inizializzare il repository:

     git init
  3. Tramite il comando remote add aggiungere il riferimento al repository remoto:

     git remote add origin ~/gitproject
  4. Attraverso il comando remote verificare la configurazione dei repository remoti:

     git remote

    che restituirà:

     origin
  5. Analizzare lo stato dei riferimenti remoti git lg. Il cui output sarà

     fatal: bad default revision 'HEAD'

    Il repository è vuoto! Questo perché è stato aggiunto il repository remoto, ma non è ancora stata fatta la sincronizzazione. Il comando:

     ls -altr

    mostra la seguente situazione dei file nella cartella:

     totale 12
     drwxrwxr-x  3 mario mario 4096 feb 17 02:28 .
     drwxrwxr-x  7 mario mario 4096 feb 17 02:28 .git
     drwxr-x--- 29 mario mario 4096 feb 17 02:29 ..
    • Consultando il log (git lg) verrà restituito un errore (fatal: bad default revision HEAD) poiché il repository è ancora vuoto: non è stata ancora eseguita la sincronizzazione dei dati.

Per allineare il repository locale con quello remoto è possibile procedere in due modi.

Primo metodo - Fetch + Merge

Il comando fetch permette di scaricare in locale le modifiche remote, ma NON di applicarle.

  1. Scaricare localmente le modifiche remote, diyare nel terminale il seguente comando:

     git fetch origin

    L'output indicherà il recupero dei branch master e gp-1 sotto forma di riferimenti remoti (origin/master, ecc.). Il comando restituirà:

     remote: Enumerazione degli oggetti in corso: 23, fatto.
     remote: Conteggio degli oggetti in corso: 100% (23/23), fatto.
     remote: Compressione oggetti in corso: 100% (15/15), fatto.
     remote: 23 oggetti totali (7 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
     Decompressione degli oggetti in corso: 100% (23/23), 1.91 KiB | 325.00 KiB/s, fatto.
     Da /home/mario/gitproject
      * [nuovo branch]    gp-1       -> origin/gp-1
      * [nuovo branch]    master     -> origin/master
  2. Verificare lo stato della directory:
    • Il controllo dei file, digitando nel terminale il seguente comando:

        ls -altr

      il cui output sarà:

        totale 12
        drwxrwxr-x  3 mario mario 4096 feb 17 02:28 .
        drwxr-x--- 29 mario mario 4096 feb 17 02:29 ..
        drwxrwxr-x  8 mario mario 4096 feb 17 02:32 .git

      ci conferma che nonostante siano state scaricate le modifiche remote, la cartella risulta essere ancora vuota, questo perchè le modifiche scaricate sono interne alla directory .git ma non è ancora stata eseguita del tutto la sincronizzazione.

  3. Analizzare lo stato dei riferimenti remoti git lg. Il cui output è:

       *   b92d7ff (origin/master) - Mario Rossi : Merge branch 'gp-1' (31 minuti fa)
       |\  
       | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (42 minuti fa)
       * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (35 minuti fa)
       |/  
       * 5b235ad - Mario Rossi : Aggiunta data in stampa. (65 minuti fa)
       * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (71 minuti fa)
       * ba12845 - Mario Rossi : README aggiunto (2 ore fa)
    ci sono i repository remoti, ma non quello locale su cui ci troviamo. E dato che in quello locale non è stato ancora fatto niente, la nostra directory e' vuota.
  4. Integrare le modifiche del branch remoto nel branch locale:

     git merge origin/master

    ora il branch locale master sarà allineato a origin/master e i file saranno presenti nella directory.

  5. Rianalizzare lo stato dei riferimenti remoti git lg. Il cui output ora sarà:

      *   b92d7ff (HEAD -> master, origin/master) - Mario Rossi : Merge branch 'gp-1' (32 minuti fa)
      |\  
      | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (44 minuti fa)
      * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (36 minuti fa)
      |/  
      * 5b235ad - Mario Rossi : Aggiunta data in stampa. (66 minuti fa)
      * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (73 minuti fa)
      * ba12845 - Mario Rossi : README aggiunto (2 ore fa)

    Adesso i due branch sono allineati (puntano allo stesso commit). Se vediamo il contenuto della cartella:

     ls -altr

    possiamo vedere che e' aggiornato:

     totale 32
     drwxrwxr-x  2 mario mario 4096 feb 17 02:36 src
     -rw-rw-r--  1 mario mario   16 feb 17 02:36 README
     -rw-rw-r--  1 mario mario  258 feb 17 02:36 Makefile
     -rw-rw-r--  1 mario mario   10 feb 17 02:36 .gitignore
     drwxrwxr-x  8 mario mario 4096 feb 17 02:36 .git
     drwxrwxr-x  2 mario mario 4096 feb 17 02:36 doc
     drwxrwxr-x  5 mario mario 4096 feb 17 02:36 .
     drwxr-x--- 29 mario mario 4096 feb 17 02:36 ..

Secondo metodo - Pull

Più rapido risulta l'utilizzo del comando pull che racchiude in se il fetch e il merge ed è il comando solitamente utilizzato in questi casi. Verrà creato un nuovo repository gitproject_4 che funga da progetto locale.

  1. Creare una nuova cartella per ospitare il repository gitproject_4 e spostarsi all'interno:

    mkdir ~/gitproject_4
    cd ~/gitproject_4
  2. Inizializzare il repository:

    git init
  3. Aggiungere il repository remoto:

    git remote add origin ~/gitproject
  4. Quindi eseguire il pull:

    git pull origin master

    che restituirà il seguente output:

    remote: Enumerazione degli oggetti in corso: 23, fatto.
    remote: Conteggio degli oggetti in corso: 100% (23/23), fatto.
    remote: Compressione oggetti in corso: 100% (15/15), fatto.
    remote: 23 oggetti totali (7 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
    Decompressione degli oggetti in corso: 100% (23/23), 1.91 KiB | 325.00 KiB/s, fatto.
    Da /home/mario/gitproject
     * branch            master     -> FETCH_HEAD
     * [nuovo branch]    master     -> origin/master
  5. Verificare il log:

    git lg

    che risulta essere:

    *   b92d7ff (HEAD -> master, origin/master) - Mario Rossi : Merge branch 'gp-1' (38 minuti fa)
    |\  
    | * 05b43f8 - Mario Rossi : Modificato codice per issue gp-1. (49 minuti fa)
    * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (42 minuti fa)
    |/  
    * 5b235ad - Mario Rossi : Aggiunta data in stampa. (72 minuti fa)
    * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (79 minuti fa)
    * ba12845 - Mario Rossi : README aggiunto (2 ore fa)

È stato quindi creato un repository e sincronizzato il suo contenuto con un repository remoto.

Pubblicazione modifiche locali

Verranno qui effettuate delle modifiche nel repository locale gitproject_4.

  1. Modificare il file ~/gitproject_4/src/main.cpp, digitando:

    sed -i '4 a \\tstd::cout << "Modifica da un altro repository" << std::endl;' src/main.cpp
  2. Verificare il contenuto del file:

    cat src/main.cpp

    che risulterà essere:

    #include <iostream>
    int main() {
            std::cout << "sab 17 feb 2024, 01:26:54, CET: Benvenuti su Git!" << std::endl;
            std::cout << "Issue gp-1 implementata" << std::endl;
            std::cout << "Modifica da un altro repository" << std::endl;
            return 0;
    }
  3. Applicare la modifica effettuando il commit:

    git commit -a -m "Aggiunta riga di output."
  4. Consultare il log:

    git lg

    il cui output ora sarà:

    * c1648d4 (HEAD -> master) - Mario Rossi : Aggiunta riga di output. (11 secondi fa)
    *   b92d7ff (origin/master) - Mario Rossi : Merge branch 'gp-1' (41 minuti fa)
    |\  
    | * 05b43f8 - Mario Rossi : Modificato codice per issue gp-1. (52 minuti fa)
    * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (45 minuti fa)
    |/  
    * 5b235ad - Mario Rossi : Aggiunta data in stampa. (75 minuti fa)
    * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (82 minuti fa)
    * ba12845 - Mario Rossi : README aggiunto (2 ore fa)
    È stato creato un nuovo commit e dal log possiamo vedere che i due branch master, quello locale e quello remoto, non sono più (ovviamente) allineati.

Push

Per inviare le modifiche al repository remoto occorre utilizzare il comando push, specificando sempre il repository remoto e i branch da voler sincronizzare. In questo modo verranno mandate le modifiche nel repository in modo tale che gli altri utenti, una volta sincronizzati con quello remoto, possano percepire le modifiche avvenute.

  1. Effettuare il push:

    git push origin master

    questo sarà l'output visualizzato:

    Enumerazione degli oggetti in corso: 7, fatto.
    Conteggio degli oggetti in corso: 100% (7/7), fatto.
    Compressione delta in corso, uso fino a 8 thread
    Compressione oggetti in corso: 100% (3/3), fatto.
    Scrittura degli oggetti in corso: 100% (4/4), 395 byte | 395.00 KiB/s, fatto.
    4 oggetti totali (2 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
    To /home/user/gitproject
       f61b2e2..0ed9a58  master -> master

    Tuttavia si potrebbero visualizzare i seguenti messaggi di errore:

    remote: error: refusing to update checked out branch: refs/heads/master
    remote: error: Per impostazione predefinita, l'aggiornamento del branch corrente
    remote: in un repository non spoglio è negato, perché renderebbe l'indice
    remote: e l'albero di lavoro inconsistenti con i dati di cui si è eseguito
    remote: il push e richiederebbe 'git reset --hard' per ripristinare la
    remote: corrispondenza dell'albero di lavoro con HEAD.
    remote: 
    remote: Puoi impostare la variabile di configurazione
    remote: 'receive.denyCurrentBranch' a 'ignore' o 'warn' nel repository
    remote: remoto per consentire il push nel branch corrente; ciò nonostante,
    remote: questo non è raccomandato a meno che tu non provveda ad aggiornare
    remote: il suo albero di lavoro in modo che corrisponda a ciò di cui hai
    remote: eseguito il push in qualche altro modo.
    remote: 
    remote: Per non visualizzare più questo messaggio e mantenere comunque
    remote: il comportamento predefinito, imposta la variabile di
    remote: configurazione 'receive.denyCurrentBranch' a 'refuse'.
    To /home/mario/gitproject
     ! [remote rejected] master -> master (branch is currently checked out)
    error: push di alcuni riferimenti su '/home/mario/gitproject' non riuscito

    Questo perche' il nostro repository remoto non e' di tipo bare. Al momento verrà ignorato questo avviso.

  2. Per poter ovviare al problema digitare il seguente comando:

    git config --global receive.denyCurrentBranch ignore
  3. Effettuare nuovamente il push:

    git push origin master
  4. Quando non è piu' necessario settare lo stesso valore a refuse:

    git config --global receive.denyCurrentBranch refuse
    per ripristinare lo stato originale.

Verifica

Verificare che tutto sia avvenuto nel modo corretto utilizzando un repository creato in precedenza.

  1. Spostarsi nella directory del repository gitproject_3:

    cd ~/gitproject_3
  2. Effettuare il pull per risincronizzarsi col server remoto, sul quale sono state apportate le modifche sviluppate sul gitproject_4:

    git pull origin master

    Verrà visualizzato il seguente output:

    remote: Enumerazione degli oggetti in corso: 7, fatto.
    remote: Conteggio degli oggetti in corso: 100% (7/7), fatto.
    remote: Compressione oggetti in corso: 100% (3/3), fatto.
    remote: 4 oggetti totali (2 delta), 0 riutilizzati (0 delta), 0 riutilizzati nel file pack
    Decompressione degli oggetti in corso: 100% (4/4), 375 byte | 375.00 KiB/s, fatto.
    Da /home/mario/gitproject
     * branch            master     -> FETCH_HEAD
       b92d7ff..c1648d4  master     -> origin/master
    Aggiornamento di b92d7ff..c1648d4
    Fast-forward
     src/main.cpp | 1 +
     1 file changed, 1 insertion(+)
  3. Controllare il log:

    git lg

    che risulta essere:

    * c1648d4 (HEAD -> master, origin/master) - Mario Rossi : Aggiunta riga di output. (9 minuti fa)
    *   b92d7ff - Mario Rossi : Merge branch 'gp-1' (50 minuti fa)
    |\  
    | * 05b43f8 (origin/gp-1) - Mario Rossi : Modificato codice per issue gp-1. (61 minuti fa)
    * | 158633d - Mario Rossi : Aggiunta cartella documentazione. (54 minuti fa)
    |/  
    * 5b235ad - Mario Rossi : Aggiunta data in stampa. (84 minuti fa)
    * b7c1ae2 - Mario Rossi : Aggiunti sorgenti e Makefile (2 ore fa)
    * ba12845 - Mario Rossi : README aggiunto (2 ore fa)
    I repository risultano allineati.

Ulteriori risorse


CategoryProgrammazione