Come fare la differenza tra le modifiche locali senza commit e l'origine


141

Diciamo che ho clonato un repository e ho iniziato a modificare i file. So che se ho modifiche locali senza commit, posso fare una differenza nel modo seguente git diff test.txte questo mi mostrerà la differenza tra l'attuale HEAD locale e le modifiche modificate e senza commit nel file. Se eseguo il commit di tali modifiche, posso differenziarlo dal repository originale utilizzandogit diff master origin/master

Ma c'è un modo per diffondere le modifiche locali con il repository originale sul server prima di eseguire il commit a livello locale? Ho provato varie permutazioni di git diff --cached master origin/mastersenza fortuna.


Volevo sapere quanto è cambiato il mio file dall'ultima versione impegnata sul mio locale. La risposta alla mia domanda era questa domanda. Grazie!
Souvik Ghosh,

Risposte:


133

Dato che il repository remoto è stato memorizzato nella cache tramite git fetchesso, dovrebbe essere possibile confrontarlo con questi commit. Prova quanto segue:

$ git fetch origin
$ git diff origin/master

5
Ah, eccellente. La chiave era lasciare fuori il maestro. Avevo provato una combinazione in cui stavo facendo un recupero prima, ma quando lo facevo git diff master origin/masterstava ancora confrontando con la versione impegnata (ovvio in retrospettiva). Ma tralasciando il master ora confronta le modifiche locali con la versione recuperata.
Chaitanya,

@Chaitanya Bene, potrei aiutare. In realtà trovo i diversi stili che Git usa un po 'irritante: una volta devi scrivere origin mastere da qualche altra parte origin/master. C'è ancora del lavoro da fare, IMHO.
JJD,

Questo non sembra funzionare: il git diff origin/masterfatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree.git fetch origin master
reso

42

So che non è una risposta alla domanda esatta fatta, ma ho trovato questa domanda cercando di diff un file in un ramo e un file locale senza commit e ho pensato di condividere

Sintassi:

git diff <commit-ish>:./ -- <path>

Esempi:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Grazie Eric Boehs per il modo di non dover digitare due volte il nome file)


Mi piace la soluzione generale meglio di quella stretta e specifica sopra. Ti dispiace condividere dove l'hai trovato?
fbicknel,

Non riesco a trovare la documentazione sui dettagli commit-ishe sul separatore di due punti. I documenti su git-diff non sembrano menzionarlo. L'ho usato per così tanto tempo che non ricordo dove l'ho trovato per la prima volta. Probabilmente esempi di altre persone su altri comandi e ho appena sperimentato git-diff. Temo che un'altra rispostacommit-ish sia la migliore che posso trovare in questo momento.
Nate,

3
Una bella aggiunta a questo è git diff master:./ -- README.md. In questo modo non devi digitare README.mddue volte e puoi aggiungerlo a un alias più semplice.
Eric Boehs,

Grazie @EricBoehs, è un ottimo suggerimento.
Nate

1
Che la sintassi non funziona per me ... piuttosto git diff master: -- README.mdla ./crea una /dev/nullfonte piuttosto che il ramo remoto. Usando la versione 2.19.0 di git
rustyDev il

21

Per visualizzare le modifiche non organizzate (non aggiunte) ai file esistenti

git diff

Si noti che questo non tiene traccia dei nuovi file. Per visualizzare le modifiche graduali e non impegnate

git diff --cached


9

Se vuoi confrontare visivamente i file puoi usare:

git difftool

Avvierà automaticamente la tua app diff per ogni file modificato.

PS: se non hai impostato un'app diff, puoi farlo come nell'esempio seguente (utilizzo Winmerge ):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

questa modifica ha effetto immediato?
Dilip Raghunathan,

Sono solo curioso, in che modo questo è legato alla domanda posta? Git difftool non confronta semplicemente le modifiche locali con il master? Tuttavia, l'OP lo vuole tra le modifiche locali e il master remoto.
Infocloggato il

Di gran lunga la soluzione più semplice
Chris Johnson,
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.