Git pull: errore: voce pippo non aggiornata. Impossibile unire


87

Sto cercando di aggiornare il mio repository da un ramo remoto e continuo a ricevere questo errore quando eseguo un "git pull". Non ho apportato modifiche locali e, anche se l'ho fatto, non ho bisogno di mantenerle.

Ho provato:

git reset --hard

e ho lo stesso problema

L'unica cosa che sembra funzionare è eliminare il file incriminato e provare di nuovo un git pull.

Ho anche provato git stashseguito da un file git pull. No go.

modifica: utilizzando PortableGit-1.6.4-preview20090729 in modo che eventuali bug precedenti con errori spuri dovrebbero essere corretti.


Controlla se la spiegazione in git.or.cz/gitwiki/GitFaq aiuta.
Jakub Narębski

Idem " L'unica cosa che sembra funzionare è eliminare il file incriminato e provare di nuovo un git pull. ". Per me, almeno un file non era in git; è stato ignorato da una regola jolly. Non sono sicuro del motivo per cui fossero bloccanti, però.
ruffin

3
Sono stato in grado di risolvere questo problema eseguendo git rm --cached learned/tests/temp_funcs.py- Dal momento che volevo comunque che il file rimanesse nell'elenco dei file non tracciati ,git rm --cached in questo caso mi ha sbloccato.
Profondo

1
Questo mi è successo durante una fusione che desideravo --abort. Nessuna delle soluzioni proposte mi ha permesso di interrompere, tranne per eliminare i file offensivi.
Trevor Reid

Risposte:


56

Ci sono un paio di modi per risolvere questo problema, ma ho scoperto che git stash funziona bene per me. Mette temporaneamente le modifiche locali in un altro posto. Quindi puoi tirare, per afferrare le ultime modifiche. E poi puoi ripristinare le modifiche locali.

Proprio come questo:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop

21
Dalla domanda originale: "Ho anche provato" git stash "seguito da" git pull ". No go."
Charles Wood

Non ha funzionato per me - nel mio caso ho dovuto git rm --cached, commento completo: stackoverflow.com/questions/1248029/…
Deep

39

Ciò può accadere se aggiorni l'indice per ignorare determinati file:

git update-index --assume-unchanged <file>

e poi per esempio controlla qualche altro ramo:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

Forzare l'aggiornamento dell'indice risolve il problema:

git update-index --really-refresh
<file>: needs update

Seguito da:

git reset --hard 

E poi tutto dovrebbe tornare alla normalità.


2
Sono stato in grado di risolvere questo problema eseguendo git rm --cached learned/tests/temp_funcs.py: poiché volevo comunque che il file rimanesse nell'elenco dei file non tracciati , git rm --cachedin questo caso mi ha sbloccato.
Profondo

3
L' git update-index --really-refreshera il pezzo mancante! Ben fatto, è stato difficile da trovare
Bernardo Dal Corno

29

Questo tipo di problema è spesso causato dal tentativo di eseguire il pull da un repository che ha due nomi di file che differiscono solo nel caso. Se sei su FAT, NTFS in modalità senza distinzione tra maiuscole e minuscole (essenzialmente, ogni volta che viene utilizzato in Windows), o HFS + in modalità senza distinzione tra maiuscole e minuscole, e hai due file "foobar" e "FOOBAR", Git ne vedrà due distinti file, ma il filesystem ne vedrà solo uno, il che causerà tutti i tipi di problemi. Git effettuerà il checkout, ad esempio "FOOBAR", e quindi il checkout "foobar", che il filesystem vede semplicemente sostituire il contenuto di "FOOBAR" ma lasciandolo al suo posto. Ora a Git, sembra che "FOOBAR" sia stato sostituito con il contenuto di "foobar", e "foobar" non c'è più.

Ci sono due diverse manifestazioni di questo problema di base. Uno è quando il tuo repository contiene effettivamente due file che differiscono solo sul caso. In questo caso, è necessario lavorare su un file system che fa distinzione tra maiuscole e minuscole o sarà necessario modificare il repository per assicurarsi che non si verifichino collisioni di questo tipo; un file system senza distinzione tra maiuscole e minuscole semplicemente non può memorizzare il contenuto di questo repository.

Un caso diverso che puoi risolvere è quando si verifica una ridenominazione che cambia il caso del file. Supponiamo, ad esempio, che il repository Git contenga una ridenominazione da "EXAMPLE" a "example". Prima che Git controlli la nuova versione, proverà a verificare che non stia sovrascrivendo alcuni file esistenti che hai sul tuo disco. Poiché pensa che "esempio" sia un nuovo nome di file, chiederà al filesystem se esiste, e il filesystem vedrà "ESEMPIO" e dirà di sì, quindi Git rifiuterà di controllare la nuova versione poiché pensa che sovrascriverà file non tracciati. In questo caso, se non hai modifiche locali che ti interessano, un semplice filegit reset --hard <revision-to-checkout>sarà generalmente sufficiente per superare il problema e passare alla nuova revisione. Cerca solo di ricordarti di non rinominare i file con altri nomi che differiscono solo nel caso in cui ti trovi su un file system senza distinzione tra maiuscole e minuscole, poiché causerà problemi come questo.


14

Per ulteriori approfondimenti sul post di @Brian Campbell (perché neanche il reset hard non ha funzionato) voglio sottolineare un caso limite che mi stava fermando.

Avevo spostato un file OldFilein una cartella diversa e l'ho rinominato NewFile. Ho quindi contrassegnato il file come assume-unchanged.

Questo mi impediva di cambiare ramo e non c'erano scorte da salvare o impegnarsi per spingere. Il problema era che non avevo eseguito il commit di questa modifica del file con un nuovo nome prima di impostare il assume-unchangedflag. Quindi l'ho impostato di nuovo su no-assume-unchanged, eseguito il commit, quindi l'ho reimpostato su assume-unchangede ho potuto cambiare di nuovo i rami.


1
Questa risposta mi ha messo sulla strada giusta, grazie. Ho usato "git ls-files -v | grep '^ [[: lower:]]' | awk '{print $ 2}' | xargs git update-index --no-assume-unchanged" per reimpostare il flag assume-unchanged , quindi sono stato in grado di ripristinare --hard senza errori.
ocroquette

Penso che questo valga anche per qualsiasi file contrassegnato come "presumo invariato", ho avuto lo stesso problema per aver ignorato le modifiche a un file locale che aveva il suo nome originale. Il tuo commento mi ha ricordato che avevo segnato quel file, grazie!
Jake_

5
Ho lo stesso problema. Fondamentalmente "presumere invariato" è una caratteristica malvagia. Una volta che lo usi, rende MOLTO difficile controllare altri rami. Anche se lo usi checkout -f, fallirà.
John Henckel

13

In generale, ciò significa che sono presenti modifiche nei file locali che non sono state salvate nel repository locale. Puoi anche vedere questa domanda di stackoverflow per maggiori dettagli.


11
Dalla domanda: "Non ho apportato modifiche locali ..."
Charles Wood

È un bug di git o è la corruzione del repository git.
Warren P

12

Stavo riscontrando un problema simile (Windows 10): ero acceso branchAe volevo andare a master. Ho avuto alcune modifiche non autorizzate, quindi prima ho git stashpoi git checkout -f masterma ho ancora ottenuto il Entry 'fileName' not uptodate. Cannot merge.

git status non mostrava nulla da commettere.

Alla fine ho semplicemente rimosso il file manualmente e sono stato in grado di andare all'altro ramo (che ovviamente ha fatto tornare il mio file) quindi immagino che da qualche parte ci sia stato un bug all'interno di git.


1
Questa è l'unica soluzione a questa domanda che ha funzionato per me. Ho ricevuto l'errore con il .gitignorefile! Anche se non ho apportato modifiche e git non mi ha permesso di "nasconderlo" (perché non ci sono modifiche locali, duh!). Quindi ho spostato il .gitignorefile fuori dal repository (come una sorta di "backup") e poi ho fatto un git reset --hard, che ha "riparato" il repository in uno stato sano.
Masked Man

git statusmi ha mostrato quale file è stato modificato e ha suggerito che potevo usare git restore myFileinvece di eliminarlo, il che ha funzionato.
Noumenon

7

Potrebbe essere un problema anche con i permessi dei file. Git esegue anche il controllo delle versioni, a meno che config non dica diversamente. Aggiungendo solo questa risposta per le persone che hanno quasi ma non il problema simile.


5

Vale la pena provare:

Potresti impostare, solo per questo aggiornamento, il parametro configcore.trustctime su false?

core.trustctime

Se false, le differenze ctime tra l'indice e la copia di lavoro vengono ignorate; utile quando l'ora di modifica dell'inode viene regolarmente modificata da qualcosa al di fuori di Git (crawler del file system e alcuni sistemi di backup).


2
bella scoperta, in realtà ha funzionato per me quando ho visto il messaggio di errore sopra durante l'esecuzione di "git reset --merge". Quando ho impostato questo parametro su false, è stato eliminato l'errore.
DemitryT

1
Ha funzionato per me durante il controllo dei conflitti con un altro ramo utilizzando "git merge <feature> --no-ff --no-commit" e poi ripristinato con "git merge --abort". Xcode era "qualcosa al di fuori di Git" in questo caso. Grazie quasi 10 anni dopo!
Ralfonso

@Ralfonso Quasi dieci anni dopo, sei il benvenuto :)
VonC

2

Aggiungo la mia risposta perché nessuno degli altri lo menziona. Nel mio caso ciò è accaduto dopo aver aggiunto nuovi file all'indice con il -Nflag, quindi aggiungendoli all'indice senza aggiungere il loro contenuto. In questo stato, fare git stashproduce questo errore.


0

Ho avuto lo stesso errore, dopo una situazione in cui git statusdetto new file: foo.cppper un file non aggiunto all'area di staging. cioè sotto l'intestazione "Modifiche non organizzate per il commit". Molto strano, questo di solito non accade.

Soluzione: git add foo.cppe poi ha git stashfunzionato di nuovo.


0

Stavo cercando di eseguire git merge --abort. Il comando git restore your_file ha risolto il problema per me

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.