{"id":8136,"date":"2011-12-29T15:07:21","date_gmt":"2011-12-29T14:07:21","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=8136"},"modified":"2012-01-17T18:31:57","modified_gmt":"2012-01-17T17:31:57","slug":"impariamo-ad-usare-git-seconda-parte","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/impariamo-ad-usare-git-seconda-parte\/","title":{"rendered":"Impariamo ad usare git (seconda parte)"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/git-logo.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/git-logo.jpg\" alt=\"git-logo\" title=\"git-logo\" width=\"114\" height=\"106\" class=\"alignleft size-full wp-image-8142\" \/><\/a>  Nella <a href=\"http:\/\/www.devapp.it\/wordpress\/impariamo-ad-usare-git-prima-parte.html\" target=\"_blank\">prima parte<\/a> di questo articolo abbiamo imparato ad usare git per tenere traccia delle modifiche effettuate ad un progetto in locale, oggi vedremo come lo si pu\u00f2 usare per gestire in modo ordinato il lavoro di un gruppo di programmatori che lavorano sullo stesso progetto da remoto.<\/p>\n<p>Come abbiamo gi\u00e0 detto git non utilizza un server centralizzato per il controllo di versione ma utilizza invece un sistema distribuito, questo significa che non esiste un nodo &#8220;privilegiato&#8221; ma tutti i nodi sono uguali.<!--more--><\/p>\n<p>Vogliamo simulare un caso abbastanza semplice di condivisione: supponiamo che i due (o pi\u00f9) programmatori siano in una rete locale ed abbiano accesso al filesystem dove \u00e8 memorizzato il repository.<\/p>\n<p>Ciascun sviluppatore creer\u00e0 una sua personale copia del repository con il comando<\/p>\n<pre>\r\ngit clone REPOSITORY_PATH NUOVO_PATH\r\n<\/pre>\n<p>il cui output \u00e8 il seguente<\/p>\n<pre>\r\nCloning into learn git...\r\ndone.\r\n<\/pre>\n<p>Cosa \u00e8 avvenuto con questo comando?<\/p>\n<ul>\n<li>\u00e8 stata creata la cartella NUOVO_PATH ed \u00e8 stato inizializzato un nuovo repository all&#8217;interno di essa<\/li>\n<li>copia di tutti gli oggetti commit dal repository remoto in quello attuale<\/li>\n<li>aggiunta di un riferimeto ad un repository remoto<\/li>\n<\/ul>\n<p>Cos\u00ec \u00e8 come appare il repository appena clonato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_01-300x163.png\" alt=\"\" width=\"300\" height=\"163\" class=\"aligncenter size-medium wp-image-8188\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_01-300x163.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_01.png 309w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Va sottolineato che da questo momento tutte le modifiche fatte a tale repository avranno effetto solo su questo repository e non intaccheranno minimamente l&#8217;origine remota.<\/p>\n<p>Come verificare adesso se sono state effettuate delle modifiche al repository originale?<\/p>\n<p>Per fare questa verifica aggiungiamo un nuovo commit al repository originale, quindi spostiamoci nuovamente nel repository clonato ed eseguiamo:<\/p>\n<pre>\r\ngit pull\r\n<\/pre>\n<p>e questo sar\u00e0 il risultato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_02-300x169.png\" alt=\"\" width=\"300\" height=\"169\" class=\"aligncenter size-medium wp-image-8190\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_02-300x169.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_02.png 339w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come fare invece ad inviare sul repository remoto le modifiche fatte al repository locale?<\/p>\n<p>Il comando da usare \u00e8 push; posizioniamoci quindi nel nuovo repository e digitiamo:<\/p>\n<pre>\r\ngit push\r\n<\/pre>\n<p>Purtroppo notiamo subito una sfilza di errori piuttosto criptici che fanno  riferimento a repository <i>bare<\/i> e roba del genere.<br \/>\nGli errori non devono mai essere presi alla leggera e se per impostazione predefinita git impedisce di effettuare il push bisognerebbe chiedersi il perch\u00e9.<\/p>\n<p>Purtroppo una spiegazione accurata andrebbe oltre i presupposti di questo tutorial, ci baster\u00e0 sapere che questa limitazione nasce per evitare che sul ramo master del repository server vengano effettuati push senza controllo.<br \/>\nPer inibire questo controllo bisogna modificare un&#8217;impostazione del repository originale, posizioniamoci quindi nella corretta cartella e digitiamo:<\/p>\n<pre>\r\ngit config receive.denyCurrentBranch ignore\r\n<\/pre>\n<p>Fatto questo possiamo riportarci sul repository copia ed effettuare nuovamente un:<\/p>\n<pre>\r\ngit push\r\n<\/pre>\n<p>In questo modo il repository originale rispecchier\u00e0 tutte le modifiche fatte sulla copia, come visibile in questa immagine:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_03-300x178.png\" alt=\"\" width=\"300\" height=\"178\" class=\"aligncenter size-medium wp-image-8192\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_03-300x178.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/12\/learngit_v2_03.png 325w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Spero che questa introduzione all&#8217;uso di Git vi sia stata utile, se vi \u00e8 piaciuta potete approfondire e proseguire lo studio di questa utile risorsa cercando in internet documentazione pi\u00f9 avanzata. Eccovi qualche link:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.linuxtrent.it\/sites\/default\/files\/Comprendere%20Git%20concettualmente.pdf\" target=\"_blank\">Comprendere Git concettuamente<\/a><\/li>\n<li><a href=\"http:\/\/git-scm.com\/documentation\" target=\"_blank\">La documentazione ufficiale di Git<\/a><\/li>\n<li><a href=\"http:\/\/scottr.org\/presentations\/git-in-5-minutes\/\" target=\"_blank\">Git in five minutes<\/a><\/li>\n<\/ul>\n<p>Esistono (e vi segnalo) inoltre alcuni tool molto comodi da usare come:<\/p>\n<ul>\n<li><a href=\"http:\/\/gitx.frim.nl\/\" target=\"_blank\">Gitx<\/a><\/li>\n<li><a href=\"http:\/\/mac.github.com\/\" target=\"_blank\">Github per mac<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Caged\/gitnub\/wiki\/\" target=\"_blank\">Gitnub<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Nella prima parte di questo articolo abbiamo imparato ad usare git per tenere traccia delle modifiche effettuate&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[990,991,995,993,988,989,992,994,987],"class_list":["post-8136","post","type-post","status-publish","format-standard","hentry","category-guide-varie","tag-alternativa-a-mercurial","tag-alternativa-a-svn","tag-branch-git","tag-commit-git","tag-git-da-terminale","tag-git-iphone-e-ipad","tag-git-xcode","tag-repository-git","tag-version-control-system-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=8136"}],"version-history":[{"count":11,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8136\/revisions"}],"predecessor-version":[{"id":8427,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8136\/revisions\/8427"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=8136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=8136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=8136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}