{"id":70703,"date":"2023-06-26T16:45:01","date_gmt":"2023-06-26T15:45:01","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=70703&#038;preview=true&#038;preview_id=70703"},"modified":"2023-07-11T14:43:25","modified_gmt":"2023-07-11T13:43:25","slug":"git-avanzato","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/","title":{"rendered":"Git Avanzato: Comandi Utili Oltre le Basi"},"content":{"rendered":"<p><a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> \u00e8 uno strumento potente per il controllo delle versioni e vanta una sorta di monopolio in questo settore. Per la maggior parte delle attivit\u00e0 quotidiane, Git \u00e8 semplice da usare grazie alla ripetizione dei comandi. Tuttavia, ci sono situazioni in cui c&#8217;\u00e8 bisogno di qualcosa di pi\u00f9 delle basi. A questo proposito, esistono molti comandi Git avanzati che possono portare le vostre abilit\u00e0 nell&#8217;utilizzo di Git a un livello superiore.<\/p>\n<p>Questo step vi introdurr\u00e0 anche a vari concetti di Git che di solito non si incontrano affatto. Ad esempio, l&#8217;archiviazione invece del commit delle modifiche, il rebasing e l&#8217;aggiunta di file all&#8217;area di staging. Una volta appresi questi concetti, vi ritroverete a essere ancora pi\u00f9 indispensabili per il vostro team.<\/p>\n<p>In questo articolo, presentiamo diversi comandi, ma per utilizzarli dovrete avere ben salde alcune competenze, concetti e informazioni. Cominciamo da questo.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Prerequisiti Consigliati<\/h2>\n<p>Sebbene non sia troppo complicato apprendere le <a href=\"https:\/\/kinsta.com\/it\/blog\/git-per-lo-sviluppo-web\/\" rel=\"noopener\">basi di Git<\/a> e utilizzare alcuni comandi intermedi, come ad esempio <code>git delete<\/code>, per gestire i comandi avanzati avremo bisogno di altri strumenti.<\/p>\n<p>I suggerimenti che condividiamo qui non sono adatti a chi \u00e8 alle prime armi con Git, quindi se il <a href=\"https:\/\/kinsta.com\/it\/blog\/controllo-versioni\/\" rel=\"noopener\">controllo versioni<\/a> in generale \u00e8 un argomento nuovo per voi, consigliamo di dedicare un po&#8217; di tempo utilizzando regolarmente i comandi di base prima di cercare di aggiungerne altri al vostro repertorio.<\/p>\n<p>In breve, ecco un rapido elenco degli aspetti che sar\u00e0 necessario conoscere bene:<\/p>\n<ul>\n<li>Concetti fondamentali di Git come commit, branch, pull request e altro.<\/li>\n<li>Familiarit\u00e0 con i comandi Git di base come <code>git add<\/code>, <code>git merge<\/code>, <code>git commit<\/code> e <code>git push<\/code>.<\/li>\n<li>Per le attivit\u00e0 Git avanzate, dovrete essere in grado di <a href=\"https:\/\/kinsta.com\/it\/blog\/comandi-linux\/\" rel=\"noopener\">navigare in un terminale<\/a>.<\/li>\n<\/ul>\n<p>\u00c8 utile avere esperienza di lavoro con Git come parte di un team, perch\u00e9 molti di questi comandi possono avere un impatto significativo su una codebase condivisa. Ad esempio, potreste utilizzare alcuni di questi comandi solo in una posizione di responsabilit\u00e0. Ci\u00f2 significa che dovrete fare attenzione e capire <em>quando<\/em> utilizzare questi comandi.<\/p>\n<h2>Git Avanzato: 12 Potenti Comandi da Conoscere<\/h2>\n<p>Il resto di questo articolo tratter\u00e0 12 diversi comandi Git avanzati che vi porteranno oltre le basi e vi trasformeranno in dei maghi di Git. Cominciamo con un comando che potreste usare pi\u00f9 di altri.<\/p>\n<h3>1. Rebasing<\/h3>\n<p>Innanzitutto, il rebasing \u00e8 un potente comando Git che rappresenta un&#8217;alternativa a una richiesta di pull. Permette di inserire tutti i nuovi commit effettuati dopo una divergenza di branch in un nuovo branch e di inserire le modifiche all&#8217;estremit\u00e0 della base. Questo vi sar\u00e0 utile se volete incorporare le modifiche da un altro branch senza creare un commit di fusione per qualsiasi motivo.<\/p>\n<p>Un caso d&#8217;uso comune del rebasing \u00e8 quando si sta lavorando su un branch di funzionalit\u00e0 e si vogliono incorporare le modifiche dal branch principale senza creare un commit merge. Questo aiuta a mantenere pulita la cronologia del progetto, anche se pu\u00f2 richiedere pi\u00f9 tempo per l&#8217;esecuzione e potreste vedere pi\u00f9 errori durante il merging.<\/p>\n<p>Per eseguire il rebase di un branch, usate il comando <code>git rebase<\/code>. Ecco un esempio in cui stiamo effettuando il rebase di un branch su un altro:<\/p>\n<pre><code class=\"language-bash\">git checkout foo-branch\n\ngit rebase main\n<\/code><\/pre>\n<p>Potete anche elencare i commit che state per rilasciare e darvi la possibilit\u00e0 di modificarli in anticipo. In questo modo, potrete &#8220;schiacciare&#8221; i commit, modificare i messaggi di commit e altro ancora. Potete usare il flag <code>--interactive<\/code> o <code>--i<\/code> per eseguire un &#8220;rebase interattivo&#8221;.<\/p>\n<pre><code class=\"language-bash\">git rebase --interactive &lt;other-branch-name&gt;<\/code><\/pre>\n<p>A questo proposito, schiacciare i commit in un unico commit per riordinare la cronologia dei commit \u00e8 un caso d&#8217;uso comune del rebase. Questo pu\u00f2 rendere la cronologia dei commit pi\u00f9 facile da leggere e da capire.<\/p>\n<p>Per farlo durante un rebase, seguite il flag con il numero di commit che volete schiacciare, che unir\u00e0 i commit in uno solo:<\/p>\n<pre><code class=\"language-bash\">git rebase -i HEAD~3\n<\/code><\/pre>\n<p>In questo modo si aprir\u00e0 una finestra interattiva di rebase, simile a quella dei commit, in cui potrete scegliere e modificare i commit che volete eliminare:<\/p>\n<figure id=\"attachment_155613\" aria-describedby=\"caption-attachment-155613\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-155613 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-rebase-terminal.png\" alt=\"Una finestra parziale del terminale che mostra l'output di un comando git rebase. La schermata mostra tre commit, insieme agli ID hash e al comando 'pick'. Sotto, c'\u00e8 un elenco di comandi che aiutano a creare un rebase personalizzato.\" width=\"1000\" height=\"606\"><figcaption id=\"caption-attachment-155613\" class=\"wp-caption-text\">Esecuzione di un rebase git nel terminale.<\/figcaption><\/figure>\n<p>Nella parte superiore dello schermo \u00e8 presente un elenco di commit e nella parte inferiore una selezione di comandi, oltre ad altre informazioni rilevanti. L&#8217;opzione predefinita \u00e8 <code>pick<\/code>, che seleziona un commit come quello da utilizzare senza alcuna modifica.<\/p>\n<p>Tuttavia, ci sono <a href=\"https:\/\/git-scm.com\/docs\/git-rebase\" target=\"_blank\" rel=\"noopener noreferrer\">molti altri comandi<\/a> che vi aiutano a gestire un rebase. Ad esempio, potete riformulare un commit o schiacciare pi\u00f9 commit insieme. Per apportare modifiche e utilizzare i comandi, dovrete lavorare con l&#8217;editor del vostro terminale. Spesso l&#8217;editor predefinito \u00e8 Vim, quindi <a href=\"https:\/\/linuxhandbook.com\/basic-vim-commands\/\" target=\"_blank\" rel=\"noopener noreferrer\">dovrete conoscerlo bene<\/a>.<\/p>\n<p>Il passo finale \u00e8 quello di salvare le modifiche e di inviarle al branch remoto.<\/p>\n<h3>2. Reversing, reset e unstaging<\/h3>\n<p>Git \u00e8 famoso quando si tratta di annullare le modifiche. In generale, si tratta di un processo difficile che tende a restituire errori. Tuttavia, se si apportano delle modifiche alla directory di lavoro o all&#8217;area di staging che volete annullare, ci sono alcuni comandi Git che possono aiutarvi.<\/p>\n<p>Infatti, Git vi d\u00e0 indicazioni su come annullare un file se eseguite un comando <code>git status<\/code>:<\/p>\n<figure id=\"attachment_155614\" aria-describedby=\"caption-attachment-155614\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155614\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-status-guidance.png\" alt=\"Una finestra del terminale che mostra l'utente che esegue un comando git status. L'output mostra il ramo corrente e le modifiche da apportare. Ci sono anche le istruzioni per disinstallare un file.\" width=\"1000\" height=\"435\"><figcaption id=\"caption-attachment-155614\" class=\"wp-caption-text\">Git mostra come annullare un file durante il suo output di stato.<\/figcaption><\/figure>\n<p>In questo modo potete rimuovere un commit dal branch corrente e inviarlo altrove con facilit\u00e0:<\/p>\n<pre><code class=\"language-bash\">git reset HEAD &lt;commit&gt;\n<\/code><\/pre>\n<p>Questo ha l&#8217;effetto di spostare il branch indietro di un commit, come se si rimuovesse l&#8217;ultimo commit conosciuto. Potreste anche avere un caso d&#8217;uso in cui desiderate ripristinare un branch al suo stato originale. In questo caso, potete ripristinare il branch rispetto all&#8217;origine remota, ad esempio utilizzando <code>git reset --hard origin\/main<\/code>. Tuttavia, tenete presente che queste modifiche saranno perse per sempre.<\/p>\n<p>Sebbene il comando <code>git checkout<\/code> sia uno di quelli che utilizzerete spesso e sia considerato di base, potete anche usarlo per eliminare i file prima di un commit:<\/p>\n<pre><code class=\"language-bash\">git checkout -- &lt;filename&gt;\n<\/code><\/pre>\n<p>Notate lo spazio tra i trattini e il segnaposto del nome del file. In questo caso, il comando cancella il file specificato e scarta le modifiche dalla directory di lavoro. Questo comando canceller\u00e0 tutte le modifiche locali apportate a un file. Per questo motivo, controllate due o tre volte che non vi servano le modifiche non salvate.<\/p>\n<p>Potete anche utilizzare <code>git revert<\/code> per le modifiche apportate a un commit. Tuttavia, questo non annulla le modifiche ma crea un nuovo commit basato sull&#8217;annullamento delle modifiche all&#8217;interno del commit precedente.<\/p>\n<p>La differenza principale \u00e8 che il comando non sposta alcun puntatore di riferimento al nuovo commit ma mantiene i vecchi commit. Questo \u00e8 utile quando si vogliono annullare le modifiche senza rimuoverle dalla cronologia dei commit.<\/p>\n<p>Il comando si aspetta di ricevere un riferimento ed \u00e8 semplice ripristinare l&#8217;ultimo commit:<\/p>\n<pre><code class=\"language-bash\">git revert HEAD\n<\/code><\/pre>\n<p>Tuttavia, esistono molte altre possibilit\u00e0 di ripristinare e modificare file e commit. Le prossime due voci di questo elenco di comandi avanzati di Git le esamineranno.<\/p>\n<h3>3. Ripristinare i file allo stato predefinito<\/h3>\n<p>Con Git \u00e8 possibile ripristinare facilmente un file allo stato predefinito utilizzando un comando abbastanza nuovo: <code>git restore<\/code>. In effetti, dovreste considerare questo comando come un sostituto di <code>git reset<\/code> nella maggior parte delle circostanze, in quanto offre molte pi\u00f9 potenzialit\u00e0. Ad esempio, potete ottenere lo stesso risultato con <code>git restore --staged &lt;filename&gt;<\/code> e con <code>git reset HEAD<\/code>.<\/p>\n<p>Il comando pu\u00f2 fare di pi\u00f9: \u00e8 anche in grado di ripristinare i file agli stati predefiniti. Potete vedere come eseguendo anche <code>git status <\/code>:<\/p>\n<pre><code class=\"language-bash\">git restore &lt;filename&gt;\n<\/code><\/pre>\n<p>Questo rimuover\u00e0 le modifiche dalla directory di lavoro come se nulla fosse accaduto. Come nel caso di <code>git checkout -- &lt;filename&gt;<\/code>, dovete assicurarvi di non volere nessuna delle modifiche locali, perch\u00e9 saranno perse per sempre.<\/p>\n<h3>4. Modificare i commit<\/h3>\n<p>\u00c8 probabile che capiti spesso di inviare un commit e di accorgersi di aver dimenticato di includere qualcosa di importante. Con Git, si pu\u00f2 facilmente modificare il commit per includere le modifiche mancanti.<\/p>\n<p>Per farlo, \u00e8 necessario seguire un processo specifico:<\/p>\n<ul>\n<li>Per prima cosa, apportate le modifiche ai file che vi servono per il progetto.<\/li>\n<li>Aggiungetele in staging come di consueto usando <code>git add<\/code>.<\/li>\n<li>Ricomponete le modifiche nell&#8217;area di staging utilizzando un altro comando per effettuare il commit:<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">git commit --amend\n<\/code><\/pre>\n<p>In questo modo si modifica il commit originale con quello nuovo utilizzando l&#8217;area di staging. Per questo motivo, assicuratevi di non aver bisogno della vecchia versione del commit, perch\u00e9 andr\u00e0 persa. Vi consigliamo inoltre di utilizzare il flag <code>--amend<\/code> con i commit locali piuttosto che con quelli remoti, per motivi simili a quelli che abbiamo illustrato altrove in questo post.<\/p>\n<p>Potete anche utilizzare <code>git commit --amend<\/code> per modificare solo il messaggio di commit con il seguente comando:<\/p>\n<pre><code class=\"language-bash\">git commit --amend -m \"New commit message\"\n<\/code><\/pre>\n<h3>5. Usare i log di Git<\/h3>\n<p>L&#8217;uso del log di Git \u00e8 prezioso per aiutarvi a capire la storia di un repository. Tuttavia, non definiremmo il comando <code>git log<\/code> come avanzato. Al contrario, potete utilizzare <a href=\"https:\/\/git-scm.com\/docs\/git-log\" target=\"_blank\" rel=\"noopener noreferrer\">diverse opzioni<\/a> per filtrare l&#8217;output in base alle vostre esigenze:<\/p>\n<pre><code class=\"language-bash\">git log\n\ngit log --decorate\n\ngit log --stat\n<\/code><\/pre>\n<p>Ad esempio, decorando una voce del log vengono stampati i nomi di riferimento di tutti i commit mostrati. L&#8217;opzione <code>--stat<\/code> mostra gli inserimenti e le eliminazioni di un commit:<\/p>\n<figure id=\"attachment_155612\" aria-describedby=\"caption-attachment-155612\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155612\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-stat.png\" alt=\"Una finestra del terminale che mostra l'output di un comando git log --stat. Mostra due commit, con l'hash evidenziato in oro, l'autore, la data del commit, il messaggio di commit e il numero di file modificati e inseriti.\" width=\"1000\" height=\"651\"><figcaption id=\"caption-attachment-155612\" class=\"wp-caption-text\">Esecuzione di un comando git log &#8211;stat nel terminale.<\/figcaption><\/figure>\n<p>Potete anche utilizzare altre opzioni per personalizzare l&#8217;output del log &#8211; chiamato &#8220;limitazione dei commit&#8221;. Ad esempio, prendete i seguenti comandi:<\/p>\n<pre><code class=\"language-bash\">git log --author=&lt;author-name&gt;\n\ngit log --grep=&lt;pattern-string&gt;\n<\/code><\/pre>\n<p>In questo caso, potete filtrare il log in base a nomi di autori specifici o a modelli di testo. In realt\u00e0, \u00e8 possibile combinare pi\u00f9 opzioni e flag per generare un log per uno scopo specifico. Ad esempio, prendete questo comando:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --author=&lt;author-name&gt; --since=&lt;date&gt; feature-temp\n<\/code><\/pre>\n<p>Questo comando cerca tutti i commit con il branch <strong>feature-temp<\/strong> di un singolo autore a partire da una data specificata, quindi li stampa utilizzando voci a riga singola. Notate che il parametro <code>&lt;date&gt;<\/code> pu\u00f2 anche essere una stringa:<\/p>\n<pre><code class=\"language-bash\">--since=\u201dTwo weeks ago\u201d\n<\/code><\/pre>\n<p>Inoltre, se volete cercare un file specifico invece di un branch, potete eseguire:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --author=bartonfink --since=\u201d5 days ago\u201d -- readme.rm\n<\/code><\/pre>\n<p>Questa serie di esempi sfiora solo la superficie di ci\u00f2 che si pu\u00f2 fare con i log, ma c&#8217;\u00e8 molto spazio per trovare i commit esatti all&#8217;interno di essi in base ai vostri criteri di ricerca.<\/p>\n<h3>6. Hook Git<\/h3>\n<p>Probabilmente a volte utilizzate macro e altri script automatizzati per aiutare l&#8217;esecuzione del codice. Anche Git include questo tipo di funzionalit\u00e0 sotto forma di hook. Questi script vengono eseguiti automaticamente in risposta a determinati eventi, come i commit o i push. Esistono anche molti modi per utilizzare gli hook per imporre la formattazione del codice, eseguire test e molto altro ancora.<\/p>\n<p>Esistono due tipi di hook: lato client e lato server:<\/p>\n<ul>\n<li>Gli hook lato client si attivano in base ad azioni locali come i commit e le fusioni.<\/li>\n<li>Gli hook lato server si attivano in seguito a operazioni di rete. Ad esempio, quando un repo riceve un commit in push, e molti altri esempi.<\/li>\n<\/ul>\n<p>Git popoler\u00e0 sempre il repo con diversi hook di esempio una volta eseguito un <code>git init<\/code>. Tuttavia, per poterli utilizzare, dovrete rimuovere l&#8217;estensione <strong>.sample<\/strong>:<\/p>\n<figure id=\"attachment_155615\" aria-describedby=\"caption-attachment-155615\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155615\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/sample-hooks.png\" alt=\"Una finestra del Finder in macOS che mostra la cartella hooks nascosta di un repo Git. Contiene una serie di file di script di hook di esempio, ciascuno con estensione .sample.\" width=\"1000\" height=\"713\"><figcaption id=\"caption-attachment-155615\" class=\"wp-caption-text\">Una cartella in macOS che mostra gli hook di esempio che Git installa all&#8217;avvio.<\/figcaption><\/figure>\n<p>Notate che \u00e8 possibile eseguire solo un tipo di hook alla volta, anche se si possono utilizzare pi\u00f9 script contemporaneamente <a href=\"https:\/\/stackoverflow.com\/questions\/30104343\/multiple-git-hooks-for-the-same-trigger\" target=\"_blank\" rel=\"noopener noreferrer\">con un po&#8217; di lavoro<\/a>. Per questo motivo, i nomi dei file devono corrispondere al tipo di hook che desiderate utilizzare in base agli script di esempio: <strong>pre-commit<\/strong>, <strong>update<\/strong> e cos\u00ec via.<\/p>\n<h4>Creare un hook Git<\/h4>\n<p>Per creare un hook Git, dovete creare uno script eseguibile nella sottodirectory <strong>.git\/hooks <\/strong>senza estensione. Verr\u00e0 comunque eseguito se lo aggiungerete alla cartella <strong>hooks<\/strong>.<\/p>\n<p>Potete utilizzare il linguaggio di scripting che preferite, purch\u00e9 possa essere eseguito come un file eseguibile. Noi suggeriamo <a href=\"https:\/\/kinsta.com\/it\/blog\/ruby-on-rails-vs-node-js\/\" rel=\"noopener\">Ruby<\/a> o <a href=\"https:\/\/kinsta.com\/it\/blog\/comandi-python\/\" rel=\"noopener\">Python<\/a>, ma potete usare anche <a href=\"https:\/\/kinsta.com\/it\/blog\/linguaggi-di-scripting\/\" rel=\"noopener\">Bash, Perl e molti altri<\/a>. Tutto ci\u00f2 che dovete fare \u00e8 cambiare il percorso del vostro interprete rispetto a quello predefinito di Bash:<\/p>\n<pre><code class=\"language-bash\">#!\/usr\/bin\/env python\n<\/code><\/pre>\n<p>Da qui potrete scrivere il vostro codice come di consueto. Ad esempio, ecco uno script <code>prepare-commit<\/code> in Python che chiede all&#8217;utente di scrivere dei messaggi di commit:<\/p>\n<pre><code class=\"language-python\">#!\/usr\/bin\/env python\n\nimport sys, os\n\npath_commit_msg = sys.argv[1]\n\nwith open(commit_msg_filepath, 'w') as f:\n\nf.write(\"# You\u2019ll need to provide a better commit message than that, buddy!\")\n<\/code><\/pre>\n<p>Anche se non \u00e8 sempre necessario, vi consigliamo di eseguire <code>chmod +x .git\/hooks\/&lt;hook-name&gt;<\/code> dalla linea di comando per assicurarvi di poterlo eseguire.<\/p>\n<p>Nel complesso, gli hook possono essere uno strumento potente per automatizzare le attivit\u00e0 ripetitive e imporre le best practice all&#8217;interno del vostro team.<\/p>\n<h3>7. Riferimenti ai commit<\/h3>\n<p>In Git, i commit sono identificati dall&#8217;<a href=\"https:\/\/kinsta.com\/it\/blog\/generare-chiavi-ssh\/\" rel=\"noopener\">hash di crittografia<\/a> SHA-1. Anche se \u00e8 possibile fare riferimento ai commit con il loro hash completo, quest&#8217;operazione pu\u00f2 essere noiosa e soggetta a errori:<\/p>\n<pre><code class=\"language-bash\">bc7623b7a94ed3d8feaffaf7580df3eca4f5f5ca\n<\/code><\/pre>\n<p>Invece, Git offre diversi modi per fare riferimento ai commit usando nomi pi\u00f9 brevi e memorabili. Ad esempio, \u00e8 possibile usare il nome di un branch o di un tag. Consideriamo un branch chiamato &#8220;develop&#8221;. Ecco un esempio in cui ci riferiamo all&#8217;ultimo commit di questo branch:<\/p>\n<pre><code class=\"language-bash\">git diff develop..HEAD\n<\/code><\/pre>\n<p>Questo mostra le differenze tra l&#8217;ultimo commit (<code>HEAD<\/code>) sul branch &#8220;develop&#8221; e il commit attuale.<\/p>\n<p>Potete anche fare riferimento a un commit in base alla sua posizione relativa nella cronologia dei commit. Ad esempio, potete fare riferimento a due commit precedenti a quello attuale utilizzando la stenografia <code>HEAD~2<\/code>:<\/p>\n<pre><code class=\"language-bash\">git diff HEAD~2..HEAD\n<\/code><\/pre>\n<p>Git offre anche <a href=\"https:\/\/stackoverflow.com\/questions\/26785118\/head-vs-head-vs-head-also-known-as-tilde-vs-caret-vs-at-sign\" target=\"_blank\" rel=\"noopener noreferrer\">altri modi<\/a> per riferirsi ai commit, come ad esempio il simbolo &#8220;@&#8221; per riferirsi al branch corrente o il simbolo &#8220;^&#8221; per riferirsi al genitore di un commit. Utilizzando queste notazioni abbreviate, potrete risparmiare tempo ed evitare errori mentre lavorate con i commit.<\/p>\n<h3>8. Stashing<\/h3>\n<p>In circostanze normali, si potrebbe pensare che non esista un modo per memorizzare le modifiche apportate ai file senza effettuare il commit. Lo &#8220;stashing&#8221; \u00e8 un modo per farlo in maniera temporaneo. \u00c8 utile quando avete bisogno di cambiare branch o di lavorare su un&#8217;attivit\u00e0 diversa ma non volete ancora eseguire il commit delle modifiche.<\/p>\n<p>Ad esempio, se avete bisogno di cambiare branch per lavorare su qualcosa a met\u00e0 del flusso, potete mettere le modifiche nel branch corrente e fare il checkout dell&#8217;altro. Da l\u00ec, potete lavorare sull&#8217;altro branch, quindi eseguire il commit e il push delle modifiche. Potrete poi fare il checkout e recuperare il lavoro sul branch originale.<\/p>\n<p>Per conservare le modifiche ci sono due modi:<\/p>\n<pre><code class=\"language-bash\">git stash\n<\/code><\/pre>\n<p>Questo salva le modifiche in un nuovo stash e riporta la directory di lavoro all&#8217;ultimo commit <strong>HEAD<\/strong> (lo stato in cui si trovava prima di apportare le nuove modifiche). Potete elencare le modifiche usando <code>git stash list<\/code> e ispezionare lo stash usando <code>git stash show<\/code>. Quest&#8217;ultimo comando pu\u00f2 anche accettare qualsiasi formato accettato da <code>git diff<\/code>.<\/p>\n<p>Da qui \u00e8 possibile cambiare branch o lavorare su un&#8217;altra attivit\u00e0. Quando volete recuperare le modifiche, eseguite il comando:<\/p>\n<pre><code class=\"language-bash\">git stash apply\n<\/code><\/pre>\n<p>In questo modo verranno applicate le ultime modifiche alla cartella di lavoro. Tuttavia, tenete presente che se modificate troppo il file, potete ancora incorrere in conflitti. Dopotutto, <code>git stash<\/code> \u00e8 una soluzione temporanea al problema in questione.<\/p>\n<p>\u00c8 anche possibile avere pi\u00f9 stash e specificare quale stash applicare utilizzando la seguente procedura:<\/p>\n<pre><code class=\"language-bash\">git stash apply stash@{n}\n<\/code><\/pre>\n<p>Il segnaposto <code>{n}<\/code> contiene un numero intero e <code>stash@{0}<\/code> rappresenta l&#8217;ultimo stash. La <a href=\"https:\/\/git-scm.com\/docs\/git-stash\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione ufficiale di Git<\/a> include altri esempi di <code>git stash<\/code>.<\/p>\n<h3>9. Bisecting<\/h3>\n<p>Scommettiamo che a tutti sar\u00e0 capitato di imbattersi in un <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-di-revisione-del-codice\/\" rel=\"noopener\">bug o in un problema<\/a> e di non avere idea di dove iniziare a cercare. In queste situazioni, il &#8220;bisecting&#8221; pu\u00f2 aiutare a identificare rapidamente il commit che ha introdotto il problema.<\/p>\n<p>In poche parole, il comando va a caccia di bug attraverso una ricerca dei commit. Una volta trovato il commit incriminato, ve lo restituisce. Il potere di questo comando \u00e8 dato da tutti i sottocomandi che potete utilizzare.<\/p>\n<p>Per usare bisecting, dovete prima eseguire il comando <code>git bisect start<\/code>. Git vi porter\u00e0 al primo commit nella cronologia del progetto.<\/p>\n<p>Da qui, dovrete indicare se quel commit \u00e8 buono o cattivo utilizzando i comandi corrispondenti:<\/p>\n<pre><code class=\"language-bash\">git bisect good\n\ngit bisect bad\n<\/code><\/pre>\n<p>Git vi porter\u00e0 quindi al commit successivo per verificarne la &#8220;qualit\u00e0&#8221;. \u00c8 anche possibile sostituire &#8220;good&#8221; con &#8220;old&#8221; e &#8220;bad&#8221; con &#8220;new&#8221; per adattarlo al vostro caso d&#8217;uso specifico (ma non si possono mischiare i termini)<\/p>\n<p>Da qui, si pu\u00f2 continuare a contrassegnare ogni commit come buono o cattivo finch\u00e9 non trovate il commit che ha introdotto il bug. Tuttavia, non \u00e8 necessario spulciare ogni commit: potete specificare degli identificatori esatti per restringere e abbreviare la ricerca:<\/p>\n<pre><code class=\"language-bash\">git bisect bad feature-test\n<\/code><\/pre>\n<p>In questo caso si utilizza il nome di un branch, ma potrebbe trattarsi di una revisione specifica utilizzando un numero intero, un riferimento hash e altro ancora. In ogni caso, una volta trovato il bug, potete eseguire uno dei seguenti comandi per tornare al codice pi\u00f9 recente:<\/p>\n<pre><code class=\"language-bash\">git bisect reset\n<\/code><\/pre>\n<p>Come per tutti i comandi Git avanzati di questo elenco, c&#8217;\u00e8 molto altro da capire e la <a href=\"https:\/\/git-scm.com\/docs\/git-bisect\" target=\"_blank\" rel=\"noopener noreferrer\">documentazione di Git<\/a> sar\u00e0 una lettura essenziale.<\/p>\n<h3>10. Confrontare i branch<\/h3>\n<p>La nostra voce sui riferimenti dei commit parla dell&#8217;utilizzo di <code>git diff<\/code>. Ora \u00e8 arrivato il momento di analizzare questo aspetto in modo pi\u00f9 dettagliato. Vi capiter\u00e0 spesso di avere pi\u00f9 branch che contengono modifiche diverse. Git vi permette di confrontare le differenze tra due branch utilizzando il comando <code>git diff<\/code>. In realt\u00e0, potete usarlo in molti modi, spesso insieme ad altri comandi, per indagare e analizzare un repo.<\/p>\n<p>Il comando di base <code>git diff<\/code> vi fornir\u00e0 un output con una panoramica delle modifiche. Assomiglia molto all&#8217;output di un&#8217;indagine di commit merge:<\/p>\n<figure id=\"attachment_155611\" aria-describedby=\"caption-attachment-155611\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155611\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-output.png\" alt=\"Una parte della finestra del terminale che mostra un tipico output di git diff. Mostra i file confrontati, i riferimenti all'indice, la chiave e la legenda delle modifiche tra i documenti e le modifiche stesse.\" width=\"1000\" height=\"540\"><figcaption id=\"caption-attachment-155611\" class=\"wp-caption-text\">L&#8217;output di una richiesta di git diff.<\/figcaption><\/figure>\n<p>Tuttavia, \u00e8 possibile arrivare fino ai branch esatti, agli hashtag e molto altro ancora. Ad esempio, per confrontare due branch, eseguite il comando <code>git diff branch1..branch2<\/code> e sostituite i placeholder:<\/p>\n<pre><code class=\"language-bash\">git diff feature-branch pre-prod\n<\/code><\/pre>\n<p>Potete anche confrontare le differenze tra il branch attuale e un altro branch:<\/p>\n<pre><code class=\"language-bash\">git diff HEAD..pre-prod\n<\/code><\/pre>\n<p>Notate che utilizzando due punti in questo caso si otterr\u00e0 la differenza tra le due punte dei branch. Al contrario, tre punti restituiranno la differenza tra gli antenati comuni dei due branch e la utilizzeranno per il test.<\/p>\n<p>Come per <code>git log<\/code>, potete ripulire l&#8217;output e perfezionare i risultati. Ad esempio, <code>git diff --name-only branch1..branch2<\/code> verificher\u00e0 solo quali file differiscono tra loro e tralascer\u00e0 il contesto:<\/p>\n<figure id=\"attachment_155610\" aria-describedby=\"caption-attachment-155610\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155610\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-name-only.png\" alt=\"Una parte di una finestra del terminale che mostra come eseguire un comando git diff --name-only. Restituisce un elenco di soli nomi di file, come da comando.\" width=\"1000\" height=\"487\"><figcaption id=\"caption-attachment-155610\" class=\"wp-caption-text\">Esecuzione di un comando git diff &#8211;name-only nel terminale.<\/figcaption><\/figure>\n<p>Potreste notare che l&#8217;output \u00e8 difficile da analizzare, soprattutto se il &#8220;diff&#8221; \u00e8 lungo. In questi casi, potete utilizzare l&#8217;opzione <code>--color-words<\/code>:<\/p>\n<figure id=\"attachment_155609\" aria-describedby=\"caption-attachment-155609\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155609\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff-color-words.png\" alt=\"Una finestra del terminale che mostra il lungo output di una richiesta di git diff, completo di riferimenti di colore per le parole. Mostra quali file vengono confrontati, i riferimenti espliciti alle modifiche e alle cancellazioni tra i file e le modifiche stesse dei file. Ciascuna di esse ha una codifica a colori per aiutarci a distinguerle dal resto del testo.\" width=\"1000\" height=\"636\"><figcaption id=\"caption-attachment-155609\" class=\"wp-caption-text\">Esecuzione del comando git diff &#8211;color-words e visualizzazione dell&#8217;output nel terminale.<\/figcaption><\/figure>\n<p>Nel complesso, <code>git diff<\/code> pu\u00f2 essere potente quanto altri comandi, soprattutto quando richiamate alcune opzioni e perfezionate le differenze da restituire.<\/p>\n<h3>11. Applicare singoli commit<\/h3>\n<p>A volte potreste voler applicare un commit specifico da un branch a un altro senza unire i due branch. Git permette di farlo utilizzando <code>git cherry-pick<\/code>. Dovreste usarlo con attenzione, ma <code>git cherry-pick<\/code> pu\u00f2 esservi utile in alcuni casi.<\/p>\n<p>Una delle possibili situazioni \u00e8 quella in cui si hanno dei branch di funzionalit\u00e0 obsolete di cui non effettuate il merge con <code>main<\/code> o <code>trunk<\/code>. Potete usare una combinazione di comandi (come <code>git log<\/code>) per estrarre i vecchi commit rilevanti e riapplicarli altrove.<\/p>\n<p>Usate git log per trovare il riferimento di un commit. Da l\u00ec, assicuratevi di essere nel branch di cui volete prelevare un riferimento. Ad esempio, supponiamo che vogliate prelevare il commit <code>xxxxxaaaaaa<\/code> nel branch &#8220;<code>trunk<\/code>&#8220;. Per prima cosa, fate il checkout del branch.<\/p>\n<pre><code class=\"language-bash\">git checkout trunk\n<\/code><\/pre>\n<p>&#8230; poi fate il cherry-pick del commit:<\/p>\n<pre><code class=\"language-bash\">git cherry-pick xxxxxaaaaaa\n<\/code><\/pre>\n<p>\u00c8 probabile che il messaggio di commit non sia aggiornato in molte occasioni. Per risolvere questo problema, potete passare l&#8217;opzione <code>--edit<\/code> al comando. In questo modo potrete fornire un nuovo messaggio di commit prima di effettuare il cherry pick.<\/p>\n<h3>12. Potenziare &#8220;git add&#8221;<\/h3>\n<p>Per il nostro ultimo comando avanzato di Git, vi mostreremo <code>git add<\/code>. No, non \u00e8 un errore di battitura: questo comando fondamentale di Git ha una potenza sorprendente.<\/p>\n<p>Ad esempio, se vi trovate ad aggiungere singoli file all&#8217;area di staging, potete usare il seguente comando:<\/p>\n<pre><code class=\"language-bash\">git add -p\n<\/code><\/pre>\n<p>L&#8217;opzione <code>-p<\/code> vi permette di mettere in staging le modifiche in modo interattivo. Potete rivedere le modifiche apportate a ciascun file e poi scegliere quali aggiungere allo staging. Questo vi far\u00e0 risparmiare molto tempo e vi aiuter\u00e0 a evitare di mettere in staging una modifica indesiderata.<\/p>\n<p>Sebbene sia possibile mettere in staging i singoli file, \u00e8 bene notare che si pu\u00f2 anche specificare una directory. Ad esempio, per mettere in staging tutti i file all&#8217;interno della directory &#8220;<code>new-feature<\/code>&#8220;:<\/p>\n<pre><code class=\"language-bash\">git add new-feature\n<\/code><\/pre>\n<p>Potreste anche voler vedere quale sar\u00e0 il risultato di un <code>git add<\/code> senza eseguire il processo completo. Per questo c&#8217;\u00e8 un&#8217;opzione:<\/p>\n<pre><code class=\"language-bash\">git add --dry-run\n\ngit add -n\n<\/code><\/pre>\n<p>Quando lo eseguite, Git vi mostrer\u00e0 se aggiunger\u00e0 o ignorer\u00e0 i file. A proposito dei file ignorati, potete anche aggiungerli all&#8217;area di staging se lo desiderate:<\/p>\n<pre><code class=\"language-bash\">git add --force\n\ngit add -f\n<\/code><\/pre>\n<p>L&#8217;aggiunta di file all&#8217;area di staging pu\u00f2 essere pi\u00f9 complessa di un semplice scenario binario &#8220;Aggiungi o non aggiungi&#8221;. Per questo motivo, uno dei comandi principali di Git pu\u00f2 coprire una miriade di eventualit\u00e0.<\/p>\n<h2>Riepilogo<\/h2>\n<p>Una volta imparati i comandi base di <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a>, avrete l&#8217;80% di ci\u00f2 che serve per svolgere le normali attivit\u00e0 di controllo della versione del vostro progetto. Tuttavia, l&#8217;ultimo 20% racchiude i casi d&#8217;uso in cui i comandi Git avanzati possono dare il meglio.<\/p>\n<p>Comandi e tecniche come rebasing, bisecting, il ripristino dei file e molto altro ancora vi permetteranno di risolvere velocemente ogni problema. Inoltre, potrete offrire un valore aggiunto al vostro team e al vostro progetto e contribuire a snellire i flussi di lavoro, ad aumentare la produttivit\u00e0 e ad avere un impatto migliore come developer.<\/p>\n<p>Qualcuno di questi comandi Git avanzati entrer\u00e0 a far parte del vostro lavoro quotidiano? Fatecelo sapere nella sezione commenti qui sotto!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Git \u00e8 uno strumento potente per il controllo delle versioni e vanta una sorta di monopolio in questo settore. Per la maggior parte delle attivit\u00e0 quotidiane, &#8230;<\/p>\n","protected":false},"author":199,"featured_media":70704,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26233],"class_list":["post-70703","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Git Avanzato: Comandi Utili Oltre le Basi - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Git Avanzato: Comandi Utili Oltre le Basi\" \/>\n<meta property=\"og:description\" content=\"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-26T15:45:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-11T13:43:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Git Avanzato: Comandi Utili Oltre le Basi\",\"datePublished\":\"2023-06-26T15:45:01+00:00\",\"dateModified\":\"2023-07-11T13:43:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\"},\"wordCount\":3415,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\",\"name\":\"Git Avanzato: Comandi Utili Oltre le Basi - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\",\"datePublished\":\"2023-06-26T15:45:01+00:00\",\"dateModified\":\"2023-07-11T13:43:25+00:00\",\"description\":\"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Git Avanzato: Comandi Utili Oltre le Basi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Git Avanzato: Comandi Utili Oltre le Basi - Kinsta\u00ae","description":"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/","og_locale":"it_IT","og_type":"article","og_title":"Git Avanzato: Comandi Utili Oltre le Basi","og_description":"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!","og_url":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-06-26T15:45:01+00:00","article_modified_time":"2023-07-11T13:43:25+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Jeremy Holcombe","Tempo di lettura stimato":"18 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Git Avanzato: Comandi Utili Oltre le Basi","datePublished":"2023-06-26T15:45:01+00:00","dateModified":"2023-07-11T13:43:25+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/"},"wordCount":3415,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/","url":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/","name":"Git Avanzato: Comandi Utili Oltre le Basi - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","datePublished":"2023-06-26T15:45:01+00:00","dateModified":"2023-07-11T13:43:25+00:00","description":"Git \u00e8 semplice da usare, ma \u00e8 un sistema di controllo delle versioni complesso. In questo post analizzeremo alcuni comandi Git avanzati per utenti esperti!","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/git-avanzato\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/advanced-git.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/git-avanzato\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/it\/argomenti\/git\/"},{"@type":"ListItem","position":3,"name":"Git Avanzato: Comandi Utili Oltre le Basi"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=70703"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70703\/revisions"}],"predecessor-version":[{"id":71164,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70703\/revisions\/71164"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70703\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/70704"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=70703"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=70703"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=70703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}