1 05-Sincronizzazione
Emanuele edited this page 2025-12-25 13:22:54 +01:00

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
Merge automatico No
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 status per 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 status prima di push
  • Pull prima di push evita conflitti
  • Push spesso per backup del lavoro

🔗 Collegamenti


📝 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