2012-01-03 14 views
37

Ho due filiali localmente, master e Berislav. Quest'ultimo è attualmente attivo, e ho commesso tutte le modifiche. Quando cerco di cassa a master, ricevo il seguente messaggio:Git mi chiede di confermare o salvare le modifiche sul master di checkout, anche se tutte le modifiche sono state commesse?

error: Your local changes to the following files would be overwritten by checkout: [list of files changed in the active branch] Please, commit your changes or stash them before you can switch branches. Aborting

Tuttavia, tutto il resto ho provato - commit, status, merge - mi dice che non c'è niente di commettere (directory di lavoro pulito). Cosa devo fare per arrivare al mio ramo master?

EDIT: Quando provo git stash, sto ottenendo:

error: feeding unmodified [file path] to diffcore

per tutti i file elencati nel l'errore precedente.

+0

http://stackoverflow.com/questions/6337122/git-branches-behaving-strangely e http: // stackoverflow.com/questions/6638937/switching-branches-in-git-when-will-i-get-you-have-local-changes-cannot-switc risposte potrebbero aiutare, con http://stackoverflow.com/questions/ 7463392/switching-a-branch-after-aborting-current-changes-in-git alternative possibili – VonC

+6

Qual è l'output di 'git status'? – manojlds

+0

+1 a manojlds. Questa è un'informazione utile per risolvere questo problema. –

risposta

41

Ho riscontrato un problema simile oggi. git status non elencava i file di cui si lamentava il checkout. Ho fatto un:

git checkout -- path/to/file 

E ciò annulla qualsiasi modifica al file.

Un modo ancora più semplice per annullare tutte le modifiche unstaged sulla directory di lavoro corrente [1]:

git checkout -- . 

[1] - attenzione - si perderanno altre modifiche unstaged si stava lavorando (se presente). Se non si sa cosa si sta facendo, poi tenere una copia di backup dei file che si stava lavorando :)

+0

Questo mi ha aiutato molto tempo. '' 'git checkout -f branch''' non funzionava, ma questo ha funzionato. – rurp

+0

Questo a volte non aiuta. In un caso reale, la fine di un file è cambiata da CRLF a LF, .gitattributes contiene '* .sh text eol = lf' ma' git checkout - .' non li ha sostituiti con la nuova versione CR-less –

1

Sembra che tu abbia file non tracciati nella tua copia di lavoro, che sono tracciati sull'altro ramo. Git si rifiuta di eseguire il checkout dell'altro ramo, poiché i file locali attualmente non registrati potrebbero essere sovrascritti dai file sull'altro ramo.

È ora possibile

  • aggiungere tali file al ramo corrente, se tali file sono rilevanti per questo ramo
  • rimuovere questi file se non sono necessari
+0

Un'altra opzione sarebbe quella di usare 'git stash' per salvare i file nella memoria e ripristinarli in futuro (' git stash pop') – Grizzly

+0

Il problema è che i file elencati sono tracciati e il ramo corrente è segnalato come aggiornato. Il problema appare solo quando si tenta di eseguire il checkout del master. –

+0

@BerislavLopac Disponi filtri sfumati/puliti nel repository (http://progit.org/book/ch7-2.html)? O un'impostazione di sostituzione di crlf attiva (http://stackoverflow.com/a/2825829/311635)? – Rudi

10

Spostare il file incriminato in qualche altra posizione. Quindi elimina il file incriminato dal tuo albero. Tirare di nuovo. quindi diff i cambiamenti dal file incriminato sul file appena estratto. hack, ma funziona.

+0

Questo ha risolto il problema per me. Grazie! – Kirill

+1

Questa era l'unica soluzione che funzionava –

+3

È roba del genere che fa guadagnare a Git la reputazione di essere difficile da usare. –

39

Semplice come questo:

git stash 
git stash pop 

gli "errori" che si vedono durante l'esecuzione git stash aren non c'è nulla di cui preoccuparsi. È solo riconoscere che il file non ha modifiche senza commit.

+0

Grazie, questo ha fatto il trucco – nerdoc

1

Molto simile alla risposta @JohnHammink, ma qui va.

Soluzione

  1. file rimuove in un'altra directory.
  2. Conferma le modifiche (potrebbe mostrare solo due file rimossi).
  3. Aggiungere nuovamente il file alla directory.
  4. Commit (si dovrebbe essere in grado di vedere solo un file in fase di commit).

Nel mio caso questo era a causa di un file che è stato rinominato con solo una modifica al caso. per esempio. fooViewModel a FooViewModel. Git continuava a pensare che lo stesso file fosse in realtà due file separati.

Penso che questo abbia qualcosa a che fare con Unix che fa distinzione tra maiuscole e minuscole mentre Windows non lo è davvero.

Spero che questo aiuti

+0

Ho spostato il file in un'altra posizione e sono riuscito a cambiare ramo. –

12

Ho avuto un problema simile su un nuovo clone. Ho appena costretto alla cassa con il force (-f) bandiera

git checkout --force some_branch 

Probabilmente non è il modo migliore per risolvere il problema in un pronti contro termine che si stanno facendo modifiche, ma nel mio caso ero sicuro non avevo Non ho apportato alcuna modifica e volevo solo cambiare ramo.

+1

Questa è l'unica risposta che ha funzionato per me. –

+0

stessa cosa per me. ho provato con tutte le opzioni, ma questo sta funzionando bene, grazie @ Adam Bowen –

0

Ho avuto lo stesso problema, e questo ha risolto i miei problemi (su Linux):

git config --global core.autocrlf input 
Problemi correlati