Come posso vedere cosa sto per spingere con Git?


588

C'è un modo per vedere cosa verrebbe spinto se eseguissi un git pushcomando?

Quello che sto immaginando è qualcosa di simile alla scheda "File modificati" della funzione "pull request" di Github. Quando invio una richiesta pull, posso vedere e vedere cosa verrà inserito se accettano la mia richiesta pull:esempio di github di modifiche aggregate

La riga di comando è OK, ma preferirei una sorta di interfaccia grafica (come lo screenshot sopra).



Molte domande / risposte correlate; eccone un altro: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Risposte:


665

Per un elenco di file da inviare, eseguire:

git diff --stat --cached [remote/branch]

esempio:

git diff --stat --cached origin/master

Per il codice diff dei file da inviare, eseguire:

git diff [remote repo/branch]

Per vedere i percorsi completi dei file che cambieranno, esegui:

git diff --numstat [remote repo/branch]

Se vuoi vedere queste differenze in una GUI, dovrai configurare git per quello. Vedi Come posso visualizzare l'output di 'git diff' con un programma visual diff? .


8
Entrambe le varianti di git, diffuse senza un commit, mostreranno solo le differenze con HEAD. Penso che intendevi git diff [--stat] - origine / master in cache, supponendo che il ramo principale dell'origine sia master
mfontani,

52
Questo non è esattamente quello che vuoi. Dovresti diff HEAD, non l'indice, contro origin ( git diff origin/master HEAD). Diffondere l'indice darà gli stessi risultati se e solo se non ci sono modifiche messe in scena per il commit. Se hai messo in scena delle modifiche, queste verranno incluse nel diff, ma chiaramente non verranno spinte poiché non sono state ancora impegnate.
Cascabel,

5
Questa risposta deve essere modificata per includere le informazioni nel commento di @Jefromi git diff --stat origin/master HEADè la risposta corretta.
Tony Topper,

2
@mfontani ha la risposta giusta per me. Voglio verificare cosa verrà spinto da ciò che ho già commesso, non cosa mi impegnerò se commetto tutto ciò che ho cambiato. git diff --cached [remote/branch]fa il trucco :)
poshaughnessy

2
invece di digitare origin / master, puoi usare @ {u} ad esempio git diff @ {u} o git diff HEAD @ {u} Nota che funziona solo se hai già creato e collegato un ramo di tracciamento a monte. Lo trovo utile quando ho molti rami e molti telecomandi in modo da non dover pensare a cosa è collegato dove.
Damien Sawyer,

192

C'è sempre una corsa a secco:

git push --dry-run

Farà tutto tranne che per l'invio effettivo dei dati.

Se vuoi una vista più grafica hai un sacco di opzioni.

Tig e lo script gitk forniti con git mostrano entrambi il ramo corrente della copia locale e il ramo del telecomando o dell'origine.

testo alternativo

Quindi tutti i commit che fai dopo l'origine sono i commit che verranno spinti.

Apri gitk dalla shell mentre nel ramo vuoi spingere digitando gitk&, quindi per vedere la differenza tra ciò che è sul telecomando e ciò che stai per spingere sul telecomando, seleziona il commit locale non spremuto e fai clic con il tasto destro sul telecomando e scegli "Diff this -> selezionato": testo alternativo


18
git push --dry-run non mi mostra niente di simile a ciò che spero di vedere. gitk è più vicino, ma non mi mostra il totale aggregato di tutte le modifiche che verranno spinte. Quindi, se sto spingendo 6 commit in remoto, voglio vedere la somma totale di ciò che verrà spinto. Non mi interessa ciò che ogni commit ha individualmente perché un commit potrebbe essere completamente annullato dal successivo.
cmcculloh,

1
Se hai bisogno di un diff di ciò che verrà spinto, fai git diff --stat HEAD origin/mastero git diff HEAD origin/master. Importante è HEAD , altrimenti includi modifiche non impegnate nel tuo diff
Daniel Alder,

C'è qualche ragione per cui git non esegue automaticamente un ciclo a secco prima di provare a trasferire i dati su un telecomando? Se stai inviando una grande quantità di dati, carica tutti i dati e quindi mostra eventuali errori dopo. Hai appena perso tempo e larghezza di banda per caricare i dati che ora devi ricaricare. Sembra un comportamento strano.
Zeusstl,

1
Il problema git push --dry-runè che richiede ancora l'autorizzazione di scrittura sul telecomando. Quindi se hai un clone senza il permesso di spingere a monte, ma ti piacerebbe vedere quali sono le tue modifiche locali non caricate, --dry-runnon lo faranno.
Ed Avis,

Questa è una buona soluzione, ma va notato che richiede la connessione al telecomando (inclusa l'immissione della chiave SSH, se applicabile). Se vuoi solo vedere la differenza tra branche origin/branch, andrei con la risposta di Ionuț G. Stan, dal momento che in realtà non richiede la connessione al repository remoto. Questo può essere positivo o negativo, a seconda delle necessità.
Sean the Bean,

169

Per elencare semplicemente i commit in attesa di essere spinti: ( questo è quello che ricorderete )

git cherry -v

Mostra i soggetti di commit accanto agli SHA1.


5
Una cosa interessante è che puoi specificare un telecomando da confrontare come: git cherry -v heroku/remotenel caso in cui conservi il tuo codice in più di un telecomando.
fagiani

Qual è il miglior comando complementare che ci consente di correlare effettivamente le differenze contenute in questi commit?
Hassan Baig,

Questo comando è carino, ma vorrei maggiori dettagli, come i nomi dei file da cambiare durante il push.
LS

21

Probabilmente vuoi correre git difftool origin/master.... che dovrebbe mostrare la differenza unificata di ciò che si trova sul ramo corrente che non si trova ancora sul ramo origine / master e visualizzarlo nello strumento grafico diff di tua scelta. Per essere il più aggiornato, esegui git fetchprima.


2
git difftool -d origin/master, Ho il mio difftool impostato per fondere in modo che funzioni alla grande, grazie!
Acquario Potenza

git difftool -dè molto meglio, grazie a Aquarius Power. L'unico problema è che non rileva i file spostati e li mostra invece come eliminati e aggiunti.
EM0

8

Un modo per confrontare la tua versione locale prima di spingerla sul repository remoto (tipo di push in dry-run):

Usa TortoiseGit:
fai clic destro sul progetto della cartella principale> TortoiseGit> Diff con la versione precedente>
per la versione 2 sceglirefs/remotes/origin/master


8

Prova git diff origin/master..master(supponendo che origin/mastersia il tuo monte). Diversamente git push --dry-run, funziona ancora anche se non si dispone dell'autorizzazione di scrittura per l'upstream.


5

Usa git gui, lì puoi vedere un elenco di ciò che è cambiato nel tuo effettivo commit. È inoltre possibile utilizzare gitkche fornisce un'interfaccia semplice per i reflog. Basta confrontare tra remotes/...e masterper vedere cosa verrà spinto. Fornisce un'interfaccia simile al tuo screenshot.

Entrambi i programmi sono inclusi in git.


1
Non vedo alcun posto in Git Gui che mostri tutto ciò che è stato commesso ma non spinto.
cmcculloh,

In git gui puoi vedere cosa è stato modificato ma non è stato eseguito il commit. In gik (Via gitk --allottieni un elenco completo di tutti i commenti. Ora puoi confrontare lo stato reale del tuo dev-branch con il tuo telecomando da spingere.
fuz

4

Per vedere quali file vengono modificati e visualizzare le effettive modifiche al codice rispetto al masterramo è possibile utilizzare:

git diff --stat --patch origin master

NOTA : se si utilizza uno degli IDE Intellij, è possibile fare clic con il pulsante destro del mouse sul progetto di livello superiore, selezionare Git > Confronta con ramo > e selezionare l'origine desiderata, ad es origin/master. Nell'albero dei file che apparirà, puoi fare doppio clic sui file per vedere una differenza visiva. A differenza dell'opzione della riga di comando sopra è possibile modificare le versioni locali dalla finestra diff.


3

Puoi elencare i commit in base a:

git cherry -v

Quindi confronta con il seguente comando in cui il numero di ^ è uguale al numero di commit (nell'esempio i suoi 2 commit):

git diff HEAD^^

È semplicemente buono per vedere l'elenco degli ultimi commit. Questo non darà il nome del / i file. Quindi, come qualcuno ha risposto utilizzando le opzioni di esecuzione a secco e le opzioni di patch è meglio. git diff --stat --patch origin master git push --dry-run
Sree Rama,

2

Se stai usando Mac OS X, ti consiglierei di ottenere Tower, è un programma meraviglioso che ha reso il piacere di gestire Git per me. Ora devo più ricordare i comandi del terminale e offre un'ottima interfaccia grafica per visualizzare, tenere traccia e risolvere le differenze nei file.

E no, non sono affiliato con loro, uso solo il loro software e mi piace molto.

http://www.git-tower.com/


2
Uso Tower, ma come è possibile visualizzare i file che sono stati impegnati ma non inviati?
Michael Irey,

Questo non risponde alla domanda.
reinierpost,

1

Solo per aggiungere i miei due centesimi ... Volevo implementarlo quando eseguivo lavori in una pipeline gitlab su un corridore gitlab. Il modo migliore per farlo era usare questo script:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Anche nel mio caso volevo filtrare i file per estensione, per raggiungere questo obiettivo ho usato:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Dopodiché puoi ad esempio inoltrare questo elenco da qualche altra parte, forse una linter;)

Spero che questo possa aiutare qualcuno.


1
  1. Se si dispone delle autorizzazioni di scrittura sul telecomando
git push --dry-run
  1. Se non si dispone delle autorizzazioni di scrittura sul telecomando
git diff --stat HEAD remote/branch

0

Dopo git commit -m "{your commit message}", riceverai un hash di commit prima del push. Quindi puoi vedere cosa stai per fare giteseguendo il seguente comando:

git diff origin/{your_branch_name} commit hash

per esempio: git diff origin/master c0e06d2


Grazie per aver risposto, ma penso che questo sforzo non sia stato richiesto in quanto la domanda è piuttosto vecchia e altamente votata. Stai meglio spendendo gli sforzi su diverse domande.
Pbd,
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.