2011-01-19 8 views
31

Se corro 'git status' sul mio repo dà:git: Perché git diff non mostra differenze?

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: myfile 

Tuttavia, se faccio un 'git diff myfile' non mostra differenze. È perché ho apportato una modifica e l'ho rimossa, quindi è tornata all'originale?

Devo eseguire 'git checkout myfile' per cancellarlo?

risposta

49

Il file è già in fase di gestione. Puoi mostrare che è diff utilizzando l'opzione --cached di git.

git diff --cached myfile 

Per unstage, basta fare quello che git status suggerisce nella sua uscita;)

È possibile controllare The Git Index Per maggiori info.

+1

Questo ha funzionato per me, ma solo dopo aver eseguito "git add" in primo luogo. Grazie. –

5

Ho una preferenza per l'alias --staged, soprattutto perché trovo che lo --staged in realtà significhi ciò che voglio fare, cioè mostrarmi le differenze di messa in scena.

git diff --staged 

La risposta accettata è corretta e non ho alcuna remora. Personalmente penso che il --cached abbia l'impressione che git diff stia memorizzando nella cache la risposta e mostrandomi risultati precalcolati o qualcosa del genere.

Mi piace anche lo git diff HEAD perché è più generale. Si mette insieme due concetti che la maggior parte delle persone sanno, cioè:

  1. git diff <commit> permette di vedere la differenza tra la posizione corrente e un precedente commit.

  2. HEAD (o head perché tenere il turno è fastidioso) è un riferimento alla punta del ramo. (Per quelli di voi che sono contando le battiture, @ è un alias per HEAD.)

combinata, questi due concetti generalmente utili si traducono in:

git diff head 
git diff @ 
0

Per Area vs confronto Repository Staging utilizzare

$git diff --staged 

per lavorare vs confronto Repository utilizzare

$ git diff 

ma se un file viene modificato e aggiunto all'area di gestione temporanea ($ git add fileName) e proviamo a vedere la differenza con ($ git diff). Non restituirà alcuna differenza poiché il file si trova nell'area di staging e non verrà confrontato con il repository.