Table of Contents
- 05 - Sincronizzazione
- git fetch
- Sintassi
- Spiegazione
- Esempi pratici
- Workflow tipico fetch
- Vedere cosa ha scaricato fetch
- Fetch vs Pull
- Opzioni comuni
- Note
- git pull
- Sintassi
- Spiegazione
- Esempi pratici
- Configurare comportamento pull
- Workflow quotidiano
- Gestire conflitti dopo pull
- Pull con stash automatico
- Pull di tutti i branch
- Opzioni comuni
- Note
- git push
- Sintassi
- Spiegazione
- Esempi pratici
- Workflow completo locale → remoto
- Primo push di repository nuovo
- Push dopo rebase (force necessario)
- Autenticazione HTTPS
- Errori comuni push
- Push vs Force Push
- Opzioni comuni
- Note
- 🔗 Collegamenti
- 📝 Riepilogo comandi
05 - Sincronizzazione
Comandi per sincronizzare il repository locale con i repository remoti (Forgejo).
git fetch
Sintassi
git fetch [remote]
git fetch [remote] [branch]
git fetch [opzioni]
Spiegazione
Scarica le modifiche dal repository remoto senza unirle al tuo branch locale. Aggiorna i branch remoti (origin/main, origin/develop, ecc.) permettendoti di vedere cosa è cambiato prima di integrare.
Esempi pratici
Fetch da remote default (origin):
git fetch
Fetch da remote specifico:
git fetch origin
Fetch branch specifico:
git fetch origin main
Fetch tutti i remote:
git fetch --all
Fetch con prune (rimuovi branch remoti eliminati):
git fetch -p
# oppure
git fetch --prune
Rimuove riferimenti locali a branch cancellati sul server.
Fetch con info dettagliate:
git fetch -v
# oppure
git fetch --verbose
Workflow tipico fetch
# 1. Scarica aggiornamenti
git fetch origin
# 2. Vedi cosa è cambiato
git log HEAD..origin/main --oneline
# 3. Vedi diff
git diff HEAD origin/main
# 4. Decidi se mergere
git merge origin/main
# oppure
git rebase origin/main
Vedere cosa ha scaricato fetch
# Dopo fetch, confronta con remote
git log --oneline HEAD..origin/main # Commit nel remote non in locale
git log --oneline origin/main..HEAD # Commit in locale non nel remote
Fetch vs Pull
| Aspetto | Fetch | Pull |
|---|---|---|
| Scarica | ✅ Sì | ✅ Sì |
| Merge automatico | ❌ No | ✅ Sì |
| Sicurezza | ✅ Safe | ⚠️ Può creare conflitti |
| Quando usarlo | Quando vuoi vedere prima | Quando sei sicuro |
Opzioni comuni
| Opzione | Descrizione |
|---|---|
--all |
Tutti i remote |
-p, --prune |
Rimuovi ref obsoleti |
-v |
Verbose |
--tags |
Fetch anche tag |
--dry-run |
Simula senza scaricare |
Note
- Fetch è sempre safe - non modifica working directory
- Buona pratica: fetch regolarmente per restare aggiornato
- Dopo fetch, branch remoti sono in
origin/branch-name
git pull
Sintassi
git pull [remote] [branch]
git pull [opzioni]
Spiegazione
Scarica modifiche dal remote E le unisce (merge) al branch corrente. Equivale a: git fetch + git merge.
Esempi pratici
Pull da remote default:
git pull
Scarica e merge dal remote/branch configurato per il branch corrente.
Pull da remote e branch specifici:
git pull origin main
Pull con rebase invece di merge:
git pull --rebase
# oppure
git pull -r
Equivale a: git fetch + git rebase.
Pull forzando merge (no fast-forward):
git pull --no-ff
Pull solo se fast-forward possibile:
git pull --ff-only
Fallisce se c'è divergenza (più sicuro).
Configurare comportamento pull
Impostare rebase come default:
git config --global pull.rebase true
Impostare fast-forward only:
git config --global pull.ff only
Workflow quotidiano
All'inizio della giornata:
git switch main
git pull origin main
git switch feature-mia
git merge main # Porta novità nel branch feature
Prima di pushare:
# Sul tuo branch feature
git pull --rebase origin main
# Risolvi eventuali conflitti
git push origin feature-mia
Gestire conflitti dopo pull
git pull origin main
# CONFLICT...
# 1. Vedi file in conflitto
git status
# 2. Risolvi conflitti nei file
# (modifica, rimuovi marker <<<<, ====, >>>>)
# 3. Staging file risolti
git add file-risolto.txt
# 4. Completa merge
git commit
Pull con stash automatico
Se hai modifiche non committate:
# Pull fallisce
git pull
# error: Your local changes would be overwritten
# Opzione 1: Stash + pull + stash pop
git stash
git pull
git stash pop
# Opzione 2: Pull con autostash (Git 2.27+)
git pull --autostash
Pull di tutti i branch
# Fetch tutti i branch
git fetch --all
# Switch e pull per ogni branch
git switch main
git pull origin main
git switch develop
git pull origin develop
Opzioni comuni
| Opzione | Descrizione |
|---|---|
--rebase, -r |
Rebase invece di merge |
--ff-only |
Solo fast-forward |
--no-ff |
Sempre commit di merge |
--autostash |
Stash automatico |
-v |
Verbose |
Note
- Pull può creare conflitti - fetch è più sicuro per esplorazione
- Default pull fa merge (configurabile con rebase)
- Prima di pull:
git statusper verificare stato pulito
git push
Sintassi
git push [remote] [branch]
git push [opzioni]
Spiegazione
Carica i commit locali sul repository remoto. Sincronizza il tuo lavoro con il server Forgejo.
Esempi pratici
Push al remote configurato:
git push
Push specificando remote e branch:
git push origin main
Primo push di branch (crea branch remoto):
git push -u origin feature-nuova
# oppure
git push --set-upstream origin feature-nuova
Il flag -u salva la configurazione per push/pull futuri.
Push di tutti i branch:
git push --all origin
Push forzato (PERICOLOSO!):
git push --force origin main
# oppure versione più sicura
git push --force-with-lease origin main
⚠️ Sovrascrive cronologia remota. Usa solo se:
- È tuo branch personale
- Hai fatto rebase/amend
- Sai cosa stai facendo
Push eliminando branch remoto:
git push origin --delete feature-vecchia
# oppure sintassi alternativa
git push origin :feature-vecchia
Push di tag:
git push origin v1.0.0 # Tag specifico
git push origin --tags # Tutti i tag
git push origin --follow-tags # Solo tag annotati su commit pushati
Push dry-run (simula senza pushare):
git push --dry-run origin main
Workflow completo locale → remoto
# 1. Lavoro locale
git add .
git commit -m "Add new feature"
# 2. Verifica branch
git status
git log --oneline -3
# 3. Pull ultime modifiche (evita conflitti)
git pull origin main
# 4. Push al server
git push origin main
# 5. Verifica su Forgejo
# Vai su https://git.emanuelegori.uno/user/repo
Primo push di repository nuovo
# 1. Repository locale esistente
git init
git add .
git commit -m "Initial commit"
# 2. Crea repository su Forgejo (via web UI)
# 3. Collega remote
git remote add origin https://git.emanuelegori.uno/emanuele/mio-progetto.git
# 4. Primo push
git push -u origin main
Push dopo rebase (force necessario)
# Hai fatto rebase locale
git rebase -i HEAD~3
# Push fallisce (cronologia riscritta)
git push origin feature
# ! [rejected] feature -> feature (non-fast-forward)
# Force push (solo su TUO branch!)
git push --force-with-lease origin feature
Autenticazione HTTPS
Al primo push, Git chiede credenziali:
git push origin main
Username for 'https://git.emanuelegori.uno': emanuele
Password for 'https://emanuele@git.emanuelegori.uno': [INCOLLA TOKEN]
Con credential helper configurato, non chiede più.
Errori comuni push
1. Push rifiutato (non fast-forward):
git push origin main
# ! [rejected] main -> main (non-fast-forward)
# Soluzione: pull prima
git pull origin main
git push origin main
2. No upstream configurato:
git push
# fatal: The current branch has no upstream branch
# Soluzione: configura upstream
git push -u origin main
3. Autenticazione fallita:
git push
# fatal: Authentication failed
# Soluzione: verifica token PAT
# Rigenera token su Forgejo se necessario
Push vs Force Push
Normal Push:
- ✅ Safe
- ✅ Preserva cronologia remota
- ❌ Fallisce se cronologia diverge
Force Push:
- ⚠️ Pericoloso
- ⚠️ Sovrascrive cronologia remota
- ✅ Necessario dopo rebase/amend
Force with Lease:
git push --force-with-lease origin feature
Più sicuro: fallisce se qualcun altro ha pushato nel frattempo.
Opzioni comuni
| Opzione | Descrizione |
|---|---|
-u, --set-upstream |
Configura upstream |
--all |
Tutti i branch |
--tags |
Push tag |
--force, -f |
Force push |
--force-with-lease |
Force push sicuro |
--delete |
Elimina branch remoto |
--dry-run |
Simula |
-v |
Verbose |
Note
- Mai force push su branch condivisi (main, develop)
- Verifica sempre con
git statusprima di push - Pull prima di push evita conflitti
- Push spesso per backup del lavoro
🔗 Collegamenti
- Precedente: ← History
- Prossimo: Tag →
- Indice: ← Torna all'indice
📝 Riepilogo comandi
# FETCH
git fetch # Scarica da origin
git fetch origin main # Branch specifico
git fetch --all # Tutti i remote
git fetch -p # Con prune
# PULL
git pull # Fetch + merge
git pull origin main # Da remote/branch specifico
git pull --rebase # Con rebase
git pull --ff-only # Solo fast-forward
# PUSH
git push # Push configurato
git push origin main # A remote/branch specifico
git push -u origin main # Primo push + config upstream
git push --force-with-lease # Force push sicuro
git push origin --delete branch # Elimina branch remoto
git push origin --tags # Push tag