Come Risolvere l'Errore Git "fatal: Not possible to fast-forward, aborting"

Pubblicato 26 gennaio 2026

Quando lavori su un repository Git condiviso, potresti vedere l'errore "fatal: Not possible to fast-forward, aborting". Questo succede quando il tuo branch locale e il branch remoto si sono separati, il che significa che il branch remoto ha nuovi commit che non sono presenti nel tuo branch locale. In questo articolo vedremo i passaggi per risolvere questo errore e parleremo di alcune buone abitudini per prevenirlo in futuro.

Risoluzione

Passaggio 1: Ottenere le ultime modifiche dal branch remoto

Per risolvere l'errore "fatal: Not possible to fast-forward, aborting", usa il comando git fetch per ottenere le ultime modifiche dal repository remoto. git fetch aggiorna la tua copia locale del branch remoto senza unire le modifiche nel tuo branch corrente. Questo ti permette di vedere i nuovi commit sul branch remoto senza modificare il tuo branch locale.

git fetch origin

Questo comando ottiene le ultime modifiche dal repository remoto chiamato "origin".

Passaggio 2: Controllare la differenza tra branch locali e remoti

Dopo aver ottenuto le ultime modifiche, usa git status per controllare lo stato attuale del tuo branch locale. Confronta la punta del tuo branch locale con la punta del branch remoto. Questo ti aiuterà a trovare eventuali modifiche in conflitto tra i branch. Se il branch remoto ha nuovi commit che non sono presenti nel tuo branch locale, dovrai aggiungere queste modifiche.

git status

L'output ti mostrerà il branch corrente, il suo collegamento con il branch remoto ed eventuali modifiche non committate.

Passaggio 3: Scegliere un modo per aggiungere le modifiche remote

Ci sono due modi comuni per aggiungere le modifiche remote al tuo branch locale: merge e rebase.

  • git merge combina le modifiche remote con le tue modifiche locali, creando un nuovo commit di merge.
  • git rebase mette i tuoi commit locali sopra le modifiche remote, fornendo una cronologia lineare senza un commit di merge.

Scegli il modo che funziona meglio per la tua situazione e il tuo flusso di sviluppo.

Metodo Descrizione Quando Usarlo
git merge Combina le modifiche remote con quelle locali, creando un commit di merge - Quando lavori su un branch condiviso
- Per mantenere la cronologia dei commit
git rebase Mette i commit locali sopra le modifiche remote, fornendo una cronologia lineare - Quando lavori su un feature branch
- Per mantenere una cronologia dei commit pulita

Passaggio 4a: Unire le modifiche remote usando git merge

Se scegli git merge, esegui il comando git merge <remote-branch> per unire le modifiche remote nel tuo branch locale. Se ci sono modifiche in conflitto, git ti chiederà di risolvere i conflitti di merge manualmente. Dopo aver risolto i conflitti, prepara le modifiche e crea un nuovo commit per completare il processo di merge. Questo creerà un commit di merge nella cronologia del tuo branch.

git merge origin/main

Questo comando unisce le modifiche dal branch remoto "origin/main" nel tuo branch locale corrente.

Passaggio 4b: Fare il rebase dei commit locali sopra le modifiche remote usando git rebase

Se preferisci git rebase, esegui il comando git pull --rebase per fare il rebase dei tuoi commit locali sopra le modifiche remote. Questo applicherà i tuoi commit locali uno per uno sopra la punta del branch remoto. Se ci sono modifiche in conflitto durante il processo di rebase, git metterà in pausa e ti permetterà di risolvere i conflitti per ogni commit. Dopo aver risolto i conflitti, continua il processo di rebase fino a quando tutti i commit saranno applicati. Il rebase crea una cronologia lineare senza un commit di merge.

git pull --rebase

Questo comando ottiene le ultime modifiche dal repository remoto e fa il rebase dei tuoi commit locali sopra di esse.

Passaggio 5: Inviare il branch locale aggiornato al repository remoto

Una volta che hai unito o fatto il rebase con successo delle modifiche remote nel tuo branch locale, usa il comando git push per inviare il branch locale aggiornato al repository remoto. Questo renderà le tue modifiche disponibili agli altri sviluppatori che lavorano sullo stesso branch. Se hai usato git rebase, potrebbe essere necessario usare git push --force per sovrascrivere il branch remoto con il tuo branch locale dopo il rebase.

git push origin main

Questo comando invia le modifiche dal tuo branch locale al branch remoto chiamato "main" sul repository "origin".

Causa

Cosa causa questo errore git?

L'errore "fatal: Not possible to fast-forward, aborting" si verifica quando il tuo branch locale e il branch remoto sono divergenti. Questo significa che il branch remoto ha nuovi commit che non sono presenti nel tuo branch locale. Quando questo accade, git non può eseguire un merge fast-forward.

Un merge fast-forward è possibile solo quando il tuo branch locale è direttamente dietro il branch remoto in termini di cronologia dei commit. Se il tuo branch locale ha commit che il branch remoto non ha, o se il branch remoto ha commit che il tuo branch locale non ha, git non può eseguire un merge fast-forward.

Ecco un diagramma che illustra la situazione:

graph TD A[Branch Remoto] --> B[Commit 1] B --> C[Commit 2] C --> D[Commit 3] E[Branch Locale] --> B E --> F[Commit 4]

In questo esempio, il branch remoto ha i commit 1, 2 e 3, mentre il branch locale ha i commit 1 e 4. Poiché i branch sono divergenti, un merge fast-forward non è possibile.

Cos'è un merge fast-forward in git?

Un merge fast-forward è un tipo di merge che si verifica quando il tuo branch corrente è un antenato del branch che stai cercando di unire. In altre parole, il branch in cui stai facendo il merge non è divergente dal tuo branch corrente.

In un merge fast-forward, git sposta semplicemente il puntatore del tuo branch corrente in avanti verso l'ultimo commit del branch che stai unendo. Questo è possibile perché non ci sono modifiche in conflitto tra i branch.

Ecco un esempio di merge fast-forward:

graph TD A[Branch A] --> B[Commit 1] B --> C[Commit 2] C --> D[Commit 3] E[Branch B] --> C

In questo caso, il Branch B può essere portato avanti velocemente all'ultimo commit del Branch A (Commit 3) perché il Branch B è direttamente dietro il Branch A in termini di cronologia dei commit.

Il merge fast-forward non è possibile quando i branch sono divergenti, cioè entrambi i branch hanno commit unici che l'altro branch non ha.

Perché git interrompe il processo di merge?

Git interrompe il processo di merge per prevenire la perdita della cronologia dei commit. Se git permettesse al merge di continuare nonostante i branch siano divergenti, potrebbe portare alla perdita di commit da uno dei branch.

Interrompendo il merge, git mantiene l'integrità della cronologia dei commit del tuo repository. Previene la creazione di un commit di merge che potrebbe perdere modifiche importanti fatte in uno dei due branch.

Invece di unire automaticamente i branch divergenti, git richiede di integrare le modifiche remote nel tuo branch locale usando git merge o git rebase. In questo modo, hai il controllo su come vengono aggiunte le modifiche e puoi risolvere eventuali conflitti che potrebbero sorgere durante il processo.

Ecco una tabella che riassume i motivi per cui git interrompe il processo di merge:

Motivo Spiegazione
Prevenire la perdita della cronologia dei commit Interrompere il merge previene la perdita di commit da entrambi i branch
Mantenere l'integrità del repository Evita di creare un commit di merge che potrebbe perdere modifiche importanti
Richiedere integrazione esplicita Permette il controllo dell'utente sull'aggiunta delle modifiche e la risoluzione dei conflitti

Interrompendo il merge e richiedendo un'integrazione esplicita, git si assicura che tu sia consapevole dei branch divergenti e possa prendere decisioni su come procedere con l'unione delle modifiche.

Buone Pratiche

Mantenere il tuo branch locale aggiornato con il branch remoto

Per evitare l'errore "fatal: Not possible to fast-forward, aborting", è importante mantenere il tuo branch locale aggiornato con il branch remoto. Ecco alcuni passaggi che puoi seguire:

  1. Ottenere le ultime modifiche dal branch remoto:

    git fetch
  2. Unire o fare il rebase delle modifiche nel tuo branch locale:

    • Usando merge:
      git merge origin/main
    • Usando rebase:
      git pull --rebase

Considera di eseguire questi comandi frequentemente, soprattutto prima di iniziare un nuovo lavoro o inviare le tue modifiche al repository remoto. Mantenendo il tuo branch locale sincronizzato con il branch remoto, riduci il rischio di incontrare l'errore "fatal: Not possible to fast-forward, aborting".

Esempio di flusso di lavoro

graph TD A[Inizio] --> B[Ottieni modifiche] B --> C{Merge o Rebase?} C -->|Merge| D[Unisci modifiche] C -->|Rebase| E[Fai rebase delle modifiche] D --> F[Continua a lavorare] E --> F F --> G{Pronto per inviare?} G -->|Sì| H[Invia modifiche] G -->|No| F H --> I[Fine]

Usare branch e pull request per lo sviluppo collaborativo

Per migliorare lo sviluppo collaborativo e ridurre i conflitti, usa una strategia di branching e le pull request:

  1. Crea branch separati per diverse funzionalità, correzioni di bug o esperimenti
  2. Lavora sul feature branch e committa le modifiche localmente
  3. Invia il feature branch al repository remoto
  4. Crea una pull request per unire le modifiche nel branch principale
  5. Rivedi, discuti e testa le modifiche durante il processo di pull request
  6. Risolvi eventuali conflitti o problemi prima di fare il merge
  7. Unisci la pull request nel branch principale