Git rifiuta di unire storie non correlate su rebase


2152

Durante git rebase origin/developmentil seguente messaggio di errore viene mostrato da Git:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

La mia versione Git è 2.9.0. Funzionava bene nella versione precedente.

Come posso continuare questo rebase consentendo storie non correlate con la bandiera forzata introdotta nella nuova versione?


12
@Shishya Con tutto il rispetto la risposta più votata non risolve questa domanda in modo diretto. La domanda chiede una git-rebasesituazione mentre la risposta dà una bandiera pergit-merge
Shubham Chaudhary,

13
@AsifMohammed non è a questo che serve una risposta accettata . Le persone troveranno automaticamente la risposta con il maggior numero di voti a causa dell'ordinamento predefinito in base ai voti.
Glorfindel,

2
Nel caso in cui qualcun altro abbia commesso lo stesso errore, ho ricevuto questo errore dopo aver utilizzato accidentalmente git pull [repo URL]invece digit clone [repo URL]
rsoren


35
È stato fatto un casino qui dal fatto che il titolo non specifica che questo è nel contesto di un rebase, quindi la tua domanda sta attirando Googler che stanno ottenendo questo errore in contesti diversi e votando una risposta che in realtà non lo fa applica alla domanda che hai posto. Non può essere facilmente ripulito ora, quindi la coppia di domande e risposte incoerente rimarrà sul sito e rimarrà nei risultati di ricerca di Google per sempre. La morale della storia è che i titoli delle domande contano!
Mark Amery,

Risposte:


2618

Il comportamento predefinito è cambiato da Git 2.9:

"git merge" utilizzato per consentire la fusione di due filiali che non hanno una base comune per impostazione predefinita, che ha portato a una storia nuova di zecca di un progetto esistente creato e quindi viene trascinata da un manutentore ignaro, che ha permesso una storia parallela non necessaria unita al progetto esistente . Il comando è stato insegnato a non consentire ciò per impostazione predefinita , con --allow-unrelated-historiesun'opzione di tratteggio di escape da utilizzare in un raro evento che unisce la storia di due progetti che hanno iniziato la loro vita in modo indipendente.

Consulta il log delle modifiche della versione Git per ulteriori informazioni.

È possibile utilizzare --allow-unrelated-historiesper forzare la fusione.


18
Conosci il cambiamento di unione ma questa opzione non funziona con rebase
Shubham Chaudhary,

3
C'è qualche opzione che si accenderà --allow-unrelated-historiespermanentemente?
jmarceli,

4
@jmarceli "Poiché tale" unione di due progetti "è un evento raro, non viene aggiunta un'opzione di configurazione per consentire sempre tale unione." Quindi no.
blue112,

2
Ho provato a unire un ramo per un repository diverso in questo modo, ma ha creato un nuovo commit sul mio ramo corrente e non ha mantenuto la cronologia dell'altro repository. Quindi ho verificato un ramo locale dall'altro repository e solo allora l'ho unito e improvvisamente è apparso un normale commit di unione. Strano.
mgol,

13
Eccellente, funziona anche con git pull. È stato in quel "raro evento che unisce storie di due progetti che hanno iniziato la loro vita in modo indipendente". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia,

1192

Nel mio caso, l'errore era solo fatal: refusing to merge unrelated historiesad ogni tentativo, in particolare la prima richiesta pull dopo aver aggiunto in remoto un repository Git.

L'utilizzo del --allow-unrelated-historiesflag ha funzionato con una richiesta pull in questo modo:

git pull origin branchname --allow-unrelated-histories

232
Vedo sempre questo errore se quando creo un nuovo repository Github con un README.md, quindi lo tiro per la prima volta in un repository locale. Così fastidioso.
Tien Do,

29
Per i nuovi repository, primi pull, in genere è meglio iniziare con a git clone.
Ombrello


2
Questo mi ha fermato per diverse ore, prima che mi rendessi conto che doveva esserci un'ovvia risoluzione per unire file come questo se si verifica per i file predefiniti - Sono contento di non essere l'unico ad avere almeno questo problema!
Zibbobz

3
Nel mio caso è successo perché ho aggiunto il file di licenza su github. Il comando menzionato sopra (e sotto, sono gli stessi) ha funzionato.
uudaddy,

582

Prova il seguente comando:

git pull origin master --allow-unrelated-histories

Questo dovrebbe risolvere il tuo problema.


266

Ho ricevuto questo errore quando ho impostato prima un repository locale. Quindi sono andato su GitHub e ho creato un nuovo repository. Poi ho corso

git remote add origin <repository url>

Quando ho provato a spingere o tirare, ho avuto sempre lo stesso fatal: unrelated_historieserrore.

Ecco come l'ho risolto:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

Penso che fossimo nella stessa barca. Per aggiungere qualcosa: il mio problema era che c'era già qualcosa sul repository remoto. Quindi nella mia cartella, ha eliminato la .gitcartella, eseguito git inite fatto ciò che Adithya ha detto, ad eccezione della parte di unione.
codepleb

1
Come premere il tasto INSERT su Mac? In realtà, devo digitare il messaggio di commit e unire dalla riga di comando, ma non so come farlo dalla riga di comando.
Shajeel Afzal,

Apre vim? Se lo fa, è solo MAIUSC +:
Adithya Bhat l'

Anche io avevo creato prima il repository GitHub e stavo passando quei comandi per aggiungere il repository.
Sig. Suryaa Jha,

1
Questa è davvero una buona risposta Il punto è che devi forzare pull e unire il repository locale e remoto.
alanwsx,


136
git pull origin <branch> --allow-unrelated-histories

Verrai indirizzato a una finestra di modifica di Vim:

  • Inserisci il messaggio di commit
  • Quindi premere Esc(per uscire dalla modalità "Inserisci"), quindi :(due punti), quindi x(piccola "x") e infine premere per uscire Enterda Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X non ti farà uscire da Vim
Ruben il

ma :x<Enter>sarà
webKnjaZ il

Grazie per aver specificato come uscire; Ero completamente perso e tutte le altre risposte sembrano presumere che sia ovvio!
Still_learning

101

Ho avuto lo stesso problema. Prova questo:

git pull origin master --allow-unrelated-histories 

git push origin master

47

Provare git pull --rebase development


Questo ha risolto il mio problema. Ecco come è iniziato il problema
Harlan Nelson,

1
Questo dovrebbe probabilmente essere:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri,

3
@RiccardoMurri Avendolo appena provato, non lo farei più. Il mio nuovo repository conteneva alcuni file di inizializzazione di esempio e il mio repository locale per mesi valeva il commit. L'esecuzione di questo (con newOrigin branchpiuttosto che development) ha aggiunto il commit iniziale nella parte superiore del mio ramo locale, rimuovendo praticamente quasi tutto da esso. Volevo che il commit iniziale dal nuovo telecomando fosse in fondo.
rosso ottobre13

42

Per Android Studio e IntelliJ:

Innanzitutto, commetti tutto e risolvi eventuali conflitti.

Quindi aprire il terminale dal basso di IDE ed inserire:

git pull origin master --allow-unrelated-histories

Adesso puoi spingere.


38

ATTENZIONE QUESTO POTREBBE POTREBBE SOVRASCRIVERE IL REPOSITIVO REMOTO

Questo ha funzionato per me:

git push origin master --force

1
Ma cosa succede realmente con i file locali e remoti?
Prathamesh More

Come noto ed esperienza, i file locali sono intatti. Vengono aggiunti i file remoti che si desidera aggiungere in una cartella specifica.
Aniket Patil,


Basta includere una dichiarazione di non responsabilità che questo comando sovrascrive tutti i file nel ramo principale . Ha funzionato bene per me. Grazie.
Flavio,

1
Funziona ma è piuttosto duro, la storia di --allow-unrelad è più specifica e appropriata
bdulac,

32

Poiché tutte le altre risposte non rispondono effettivamente alla domanda, ecco una soluzione ispirata da questa risposta su una domanda correlata.

Quindi ottieni l'errore facendo git rebase:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Questo errore in realtà non annulla il rebase, ma ora sei nel mezzo di esso:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

Quindi ora puoi eseguire l'unione a mano. Scopri i commit principali del commit di unione originale:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

Scopri quale dei due genitori unione è quello che è stato unito a quello corrente (probabilmente il secondo, verifica con git log 222222222), quindi esegui l'unione manualmente, copiando il messaggio di commit del commit di unione originale:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

28

Ho avuto lo stesso problema. Il problema è che qualcosa aveva impedito a distanza.

Per prima cosa ho creato un repository locale. Ho aggiunto un file LICENSEe README.mdal mio locale e impegnato.

Quindi volevo un repository remoto, quindi ne ho creato uno su GitHub. Qui ho fatto un errore nel controllare "Inizializza questo repository con un README" , che ha creato anche un README.md in remoto.

Quindi ora quando ho corso

git push --set-upstream origin master

Ho ottenuto:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Ora per superare questo ho fatto

git pull origin master

Che ha comportato l'errore seguente:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

Provai:

git pull origin master --allow-unrelated-histories

Risultato:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

Soluzione:

Ho rimosso il repository remoto e creato un nuovo (penso che solo la rimozione del file READMEavrebbe potuto funzionare) e dopo che il seguito ha funzionato:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
la creazione di un nuovo repository non è una soluzione
Zach,

3
git pull origin master --allow-unrelated-histories ha funzionato per me .. Grazie
SKalariya

git push --force ... in questo caso particolare sarebbe una soluzione adeguata
Konstantin Pelepelin,

2
Questa non è una soluzione. Se sei un principiante, allora puoi farlo, ma se stai lavorando con alcuni progetti reali, dovresti avere a che fare con il modo giusto.
Prathamesh, più

27

Questo di solito accade quando si esegue il commit per la prima volta nel repository remoto. Dato che l'errore dice chiaramente "rifiutare di unire storie non correlate", dobbiamo usare il flag --allow-unrelated-history.

git pull origin master  --allow-unrelated-histories

Ora ci sarebbero alcuni conflitti che dobbiamo risolvere manualmente. Dopodiché basta inserire il codice e inviarlo.


Come accennato nella domanda, sto provando a fare un git-rebase e non un git-pull, git-rebase non ha la --allow-unrelated-historiesbandiera.
Shubham Chaudhary,

25

Due possibilità quando ciò può accadere:

  1. Hai clonato un progetto e, in qualche modo, la directory .git è stata cancellata o danneggiata. Questo fa sì che Git non sia a conoscenza della cronologia locale e, pertanto, causerà questo errore quando si tenta di eseguire il push o il pull dal repository remoto.

  2. Hai creato un nuovo repository, aggiunto alcuni commit ad esso e ora stai provando a estrarre da un repository remoto che ha già alcuni commit propri. Git lancerà anche l'errore in questo caso, poiché non ha idea di come siano collegati i due progetti.

SOLUZIONE

git pull origin master --allow-unrelated-histories

Rif: https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

Ho anche lottato con questo, ma sono riuscito a trovare una soluzione alternativa.

Quando si verifica l'errore sopra riportato, selezionare semplicemente il comando di unione e quindi continuare il rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
In aereo inglese per favore?
Agente Zebra,

@AgentZebra Per qualsiasi disco nel piano complesso un integrale di percorso chiuso continuo è 0.
Addem

12

Prima di tutto tira le modifiche remote sul tuo locale usando il seguente comando:

git pull origin branchname --allow-unrelated-histories

** branchname è master nel mio caso.

Al termine del comando pull, si verifica un conflitto. Dovresti risolvere i conflitti. Uso Android Studio per risolvere i conflitti. inserisci qui la descrizione dell'immagine

Quando i conflitti sono risolti, l'unione è fatta!

Ora puoi spingere in sicurezza.


Ho cercato il pulsante Resolve Conflictin AS. A volte il popup / ballon in basso a destra scompare e non riesco a fare nulla. Grazie @oiyio
mochadwi,


7

Nel fare un git pull, ho ricevuto questo messaggio fatal: refusing to merge unrelated histories per un modulo repo in cui non avevo aggiornato la copia locale per un po '.

Ho eseguito questo comando solo per aggiornare locale dall'origine. Volevo solo le ultime novità dal telecomando e non avevo bisogno di modifiche locali.

git reset --hard origin/master

Questo ha risolto il problema nel mio caso.


12
ATTENZIONE: questo ha eliminato TUTTI i miei file. Fai attenzione se non sai cosa stai facendo!
Salvi Pascual,

2
Questo eliminerà tutte le modifiche in sospeso!
Orestis P.


1

Sto usando il rebase da anni e non avevo mai riscontrato un simile problema. Tuttavia, il primo problema è che si tenta di farlo direttamente sul ramo remoto developmentdal repository remoto, chiamatoorigin . Questo è letteralmente sbagliato perché rebase è un comando pericoloso, che ristruttura la storia di Git. Detto questo, dovresti prima provare sul tuo repository locale e spingerlo solo, se funziona come previsto.

Quindi, il mio solito flusso di lavoro di rebase è simile al seguente (ma tieni presente che non dovresti usare rebase sui rami, che non sei l'unico comitato. Per tali rami, usa semplicemente unisci e risolvi i conflitti, se applicabile):

  1. assicurati di avere un albero di lavoro pulito (nessuna modifica senza impegno)
  2. fai il checkout al ramo su cui vuoi riformulare (per esempio, diciamo che è master; come comando a una riga):git checkout master && git pull origin master && git checkout development
  3. Fai il rebase effettivo: git rebase master
  4. Se è fatto e tutto funziona come previsto, spingilo sul telecomando. Per fare ciò, è necessario forzarlo, poiché l'host remoto ha già la cronologia in un altro ordine, il telecomando risponderebbe senza nulla da spingere. Quindi, dobbiamo dire "la mia versione locale della cronologia è corretta, sovrascrivi tutto su quel ramo remoto usando la mia versione locale della cronologia":git push -f origin development

Come ho già detto, tieni presente che rebase manipola la storia di Git, che di solito è una brutta cosa. Tuttavia, è possibile farlo sui rami, dove nessun altro si impegna. Al fine di mantenere il ramo estraibile per gli altri sviluppatori, utilizzare un'altra strategia di unione come fusione stessa, squash o cherrypick. Quindi, in altre parole: Rebase non dovrebbe essere il tuo strumento per lo sviluppo distribuito. Funziona bene per te se sei l'unico che lavora su questo repository.

Utilizziamo la strategia di diramazione delle funzionalità. In questo, di solito uso rebase per ottenere gli "aggiornamenti" dagli altri sviluppatori, avvenuti nel frattempo sul ramo principale. In questo modo, riduce la dimensione dei commit visibili in una richiesta pull. Pertanto, è più facile per il revisore del codice vedere le mie modifiche apportate in questo ramo di funzionalità.


In questo caso, in realtà volevo continuare con il rebase e la risposta non risponde a questo. Conosco i rischi del rebasing e quando dovrei e non dovrei usare git-rebase. Questa è una linea guida generale (supponente) per il flusso di lavoro git e non risponde direttamente alla domanda. Per quanto riguarda l'uso di rebase per anni, questo particolare errore è stato aggiunto in v2.9.0 di git e il flusso funzionava bene prima di quella versione. Quello che hai scritto in questa risposta qui è risposto già in questioni molto più vecchi come stackoverflow.com/a/11566503/2670370 e git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.