Non riesco a scartare le modifiche in Git


125

Dopo aver visto quanto segue dalla riga di comando:

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

Sto cercando di eliminare le mie modifiche digitando il comando:

git checkout -- index.htm

ma quando rieseguo git status, sembra esattamente lo stesso. Il checkout sembra non funzionare. Sto facendo qualcosa di sbagliato? Sto usando GIT 1.6.1.2 su Windows / Cygwin.

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

4
git checkout HEAD -- index.htm( Il check-out dall'ultimo stato di cui è stato eseguito il commit, invece di il check-out dall'indice) funziona?
Jakub Narębski

3
git checkout HEAD -- index.htmha funzionato per me!
Ben Tideswell

Risposte:


52

Questo mi ha infastidito per un po ', quasi tutti i repository che ho controllato presentavano modifiche che non potevo eliminare. Per farla breve, ho provato tutto quanto sopra, niente ha funzionato. Questo è quello che ho fatto per riportare le cose alla normalità (su un Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard

7
Dopo aver provato tutto quanto sopra, questa è stata l'unica cosa che ha funzionato per me (su Windows)
Anders

Grazie! Come ha detto Anders, questa soluzione funziona anche per me. Ho sostituito autocrlf con # autocrlf
David

37

Ecco la mia esperienza, imposta le seguenti variabili in .git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

quindi corri $ git checkout HEAD .e funziona. ma $ git checkout -- .no, strano!

* git versione 1.9.3


35

Quali modifiche vengono git diffvisualizzate nel file? Su Windows, ho riscontrato problemi con le terminazioni di riga che causano problemi come questo. In tal caso, guarda quali impostazioni hai per git config core.autocrlfe git config core.safecrlf. C'è della documentazione per queste impostazioni qui .

Direi che, se stai usando git svnper l'integrazione con subversion, assicurati che autocrlfsia disattivato. Da quello che posso dire, è solo rotto in questa configurazione e fa sì che la maggior parte degli strumenti pensi che i file siano stati modificati, quando hai fatto un checkoutper annullare le modifiche.

Se riscontri un problema nel punto in cui ti trovi git checkout, e poi git statusmostra che il file è ancora modificato e git diffmostra che il file è stato modificato su ogni riga del file, questo è il problema che stai riscontrando.

core.autocrlf

Se true, fa in modo che git converta CRLF alla fine delle righe nei file di testo in LF durante la lettura dal filesystem e converte al contrario durante la scrittura nel filesystem. La variabile può essere impostata su input, nel qual caso la conversione avviene solo durante la lettura dal filesystem ma i file vengono scritti con LF alla fine delle righe. Attualmente, quali percorsi considerare "testuale" (cioè essere soggetti al meccanismo dell'autocrlf) viene deciso in base ai contenuti.

core.safecrlf

Se true, fa controllare a git se la conversione di CRLF come controllata da core.autocrlf è reversibile. Git verificherà se un comando modifica un file nell'albero di lavoro direttamente o indirettamente. Ad esempio, il commit di un file seguito dall'estrazione dello stesso file dovrebbe restituire il file originale nell'albero di lavoro. Se questo non è il caso per l'impostazione corrente di core.autocrlf, git rifiuterà il file. La variabile può essere impostata su "warn", nel qual caso git avviserà solo di una conversione irreversibile ma continuerà l'operazione. ...


core.autocrlf = true core.safecrlf non è stato impostato. Dovrebbe essere impostato su true per Windows? Qual è la differenza tra i due?

Direi di lasciarli entrambi spenti SE stai usando git svn. Ho aggiunto qualche dettaglio in più.
1800 INFORMAZIONI


2
Quando ho impostato core.autocrlf e core.safecrlf su true, sono stato in grado di eliminare le modifiche rilevate nei file offensivi eseguendo "git reset --hard HEAD".
Aleksey

19

Penso che tu debba passare -f

Dalla pagina man ( man git-checkout, GIT-CHECKOUT (1)):

-f, --force
Procede anche se l'indice o l'albero di lavoro è diverso da HEAD.
Viene utilizzato per eliminare le modifiche locali .

Ad esempio, elimina le modifiche sul ramo corrente e passa a un ramo diverso:

git checkout -f master

7
Passare -f a cosa? Sarebbe bello completare la risposta
PandaWood

@ Matt, la mia intenzione non era quella di effettuare il checkout in una filiale diversa. La risposta è del 2009, quindi non ricordo bene, ma a giudicare dalla domanda, penso di voler passare -fal checkout - <filename> come ingit checkout -f -- filename
hasen

@hasen I tre commenti che avevi chiedevano chiarimenti, motivo per cui ho aggiunto "per esempio". L'esempio non preclude altri usi di-f
Matt H

Ha funzionato per me. git checkout -f masterha lanciato "Già su" master "" ma le modifiche erano sparite.
Christian,

12

Potrebbe trattarsi di terminazioni di riga, come suggerisce @ 1800-information, ma un'altra possibilità è che la differenza (che ti impedisce di ripristinare questi file con un comando di checkout) è una modalità file. Questo è quello che mi è successo. Sulla mia versione di git puoi scoprirlo usando

git diff index.htm

E ti mostrerà le modifiche alla modalità file. Tuttavia, non ti permetterà ancora di ripristinarli, usando il checkout, anche con l'opzione -f. Anche per quell'uso

git config core.filemode false

o cambia il tuo git .config nel tuo editor di testo aggiungendo

[nucleo]

filemode = false

Dopo averlo fatto, puoi usare

git resetta HEAD index.htm

e il file dovrebbe scomparire.

(Ho ottenuto tutto questo dalle risposte a Come faccio a fare in modo che git ignori le modifiche alla modalità (chmod)? E update-file-permissions-only-in-git )


Grazie mille! Nessuno degli altri suggerimenti ha funzionato per me per eliminare le modifiche alla modalità file.
Thorkil Værge

6

Sei su OSX o Windows? In tal caso, il problema è probabilmente avere due file con lo stesso nome, con un caso diverso. per esempio. index.htm e Index.htm

Windows, e per impostazione predefinita OSX, utilizza un file system senza distinzione tra maiuscole e minuscole, che è in conflitto con git.


2

Ho avuto questo problema e dopo aver provato tutto quanto sopra, niente ha funzionato.

Quello che ha funzionato per me è stato eliminare la directory in cui si trovava il file, quindi l'ho fatto git statuse mi sono assicurato che tutti i file in quella directory fossero ora contrassegnati come eliminati. Dopodiché l'ho semplicemente fatto git checkout -fe tutto è tornato alla normalità.


1

Stavo lavorando a un libGDXprogetto Android Studioe volevo scartare tutte le modifiche che ho fatto, e niente funzionava per me, la soluzione che ho trovato è stata di eseguire il commit di tutte le modifiche in un nuovo ramo

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

e poi puoi cancellare il TRASHramo se vuoi.


1

Ho avuto lo stesso problema, niente dei commenti sopra ha funzionato. Si è scoperto che il mio filesystem non fa distinzione tra maiuscole e minuscole (impostazione predefinita di osx, ma Windows probabilmente si comporta allo stesso modo) e un file era presente sia con lettere maiuscole che minuscole nella stessa directory, con contenuto diverso. Poiché sul mio computer entrambi i nomi puntavano allo stesso file, git status mostrava sempre una modifica, qualunque cosa facessi. Per risolvere il problema:

  • Ho dovuto rimuovere uno dei file da un altro computer e inviarlo al repository

  • eliminare completamente l'intera versione locale

  • fai git clone da zero


0

Ho avuto un problema simile, in cui non mi permetteva di scartare file che non esistono o sono stati modificati. Uso Visual Studio al lavoro e ho scoperto che ciò accade quando si cambia ramo mentre l'app è in esecuzione.

git checkoute provare a scartare non ha aiutato. Non funzionerebbe o mi direbbe semplicemente che non ho il permesso.

Soluzione che ha funzionato:

  1. Vai in modalità provvisoria
  2. Elimina file

Il riavvio è un problema, ma ha funzionato più velocemente rispetto a provare 100 cose.


0

C'è una soluzione facile. Se ciò accade (normalmente a causa di chiusura imprevista di Windows o dump della memoria) e non è possibile annullare le modifiche e persino passare da un ramo all'altro (Git dice che non si dispone di autorizzazioni sufficienti); in Windowsambiente show all hidden files and foldersda Opzioni cartella. Vai alla tua directory GIT (dovrebbe iniziare con .git) ed elimina il "index.lock"file. Quindi Git dovrebbe lasciarti fare quello che vuoi fare.


0

Ho finito per fare un git stashseguito da un git stash cleanper sbarazzarmi di alcuni. Non è stata visualizzata alcuna configurazione automatica cr / lf in .git / o ~ / .git.


0

Nel mio caso non ho potuto eliminare le modifiche relative a una directory. ad esempio, quando ho eseguito un diff git vedrei questo: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Così ho chiamato quella directory e lì ho eseguito uno stato git. Era in uno stato distaccato di TESTA. E poi mi sono imbattuto git checkout masterdentro. Questo ha sistemato le cose per me. Ma questo non è utile per lo scenario esatto richiesto qui.


0

Questa è una vecchia domanda, ma era ancora rilevante per me. Non ho trovato la mia risposta fino a quando non ho chiesto in giro per l'ufficio e ho scoperto che il problema era con i sottomoduli. Quando vengono aggiornati e il tuo repository non riflette tali modifiche, si presenta con differenze, resettare la testina non aiuta. Se questo è il caso, esegui:

git status update

Questo dovrebbe aiutare a risolvere le cose (in questo caso particolare)


0

Ho avuto un problema con le autorizzazioni in Windows e dovevo farlo, icacls containingFolder /reset /t /l /cquindi fare doppio clic sulla cartella per recuperare le mie autorizzazioni.


0

Avevo .gitattributes con il seguente contenuto:

* text=auto eol=lf

Per risolvere il problema, modificare .gitattributesper rimuovere questa riga che rilassa le terminazioni di riga. Quindi git reset --hard HEADripristinato i file e il .gitattributesfile.


0

Per me questo problema si è verificato con una combinazione di download di un'immagine Git-LFS che è stata caricata tramite Netlify CMS e servita in modo diverso dal loro gestore Netlify Large Media.

La mia soluzione era commentare / rimuovere queste righe dal mio in ~/.gitconfigmodo che appaiano come sotto, quindi ricontrollare git status.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

OPPURE puoi probabilmente aggiungere un filtro più locale tramite un file .gitconfig nella radice del repository e in qualche modo sovrascrivere le regole di filtro per lfs lì.

Spero che questo aiuti un tizio.


-1

Ho anche affrontato un problema in qualche modo simile e i seguenti passaggi mi hanno aiutato:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

Spero che aiuti anche altre persone.

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.