Guida rapida Git — Comandi per attività
Comandi Git organizzati per ciò che vuoi fare: annullare l'ultimo commit, rinominare un branch, eliminare un branch remoto. I moderni switch/restore con gli equivalenti classici e badge di pericolo.
Ultima verifica: 2026-10-18 su il riferimento di git-scm.com per Git 2.56 e il manuale di GitHub CLI. Fonti: Git reference (git-scm.com/docs), git restore, git switch, git reset, git config, GitHub CLI manual.
Configurazione (una volta per computer)
Con --global le impostazioni vanno in ~/.gitconfig. Da Git 2.46 la forma documentata è git config set / get / list; la forma classica funziona ancora.
git config set --global user.name "Ana Lee" git config set --global user.email "ana@example.com"
Classico: git config --global user.name "Ana Lee"
Registrati in ogni commit che fai. Usa l'email nota al tuo host Git, così i commit vengono collegati al tuo account.
git config set --global init.defaultBranch main
Classico: git config --global init.defaultBranch main
Senza questa impostazione, git init chiama ancora master il primo branch (e mostra un suggerimento).
git config set --global core.editor "code --wait"
Classico: git config --global core.editor "code --wait"
Funziona qualsiasi comando che resti in attesa finché il file non viene chiuso: "nano", "vim", "subl -n -w".
git config set --global core.autocrlf true # Windows git config set --global core.autocrlf input # macOS, Linux
Classico: git config --global core.autocrlf true
Esegue il commit con LF e il checkout con CRLF su Windows. Per un intero team, un file .gitattributes con "* text=auto" è più affidabile delle impostazioni personali.
git --version
git switch e git restore richiedono la 2.23+, i sottocomandi di git config la 2.46+.
Avviare un repository
git init
git init -b main # name the first branchCrea una directory .git. Aggiungi un .gitignore prima del primo commit, così file di build e segreti non entrano mai.
git clone https://github.com/owner/repo.git git clone git@github.com:owner/repo.git my-folder
Scarica tutta la cronologia e imposta il remote "origin". La seconda forma usa SSH e un nome di cartella personalizzato.
git clone --depth 1 https://github.com/owner/repo.git
Salta la cronologia; utile per la CI e i repository grandi. git fetch --unshallow scarica il resto in seguito.
git remote add origin git@github.com:owner/repo.git git push -u origin main
Crea prima il repository vuoto sull'host (oppure usa gh repo create, più sotto). -u memorizza origin/main come upstream.
Stage e commit
git status
git status -s # short formElenca i file in stage, non in stage e non tracciati, e suggerisce il comando successivo.
git add file.txt
git add . # everything in this folder and belowgit add -A mette in stage anche le eliminazioni in tutto il repository.
git add -p file.txt
Scorre ogni modifica ("hunk"): y per metterla in stage, n per saltarla, s per dividerla, e per modificarla.
git commit -m "Add login form"
git commit -am "Fix typo" # stage tracked files and commit-a include i file tracciati modificati ed eliminati, mai quelli nuovi.
git mv old.txt new.txt git rm file.txt
Entrambi mettono la modifica in stage per te. Git rileva le rinomine dal contenuto, quindi funziona anche un semplice mv più git add.
git rm --cached .env echo ".env" >> .gitignore
Lo rimuove dal repository a partire dal prossimo commit. Resta nei commit precedenti: se conteneva un segreto, cambia il segreto.
Branch
git branch git branch -a # include remote branches git branch -vv # show upstream and ahead/behind
Il branch corrente è segnato con *.
git switch -c feature/login
Classico: git checkout -b feature/login
Parte dal commit corrente; aggiungi un punto di partenza per diramarti da altrove: git switch -c hotfix origin/main.
git switch main
git switch - # back to the previous branchClassico: git checkout main
Se esiste solo origin/feature, git switch feature crea automaticamente un branch locale di tracking.
git branch -m new-name # current branch
git branch -m old-name new-nameRinomina solo in locale. Per rinominarlo anche sul remote, vedi la voce successiva.
git branch -m old-name new-name git push -u origin new-name git push origin --delete old-name
Non esiste una rinomina remota: fai il push del nuovo nome ed elimina quello vecchio. Le pull request aperte sul vecchio nome potrebbero chiudersi; il pulsante di rinomina nell'interfaccia web di GitHub le reindirizza.
git branch -d feature/login
git branch -D feature/login # even if unmerged-d si rifiuta se il branch ha commit non uniti nel suo upstream o in HEAD; -D elimina comunque.
Recupero: I commit non uniti sono ancora nel reflog: git reflog, trova la punta, poi git branch feature/login <sha>.
git push origin --delete feature/login
Classico: git push origin :feature/login
I colleghi continuano a vederlo finché non eseguono git fetch --prune.
Recupero: Chiunque abbia il branch in locale (o tu, tramite git reflog) può ripubblicarlo con un push.
git branch -u origin/main
git push -u origin HEAD # push current branch and track itClassico: git branch --set-upstream-to=origin/main
L'upstream è ciò che usano git pull e git push senza argomenti.
git switch --detach a1b2c3d
git switch -c rescue # keep work made thereClassico: git checkout a1b2c3d
I commit fatti con HEAD scollegato non appartengono a nessun branch; creane uno prima di spostarti, altrimenti saranno raggiungibili solo tramite il reflog.
Merge, rebase e cherry-pick
git switch main
git merge feature/login
git merge --no-ff feature/login # always create a merge commitUsa il fast-forward quando possibile; --no-ff mantiene il branch visibile nella cronologia.
git merge --squash feature/login git commit -m "Add login"
Mette in stage le modifiche combinate senza registrare un merge; in seguito il branch non risulta unito.
git status # list conflicted files # edit the files, remove <<<<<<< ======= >>>>>>> markers git add file.txt git commit # or: git rebase --continue
Prendi un lato per intero con git restore --ours file.txt o --theirs. Durante un rebase "ours" è il branch su cui stai facendo il rebase, l'opposto di un merge.
git merge --abort
Torna allo stato precedente all'inizio del merge.
Recupero: Le risoluzioni dei conflitti che hai fatto vanno perse. Se avevi modifiche non committate quando è iniziato il merge, --abort potrebbe non riuscire a ripristinarle: fai commit o stash prima del merge.
git switch feature/login git rebase main
Riapplica i tuoi commit sopra main per una cronologia lineare. Risolvi i conflitti, git add, poi git rebase --continue; --abort rinuncia.
Recupero: Subito dopo: git reset --hard ORIG_HEAD. Più tardi: trova la vecchia punta in git reflog.
git rebase -i HEAD~3
Apre un elenco: cambia pick in squash/fixup per combinare, reword per modificare un messaggio, drop per eliminare, oppure riordina le righe.
Recupero: git reflog mostra il commit precedente al rebase; git reset --hard <sha> lo ripristina.
git commit --fixup=a1b2c3d git rebase -i --autosquash a1b2c3d~1
Il commit di fixup viene incorporato automaticamente in a1b2c3d quando fai il rebase.
Recupero: Come per il rebase interattivo: git reflog.
git pull --rebase
git config set --global pull.rebase true # make it the defaultEsegue il rebase dei tuoi commit locali sopra quanto scaricato.
git cherry-pick a1b2c3d
git cherry-pick -x a1b2c3d # note the source in the messageCrea un nuovo commit con le stesse modifiche. Un intervallo: git cherry-pick A..B (esclude A).
Remote: fetch, pull, push
git remote -v git remote set-url origin git@github.com:owner/repo.git
set-url sposta un clone da HTTPS a SSH (o verso un repository rinominato).
git fetch
git fetch --prune # also drop deleted remote branchesAggiorna solo origin/*; i tuoi branch restano intatti.
git pull
git fetch più merge (o rebase, se pull.rebase è impostato).
git push
git push -u origin HEAD # first push of a new branch
git config set --global push.autoSetupRemote trueCon push.autoSetupRemote (Git 2.37+), un semplice git push su un nuovo branch imposta da solo l'upstream.
git push --force-with-lease
A differenza di --force, si rifiuta se il remote ha commit che non hai scaricato. Aggiungi --force-if-includes (Git 2.30+) per maggiore sicurezza con i fetch in background.
Recupero: I commit remoti sovrascritti sopravvivono nel reflog di chi li aveva, e GitHub li mantiene raggiungibili tramite SHA per un certo tempo.
git remote add upstream https://github.com/original/repo.git git fetch upstream git switch main git merge upstream/main
Oppure con GitHub CLI: gh repo sync.
Annullare
Scegli in base a dove si trova l'errore: nella directory di lavoro, nell'area di staging, in un commit locale o in un commit già inviato. Tutto ciò che è stato committato almeno una volta di solito si ritrova con git reflog; le modifiche non committate che scarti no.
git reset --soft HEAD~1
Il commit sparisce; le sue modifiche restano in stage, pronte per un nuovo commit. Usa git reset HEAD~1 (senza --soft) per tenerle invece fuori dallo stage.
Recupero: git reset ORIG_HEAD riporta indietro il commit. Se era già stato inviato, usa invece git revert.
git reset --hard HEAD~1
Sposta il branch indietro di un commit e riporta ogni file tracciato a quello stato.
Recupero: Il commit è in git reflog (le voci non raggiungibili scadono dopo 30 giorni per impostazione predefinita): git reset --hard HEAD@{1}. Le modifiche non committate nei file tracciati sono perse per sempre.
git revert a1b2c3d
git revert HEAD # the latest commitAggiunge un nuovo commit che inverte quello vecchio, così la cronologia degli altri non cambia. È l'annullamento sicuro per i branch condivisi.
git revert -m 1 <merge-sha>
-m 1 mantiene il primo genitore (di solito main). Per unire di nuovo il branch in seguito serve prima un revert di questo revert.
git commit --amend -m "Better message"
Sostituisce l'ultimo commit con uno nuovo. Va bene prima del push; dopo il push richiede --force-with-lease.
Recupero: git reset --soft HEAD@{1} torna al commit precedente all'amend.
git add forgotten.txt git commit --amend --no-edit
Mantiene il messaggio, aggiunge il file.
Recupero: git reset --soft HEAD@{1}.
git restore --staged file.txt
git restore --staged . # everythingClassico: git reset HEAD file.txt
Le modifiche restano nella directory di lavoro; viene annullato solo lo staging.
git restore file.txt
Classico: git checkout -- file.txt
Riporta il file alla versione in stage (o all'ultimo commit se nulla è in stage).
Recupero: Non recuperabile da Git: le modifiche non sono mai state committate. La cronologia locale del tuo editor potrebbe ancora averle.
git restore --staged --worktree .
git clean -fd # also delete untracked filesClassico: git reset --hard
git clean -fd
Torna all'ultimo commit. Esegui prima git clean -n per vedere cosa verrebbe eliminato.
Recupero: Non recuperabile: le modifiche non committate e i file non tracciati vengono eliminati. git stash -u è l'alternativa reversibile.
git restore file.txt # deletion not committed git restore --source=a1b2c3d~1 file.txt # deleted in commit a1b2c3d
Classico: git checkout a1b2c3d~1 -- file.txt
Trova il commit che l'ha eliminato con git log --diff-filter=D -- file.txt.
git restore --source=main -- config.yml
Classico: git checkout main -- config.yml
Sovrascrive solo la copia di lavoro; aggiungi --staged --worktree per metterlo anche in stage. Solo per guardarlo: git show main:config.yml.
Recupero: Le modifiche non committate a quel file vengono sovrascritte.
git reflog git branch rescued a1b2c3d
Il reflog registra ogni posizione in cui è stato HEAD. Trova lo SHA di prima dell'errore e crea un branch lì.
git reset --hard ORIG_HEAD
ORIG_HEAD viene impostato da merge, rebase e reset sulla posizione precedente. Viene sovrascritto dal successivo comando di questo tipo.
Recupero: git reflog elenca ancora il commit di merge.
git reflog # find "rebase (start)"; the entry below it is the old tip
git reset --hard HEAD@{5}Subito dopo il rebase, git reset --hard ORIG_HEAD fa la stessa cosa.
Recupero: --hard scarta le modifiche non committate; mettile prima in stash.
git reset --hard HEAD@{1}HEAD@{1} è dove si trovava HEAD prima dell'ultimo spostamento. Funziona solo per il lavoro committato.
git filter-repo --invert-paths --path secrets.env
git filter-repo è uno strumento separato (pip install git-filter-repo), consigliato dalla documentazione di git-filter-branch. Dopo, ogni clone va rifatto da zero. Cambia comunque il segreto: era pubblico dal momento del push.
Recupero: filter-repo lavora su un clone nuovo; conserva il vecchio clone finché non sei sicuro.
Stash
git stash
git stash push -m "half-done login"
git stash -u # include untracked filesSalva le modifiche tracciate e ripulisce la directory di lavoro, così puoi cambiare branch.
git stash pop # apply and drop git stash apply stash@{1} # apply, keep the stash
Possono esserci conflitti; con pop, lo stash viene conservato se l'applicazione non riesce.
git stash list
git stash show -p stash@{0}Dal più recente; stash@{0} è l'ultimo.
git stash push -- src/login.ts
git stash push --staged # only what is staged (2.35+)Gli stash limitati a dei percorsi lasciano tutto il resto al suo posto.
git stash branch feature/login stash@{0}Crea il branch sul commit in cui hai fatto lo stash, applica lo stash e lo elimina; evita conflitti.
git stash drop stash@{0}
git stash clearclear rimuove tutti gli stash.
Recupero: Uno stash eliminato è un commit non raggiungibile fino alla garbage collection: git fsck --unreachable | grep commit, poi git stash apply <sha>.
Cronologia e diff
git log --oneline --graph --all
Una riga per commit con la struttura dei branch. Su versioni di Git molto vecchie aggiungi --decorate per vedere i nomi dei branch.
git log --follow -p -- path/file.txt
--follow prosegue attraverso le rinomine; -p mostra ogni modifica.
git log -S "functionName" --oneline git log -G "regex" --oneline
-S conta le occorrenze che cambiano; -G confronta ogni riga modificata con una regex.
git log --author="Ana" --since="2 weeks ago" --oneline
Anche --until, --grep="fix" per i messaggi e main..feature per i commit presenti su feature ma non su main.
git show a1b2c3d git show a1b2c3d:path/file.txt
La seconda forma stampa il file com'era in quel commit senza toccare la tua copia.
git diff # unstaged git diff --staged # staged, i.e. what will be committed
--stat riassume per file; --word-diff è migliore per i testi in prosa.
git diff main...feature # changes on feature since it branched git diff main feature # the two tips directly
Tre punti confrontano con la merge base, cioè ciò che mostra una pull request.
git blame -L 10,20 path/file.txt
Aggiungi -w per ignorare gli spazi e -C per seguire le righe spostate da altri file.
git bisect start git bisect bad # current commit is broken git bisect good v1.4.0 # this one worked # test, then mark each step good or bad git bisect reset
Ricerca binaria: circa log2(n) passaggi. git bisect run ./test.sh la automatizza.
git grep -n "TODO"
Più veloce di grep sui repository grandi e salta i file ignorati. Aggiungi un commit per cercare in una vecchia versione.
Tag e release
git tag -a v1.2.0 -m "Release 1.2.0"
git tag -a v1.1.1 a1b2c3d -m "Hotfix" # tag an older commitI tag annotati (-a) memorizzano autore, data e messaggio; preferiscili per le release. git tag v1.2.0 da solo crea un tag leggero.
git tag -d v1.2.0 git push origin --delete v1.2.0
Evita di riutilizzare il nome di un tag di release eliminato: gli altri cloni conservano il vecchio tag.
Recupero: Il commit taggato non viene toccato; ricrea il tag su di esso.
Submodule e worktree
git submodule add https://github.com/owner/lib.git vendor/lib git commit -m "Add lib submodule"
Registra l'URL in .gitmodules e fissa un commit esatto dell'altro repository.
git clone --recurse-submodules <url>
git submodule update --init --recursive # already clonedSenza questo, le cartelle dei submodule sono vuote.
git submodule update --remote git commit -am "Bump submodules"
Scarica il branch tracciato di ciascun submodule; fai il commit dei nuovi riferimenti nel repository padre.
git worktree add ../repo-hotfix hotfix git worktree add -b review ../repo-review origin/main
Una seconda cartella di lavoro che condivide lo stesso repository; niente stash né secondo clone.
git worktree list
git worktree remove ../repo-hotfix
git worktree prune # forget folders deleted by handremove si rifiuta se il worktree ha modifiche non committate (usa --force per forzare).
Pulizia
git clean -n -d
Eseguilo sempre prima di git clean -f.
git clean -fd # untracked files and folders git clean -fdx # also ignored files (build output, .env!)
-x rimuove anche i file ignorati, compresa la configurazione locale come .env.
Recupero: Non recuperabile: questi file non sono mai stati in Git.
git branch --merged main git branch -d branch-a branch-b
Controlla prima l'elenco; -d rifiuta i branch non uniti, quindi provarlo è sicuro.
git fetch --prune git config set --global fetch.prune true
Elimina i riferimenti origin/* i cui branch sono stati cancellati sul server.
git maintenance start git gc
maintenance start pianifica in background prefetch, commit-graph e repack; gc compatta gli oggetti ed elimina subito quelli non raggiungibili.
Configurazione e alias
git config list --show-origin
Classico: git config --list --show-origin
Mostra i valori di sistema, globali e del repository con il file in cui si trova ciascuno.
git config set --global alias.st "status -s" git config set --global alias.lg "log --oneline --graph --all"
Classico: git config --global alias.st "status -s"
Poi git st e git lg. Anteponi ! per eseguire un comando di shell: alias.root "!pwd".
git config set --global pull.rebase true git config set --global push.autoSetupRemote true git config set --global rerere.enabled true git config set --global merge.conflictStyle zdiff3 git config set --global diff.algorithm histogram
Classico: git config --global pull.rebase true
Rebase al pull; upstream automatico al primo push (2.37+); memorizza le risoluzioni dei conflitti; mostra l'antenato comune nei conflitti (2.35+); diff più chiari.
git config set --global core.excludesFile ~/.gitignore_global
Classico: git config --global core.excludesFile ~/.gitignore_global
Per i file superflui di sistema operativo ed editor (.DS_Store, .idea/). Le regole specifiche del progetto vanno nel .gitignore del repository.
Nozioni di base di GitHub CLI (gh)
gh è lo strumento a riga di comando di GitHub, da installare separatamente da Git.
gh auth login
gh auth setup-git # let git use gh for HTTPS credentialsApre un browser o accetta un token; funziona con github.com e GitHub Enterprise.
gh repo create my-app --private --source=. --push
Crea il repository, lo aggiunge come origin e fa il push del branch corrente.
gh repo clone owner/repo
Per un fork, aggiunge anche il repository padre come remote upstream.
gh pr create --fill gh pr create --draft --title "WIP: login" --body "…"
--fill usa i messaggi di commit per titolo e descrizione.
gh pr checkout 123
Scarica il branch della PR (anche da fork) e ci passa.
gh pr list gh pr view 123 --web gh pr merge 123 --squash --delete-branch
gh pr status mostra le PR che ti riguardano.
gh issue create --title "Bug: …" --body "…" gh issue list --assignee @me
gh issue view 42 --comments legge una discussione nel terminale.
gh run list gh run watch
gh run view --log-failed stampa solo i passaggi non riusciti.
Ti serve un .gitignore di partenza? Usa il generatore di .gitignore. Vuoi confrontare due versioni di un file fuori da Git? Il confronto testi (diff) mostra le modifiche affiancate.
Un riferimento statico: la ricerca avviene nel tuo browser e nulla di ciò che digiti viene inviato altrove. Sfoglia tutti gli strumenti gratuiti.
Hai trovato un problema o qualcosa che potrebbe andare meglio? Leggiamo ogni messaggio e sistemiamo le cose in fretta.
Questa guida rapida a Git è organizzata per attività, non per comando, perché nessuno cerca “git reset --soft”: si cerca “annulla l'ultimo commit”. Trova ciò che stai cercando di fare, copia il comando e leggi la spiegazione di una riga su cosa modifica. La ricerca mette al primo posto le attività, quindi “elimina branch remoto” o “rinomina branch” porta dritto alla voce giusta.
I comandi che riscrivono la cronologia o buttano via lavoro sono segnalati, con una nota su cosa si può recuperare: quasi tutto ciò che è stato committato almeno una volta si può ritrovare con git reflog, mentre le modifiche non committate che scarti con restore, reset --hard o clean sono perse. Dove Git ora ha un comando più chiaro (git switch e git restore dalla 2.23, git config set e list dalla 2.46), viene mostrato per primo con la forma classica accanto, così il prontuario funziona sia che il tuo team abbia imparato Git l'anno scorso sia nel 2010. Verificato sul riferimento di git-scm.com per Git 2.56.
Come si usa
- Scrivi ciò che vuoi fare nella casella di ricerca, per esempio “annulla l'ultimo commit”, “unstage” o “squash commit”, oppure fai clic su una delle attività comuni.
- Leggi i badge prima di eseguire qualcosa: ambra significa che il comando riscrive la cronologia, rosso che può scartare lavoro. La nota di recupero spiega come tornare indietro.
- Fai clic su Copia il comando. La copia esclude i commenti # così si incolla pulita in un terminale; sostituisci i segnaposto come a1b2c3d o feature/login con i tuoi valori.
- Condividi una risposta precisa con il link # accanto a ogni attività, oppure stampa l'intero prontuario come PDF a due colonne.
Domande frequenti
Come si annulla l'ultimo commit in Git?
Se non l'hai ancora pushato, git reset --soft HEAD~1 rimuove il commit e lascia le modifiche nell'area di staging, mentre git reset HEAD~1 le lascia fuori dallo staging. git reset --hard HEAD~1 rimuove il commit e le sue modifiche. Se il commit è già stato pushato su un branch condiviso, usa invece git revert HEAD, che aggiunge un nuovo commit che lo annulla senza riscrivere la cronologia di nessuno.
Qual è la differenza tra git reset, git restore e git revert?
git restore modifica i file: scarta le modifiche nella working tree o le toglie dallo staging, e non sposta mai un branch. git reset sposta il branch corrente su un altro commit (e con --hard sovrascrive anche i tuoi file), quindi riscrive la cronologia. git revert crea un nuovo commit che applica l'opposto di uno precedente; la cronologia cresce soltanto, il che lo rende la scelta sicura sui branch usati da altre persone.
Come si rinomina un branch Git, in locale e sul remoto?
git branch -m nuovo-nome rinomina il branch su cui ti trovi (git branch -m vecchio nuovo per un altro). I remoti non hanno un'operazione di rinomina, quindi pusha il nuovo nome con git push -u origin nuovo-nome ed elimina il vecchio con git push origin --delete vecchio-nome. Su GitHub, rinominare il branch dall'interfaccia web aggiorna anche le pull request aperte.
Meglio git switch o git checkout?
Funzionano entrambi. git checkout fa due lavori che non c'entrano l'uno con l'altro, cambiare branch e ripristinare file, ed è per questo che Git 2.23 li ha separati in git switch e git restore. I nuovi comandi sono più chiari e più difficili da usare male (git checkout -- file scarta le modifiche senza avvisare), quindi questo prontuario li mostra per primi. git checkout non è deprecato e ogni comando qui riporta il suo equivalente classico.
Posso recuperare un commit dopo git reset --hard?
Di solito sì. Esegui git reflog, trova la riga precedente al reset ed esegui git reset --hard HEAD@{n} oppure crea un branch su quello SHA. Per impostazione predefinita, i commit restano raggiungibili tramite il reflog per 30 giorni da quando nient'altro punta a loro. Ciò che non si può recuperare è il lavoro non committato: le modifiche mai committate né messe in stash vengono sovrascritte per sempre.
Cosa fa git push --force-with-lease?
Sovrascrive il branch remoto solo se il remoto punta ancora dove lo ha visto il tuo ultimo fetch. Se nel frattempo qualcuno ha pushato, il push viene rifiutato invece di cancellare silenziosamente i suoi commit, che è ciò che fa il semplice --force. Usalo dopo un rebase o un amend su un branch che hai già pushato.
Quale comando per annullare? Decidi in base a dove si trova la modifica
• Hai modificato un file e vuoi eliminare la modifica: git restore file. Non recuperabile, perché non è mai stata committata.
• Hai messo qualcosa in staging per errore: git restore --staged file. Non si perde nulla; la modifica resta nel file.
• Hai committato ma non pushato: git reset --soft HEAD~1 per rifare il commit, oppure git commit --amend per correggerlo sul posto.
• Hai committato e pushato su un branch condiviso: git revert <sha>. Non fare reset di un branch che altri hanno già scaricato.
• Hai perso un commit, un branch o il risultato di un rebase andato male: git reflog, poi git branch rescued <sha>.
La regola di fondo: tutto ciò che riscrive i commit va bene finché i commit sono solo tuoi, e diventa un problema di tutti una volta condivisi.
Merge o rebase?
Entrambi portano le modifiche di un branch in un altro. Un merge registra che due cronologie si sono unite, con un commit di merge che ha due genitori; nulla viene riscritto, quindi è sempre sicuro sui branch condivisi. Un rebase riapplica i tuoi commit sopra l'altro branch, producendo una cronologia lineare come se fossi partito dall'ultimo commit, ma crea nuovi ID di commit, quindi chi ha già quelli vecchi deve riallinearsi.
Una convenzione di team comune: fai il rebase del tuo branch di funzionalità su main per restare aggiornato (git pull --rebase, oppure git rebase main) e fai il merge del branch finito in main tramite una pull request. Lo squash merge produce un solo commit per funzionalità su main; i merge normali conservano ogni commit e la forma del branch. Scegline uno per repository e impostalo nelle impostazioni dell'hosting, così la cronologia resta coerente.
Impostazioni di Git che vale la pena cambiare rispetto ai valori predefiniti
• pull.rebase true: git pull fa un rebase invece di creare commit di merge a ogni sincronizzazione.
• push.autoSetupRemote true (Git 2.37+): il primo git push di un nuovo branch ne imposta l'upstream, senza bisogno di -u.
• merge.conflictStyle zdiff3 (Git 2.35+): i marcatori di conflitto includono l'antenato comune, il che rende evidente la maggior parte dei conflitti.
• rerere.enabled true: Git ricorda come hai risolto un conflitto e riapplica la soluzione quando lo stesso conflitto si ripresenta durante un rebase.
• fetch.prune true: i branch remoti eliminati sul server spariscono anche in locale al fetch successivo.
• init.defaultBranch main: i nuovi repository partono su main.
Strumenti gratuiti correlati
- Generatore di .gitignore — Combina template .gitignore per linguaggi, framework, editor e sistemi operativi in un unico file pulito.
- Confronto testi (diff) — Confronta due versioni di un testo, di codice o di un file JSON e vedi esattamente quali righe, parole e caratteri sono cambiati.
- Guida rapida Markdown — Ogni elemento Markdown con sorgente e anteprima, sintassi estesa (tabelle, elenchi di attività, note a piè di pagina, formule, Mermaid, avvisi), una tabella di compatibilità per 9 piattaforme e un'area di prova dal vivo.
- Guida rapida alle regex — Ogni token delle espressioni regolari con un esempio funzionante, il supporto in JavaScript, PCRE/PHP, Python, Go, Java e .NET e un link Provalo che apre il tester regex già compilato.