Branch Git divergente: merge o rebase
I blocchi sono casi diversi, non un unico script. Scegli il caso del tuo repository. Sostituisci branch, percorsi e VERIFIED_COMMIT prima dell’uso. I comandi di annullamento valgono solo per la propria operazione attiva; non eseguire entrambe le alternative.
Risposta breve
Un branch diverge quando punta locale e upstream hanno commit assenti dall’altro lato. Fai fetch, controlla entrambe le storie e scegli l’integrazione. Merge le conserva; rebase riapplica commit locali sull’upstream cambiandone gli ID. L’avviso descrive il grafo, non dimostra perdita di file.
Esempio e condizioni
L’esempio usa main che segue origin/main, con due commit locali e uno remoto. Verifica nomi reali e upstream. Fetch aggiorna il riferimento remoto senza integrare da solo la storia nel branch attuale. Un remote rinominato o un branch senza upstream necessita di nomi adattati.
Controlla prima di modificare
Leggi status e branch -vv prima di fetch origin. Il conteggio destra/sinistra di HEAD...origin/main mostra commit esclusivi dei due lati. Controlla grafo e patch: due contro uno non dice se cambiano la stessa funzione. Un riferimento remoto vecchio o il solo conteggio non bastano.
git status --short
git branch -vv
git fetch origin
git rev-list --left-right --count HEAD...origin/main
git log --oneline --graph --decorate HEAD origin/mainConserva un riferimento o checkout separato
Crea rescue/before-sync alla punta locale e salva le modifiche senza commit separatamente. Un branch conserva storia confermata; uno stash verificato copre diversamente file tracciati, nuovi e ignorati. Controlla la copia. Integrare sopra lavoro locale estraneo rende conflitti e recupero più difficili da capire.
git branch rescue/before-sync HEADPrimo percorso
Scegli merge per mantenere la storia, soprattutto con commit locali già condivisi. Merge origin/main combina upstream scaricato e branch attuale, normalmente registrando entrambi i genitori nella divergenza. Controlla diff e verifiche del progetto prima di pubblicare. Un merge completato non garantisce codice combinato corretto.
git merge origin/mainScegli consapevolmente l’altro risultato
Scegli rebase per commit locali che il team permette di riscrivere. Rebase origin/main riapplica il lavoro sulla punta scaricata, normalmente con nuovi ID. Altri possono dipendere dagli originali. Un grafo lineare non autorizza riscrivere branch condivisi o aggirare le loro protezioni.
git rebase origin/mainLimiti ed eccezioni
Per conflitti di merge, leggi status, risolvi e prepara i file e termina; merge --abort abbandona l’integrazione quando le condizioni lo consentono. Nel rebase risolvi il conflitto attuale e usa rebase --continue: può fermarsi più volte. Rebase --abort annulla il rebase attivo; non mescolare i flussi.
git status
git merge --abort
git rebase --abortConflitti e pulizia
Reset --hard origin/main non è una soluzione generica: toglie dal branch la sua storia locale separata e può sovrascrivere file tracciati. È la scelta di scartare lavoro, mentre qui uniamo storie volute. Per abbandonare commit, esaminali e conserva le copie necessarie in un altro procedimento.
Verifica il risultato
Controlla grafo, stato e differenza da origin/main, poi le verifiche pertinenti. Un push normale può essere respinto se il remoto è avanzato dopo fetch. Scarica e rivedi il nuovo stato, senza passare automaticamente a force push. Conserva il recupero fino alla verifica degli effetti dell’integrazione.
git status --short
git log -8 --oneline --graph --decorate
git diff origin/main HEADDomande frequenti
Perché pull chiede una strategia? Comprende fetch e una scelta d’integrazione potenzialmente ambigua. Merge evita conflitti? No, entrambi possono averli. Rebase è sempre migliore? No: condivisione dei commit e politica del team contano più di una preferenza universale.
Esamina l’operazione in FluxGit
Usa la storia visiva e la vista delle modifiche di FluxGit per esaminare l’operazione e i commit pertinenti. Mantieni le verifiche di branch, condivisione e file locali dell’esempio. La pagina di download mostra build e piattaforme disponibili.