Visualizzazione di commit Git non compressi


1752

Come posso visualizzare tutti i commit locali che ho fatto, che non sono stati ancora trasferiti nel repository remoto? Di tanto in tanto, git statusstampa che il mio ramo è X impegna prima origin/master, ma non sempre.

È un bug con la mia installazione di Git o mi sto perdendo qualcosa?


18
A partire da Git 2.5+ (Q2 2015), la risposta effettiva sarebbe git log @{push}... Vedi quella nuova scorciatoia @{push}(facendo riferimento al ramo di tracciamento remoto a cui stai spingendo) nella mia risposta di seguito
VonC

59
@Torek - l'ennesimo semplice compito reso difficile da Git. Ogni volta che viene visualizzata una domanda Git con centinaia o migliaia di voti positivi e milioni di visualizzazioni, qualcuno dovrebbe pensare: Wow, abbiamo davvero rovinato quel flusso di lavoro. Purtroppo, gli sviluppatori di Git hanno omesso la fase di feedback nel ciclo di vita dello sviluppo, quindi il feedback non è incorporato. Invece, continuano a fare gli stessi errori ancora e ancora. Per questa domanda, git status --allsarebbe dovuto apparire nel 2010; o git status -vdovrebbe effettivamente fornire l'output dettagliato che include le informazioni extra.
jww

4
Non sono d'accordo sul fatto che "git status -v" dovrebbe fornire queste informazioni perché ha lo scopo di dare lo stato sull'albero di lavoro, in quanto si riferisce solo al ramo estratto. Tuttavia, vedi la risposta qui sotto su "git branch -v", che credo dovrebbe essere la risposta accettata
JoelFan

13
Questa particolare domanda StackOverflow ha il maggior numero di risposte corrette che tutte funzionano ma che non hanno alcun senso.
Pete Alvin,

@ josh-buhler Spiacente, ho votato per sbaglio per errore ... mentre provavo a fare clic su "STELLA". Tentativo di rivalutazione, ma non ha funzionato!
RafiAlhamd,

Risposte:


1828
git log origin/master..HEAD

Puoi anche visualizzare il diff usando la stessa sintassi

git diff origin/master..HEAD

3
Questo è stato per me - per qualche motivo git log origin .. da solo stava generando un errore. Sembra che ho anche avuto un problema con il modo in cui è stata configurata la mia filiale locale - una volta apportate le modifiche che ho trovato qui: wincent.com/blog/… ... il problema è stato risolto e ho potuto usare di nuovo lo stato git per vedere cosa volevo .
Josh Buhler,

6
Inestimabile: l'ho fatto git config --global alias.ahead "log origin/master..HEAD --oneline"così tanto da poter scoprire rapidamente dove sono. Ancora più caramelle:for i in *; do echo $i && git ahead 2>/dev/null; done
Jamie,

15
git log --stat origin/master..HEADper un pizzico in più
Cory Danielson,

141
Questa non è la soluzione migliore. Origin / master potrebbe non essere sempre il ramo a monte. Una soluzione migliore è usare @ {u} invece di "origin / master" per indicare il ramo a monte. Dal momento che HEAD è implicito di default, si può tralasciare anche quello. Vedi la risposta di @Ben Ling. Modifiche in uscita: git log @ {u} .. Modifiche in entrata: git log .. @ {u}
PlagueHammer

12
@Nocturne Voglio solo sottolineare che quando questa risposta è stata pubblicata, la @{u}sintassi non era ancora disponibile, è diventata disponibile solo il 12 febbraio 2010 . Inoltre, @{u}non funzionerà se il ramo locale non è configurato con un upstream. Infine, al @{u}momento non ha il supporto per il completamento delle schede, <remote>/<branch>con il completamento delle schede rimane uno dei modi più veloci per ottenere queste informazioni e funzionerà indipendentemente dal fatto che sia configurato o meno un upstream.

703

Se vuoi vedere tutti gli commit su tutti i rami che non sono ancora stati spinti, potresti cercare qualcosa del genere:

git log --branches --not --remotes

E se vuoi vedere solo il commit più recente su ciascun ramo e i nomi dei rami, questo:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

8
Questo è bellissimo. In uno scenario correlato, avevo due filiali locali con due filiali a monte e una mano locale è stata fusa nell'altra. Volevo sapere quali commit erano sicuri da ribattere, ma il normale git log master..HEADnon avrebbe funzionato dato che c'erano più upstream. Questo post mi ha portato git log MyBranch --not --remotesa mostrare tutti gli commit che non sono stati trasferiti a monte in un singolo ramo.
pavon,

Questo è stato così utile che l'ho modificato nella mia configurazione di zsh. Grazie.
Scotty C.

Comprendo che il tuo secondo comando elenca anche i commit che non sono ancora stati inviati, ma ne mostra solo uno per ramo.
Stephane

--decoratemostra anche i rami. --graphlo rende ancora più ovvio.
Ray,

Si noti che questi comandi elencano solo i commit che non sono stati inseriti in alcun ramo. Esempio: supponiamo che Branch si sviluppi con branch feat-NewThing. Apportate modifiche localmente a feat-NewThing. (Il registro presenta delle modifiche.) Quindi premi feat-newThing sul ramo remoto. (Il registro è vuoto). Unisci le imprese locali nuove per svilupparle localmente. Supponendo un avanzamento rapido, il registro non presenta ancora modifiche.
Patrick W,

325

Puoi mostrare tutti i commit che hai localmente ma non a monte

git log @{u}..

@{u}o @{upstream}indica il ramo a monte del ramo corrente (vedere git rev-parse --helpo git help revisionsper i dettagli).


17
Su Windows, avevo bisogno di racchiudere l'argomento finale tra virgolette, come: git log "@ {u} .."
Jon Schneider,

git log @{u}.. -p Una delle opzioni più utili è -p , che mostra le differenze introdotte in ciascuna conferma.
mQuiroz,

Forse meglio git log @ {push} .., vedi un'altra risposta .
Hans-Peter Störr,

183

Questo ha funzionato per me:

git cherry -v 

Come indicato in Git: vedi tutti i commit non impegnati o quelli che non si trovano in un altro ramo .


21
Penso che questa dovrebbe essere la risposta principale in quanto questa fornisce la lista più concisa di commit anziché la differenza, difficile da leggere, dettagliata in tutti i file !!
ViFI,

1
git-cherry - "Trova i commit ancora da applicare a monte", sembra fornire ciò che l'OP stava chiedendo, ma con solo l'oggetto di commit anziché l'intero messaggio di commit.
Eido95,

2
Vale la pena notare che questo ti dirà solo se ci sono commit non compressi sulla filiale che hai attualmente verificato. Non ti dirà se hai una filiale locale (non attualmente estratta) con commit non compressi.
Dave Yarwood,

66

Puoi farlo con git log:

git log origin..

Supponendo che originsia il nome del tuo upstream, tralasciando qualsiasi nome di revisione dopo ..implica HEAD, che elenca i nuovi commit che non sono stati inviati.


1
Ogni volta che vedo una risposta con git loge "2-dots-non-3", mi ha sempre di ricordare stackoverflow.com/questions/53569/... ;)
VonC

1
Solo per aggiungerlo alla risposta - se non è presente alcuna configurazione a monte, questo comando porta a dire che non è stata installata alcuna configurazione a monte. Esegui git branch --set-upstream master origin/<branch>per configurare l'upstream se sei propenso a usare questo comando per vedere i commit che vengono messi in scena.
asyncwait,

Questo si confronterà con il ramo predefinito in origine, non con il ramo remoto corrente.
greuze,

43

Tutte le altre risposte parlano di "upstream" (il ramo da cui tiri).
Ma un ramo locale può spingere verso un ramo diverso da quello da cui estrae.

masterpotrebbe non passare al ramo di tracciamento remoto " origin/master".
Il ramo a monte per masterpotrebbe essere origin/master, ma potrebbe spingere al ramo di tracciamento remoto origin/xxxo addirittura anotherUpstreamRepo/yyy.
Questi sono impostati da branch.*.pushremoteper il ramo corrente insieme al global remote.pushDefaultvalore.

È quel ramo di tracciamento remoto che conta quando si cercano commit non compressi: quello che tiene traccia del punto in branch at the remotecui il ramo locale verrebbe spinto.
La branch at the remotepuò essere, ancora una volta, origin/xxxo anche anotherUpstreamRepo/yyy.

Git 2.5+ (Q2 2015) introduce una nuova scorciatoia per questo: <branch>@{push}

Vedere commettere 29bc885 , commettere 3dbe9db , commettere adfe5d0 , commettere 48c5847 , commettere a1ad0eb , commettere e291c75 , commettere 979cb24 , commettere 1ca41a1 , commettere 3a429d0 , commettere a9f9f8c , commettere 8770e6f , commettere da66b27 , commettere f052154 , commettere 9e3751d , commettere ee2499f [tutto dal 21 maggio 2015], e impegna e41bf35 [01 maggio 2015] da Jeff King ( peff) .
(Unito da Junio ​​C Hamano - gitster-in commit c4a8354 , 05 giu 2015)

Commit adfe5d0 spiega:

sha1_name: attuare la @{push}scorciatoia

In un flusso di lavoro triangolare, ogni ramo può avere due punti di interesse distinti: @{upstream}quello da cui normalmente si tira e la destinazione a cui si spinge normalmente. Non c'è una scorciatoia per quest'ultima, ma è utile avere.

Ad esempio, potresti voler sapere quali commit non hai ancora inviato :

git log @{push}..

O come esempio più complicato, immagina di estrarre normalmente le modifiche origin/master(che hai impostato come tuo @{upstream}) e di inviare le modifiche al tuo fork personale (ad esempio, come myfork/topic).
Puoi spingere sul tuo fork da più macchine, richiedendo di integrare le modifiche dalla destinazione push, piuttosto che a monte .
Con questa patch, puoi semplicemente fare:

git rebase @{push}

piuttosto che digitare il nome completo.

Commit 29bc885 aggiunge:

for-each-ref: accetta il %(push)formato " "

Proprio come abbiamo " %(upstream)" per segnalare il " @{upstream}" per ogni riferimento, questa patch aggiunge " %(push)" per abbinare " @{push}".
Supporta gli stessi modificatori del formato di monitoraggio dell'upstream (perché potresti voler sapere, ad esempio, quali rami si sono impegnati a inviare ).

Se vuoi vedere quanti impegni le tue filiali locali sono avanti / indietro rispetto alla filiale che stai spingendo a:

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads

42

Handy git alias per la ricerca di commit non compressi nel ramo corrente :

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

Cosa sostanzialmente fa questo:

git log origin/branch..branch

ma determina anche il nome del ramo corrente.


8
Questo è bellissimo! Per chi non ha familiarità con gli alias basta aggiungerli al file ~ / .gitconfig nella sezione [alias].
Gary Haran,

1
Copia / incolla in bash non funziona, ma lo script è abbastanza utile e comprensibile
greuze

Questo non è un alias bash, come sottolinea @GaryHaran. C'è anche un comando git per aggiungere alias: git alias <alias-name> <command>in questo caso, il comando dovrebbe essere racchiuso tra virgolette singole, per sfuggire a caratteri speciali dalla shell.
Dag Høidahl,

4
Sarebbe:git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
Ricky Levi il

Questo sembra fondamentalmente lo stesso di git log @ {u} .., però - vedi un'altra risposta .
Hans-Peter Störr,

35

Potresti provare ....

gitk

So che non è una pura opzione da riga di comando, ma se l'hai installata e sei su un sistema di interfaccia grafica è un ottimo modo per vedere esattamente quello che stai cercando e molto altro ancora.

(Sono davvero sorpreso che nessuno lo abbia menzionato finora.)


3
gitk --allper visualizzare tutti i rami.
Ray,

3
tigè l'alternativa ncurses.
Ray,

@ justin-ohms gitkè fantastico! Non ho mai saputo che esistesse! Pratico per sfogliare le modifiche in una bella interfaccia utente.
RafiAlhamd,

@ray tigè molto utile in una situazione "solo terminale", in cui non si ottiene l'accesso alla GUI del desktop. Scoprilo per la prima volta! INTERESSANTE: tigè INVERSO di git!
RafiAlhamd,

30

git branch -v mostrerà, per ogni filiale locale, se è "avanti" o no.


2
Sì, nel caso in cui sia presente un commit non spinato sul ramo devel, la linea corrispondente sarà * devel 8a12fc0 [ahead 1] commit msg( *sarà solo sulla linea corrispondente al ramo estratto). ahead 1significa "avanti per un commit", ovvero c'è un commit non spinto.
Aurelien,

2
No git branch -vv? Cf. docs: "Se fornito due volte, stampa anche il nome del ramo a monte (vedi anche git remote show <remote>)."
Dirty Henry,

Non si tratta di stampare il nome del ramo a monte, ma solo di stampare behinde / o aheadper ogni ramo locale, il che è sufficiente per risolvere il problema di OP (rilevare commit non compressi). git branch -vè abbastanza per questo, appena testato di nuovo con Git 2.16.2 :)
Aurelien,

-Vv è utile perché con esso mostra una differenza tra i rami che sono aggiornati con il telecomando e quelli che non sono stati spinti affatto. (Con solo una -v, si presentano in modo identico sul display.)
RM

30

In precedenza avevo eseguito un commit, non inviato a nessun ramo, né remoto né locale. Solo l'impegno. Nulla di altre risposte ha funzionato per me, ma con:

git reflog

Lì ho trovato il mio impegno.


Come indicato in questo link git-scm.com/docs/git-reflog , Log di riferimento o "reflog", registrare quando i suggerimenti delle filiali e altri riferimenti sono stati aggiornati nel repository locale. Nel mio caso, ho clonato un repository, creato un nuovo ramo, cancellato il ramo, creato uno nuovo, creato un commit e modificato il commit. Tutti questi passaggi sono stati registrati come HEAD @ {0}: commit (modifica): .. HEAD @ {1}: commit: ... HEAD @ {2}: checkout: passaggio da ... a ... HEAD @ { 3}: checkout: passaggio da ... a ... HEAD @ {4}: clone: ​​da #sorry per il formato SO non consente apparentemente le multiline nei commenti
velocità

questo include i commit origine, nonché, la soluzione migliore sarebbe quella di utilizzare il comando fornito da @PlagueHammer ( stackoverflow.com/a/2016954/624048 )
Lincoln

20

Uso il seguente alias per ottenere solo l'elenco dei file (e lo stato) che sono stati impegnati ma che non sono stati inviati (per il ramo corrente)

git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

quindi fai semplicemente:

git unpushed

sembra interessante, ma $ (git name-rev --name-only HEAD) è "indefinito" nel mio caso
vak

13

Credo che il modo più tipico di farlo sia eseguire qualcosa del tipo:

git cherry --abbrev=7 -v @{upstream}

Tuttavia, personalmente preferisco correre:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

che mostra i commit da tutti i rami che non sono uniti a monte, più l'ultimo commit a monte (che si presenta come nodo radice per tutti gli altri commit). Lo uso così spesso che ho creato un alias noupper questo.

git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

11

Ti suggerisco di andare a vedere lo script https://github.com/badele/gitcheck , ho codificato questo script per controllare in un unico passaggio tutti i tuoi repository git e mostra chi non ha eseguito il commit e chi non ha eseguito il push / pull.

Ecco un risultato di esempio inserisci qui la descrizione dell'immagine


1
Potresti spiegare come far funzionare questo plugin su una macchina Windows? Sto cercando di eseguire pip, ma il comando manca nella riga di comando. Ho installato Python, ma non sono sicuro che sia abbastanza.
Konrad Szałwiński

@ KonradSzałwiński Non ho Windows Machine, ma in questo argomento ( stackoverflow.com/questions/4750806/… ), l'utente sembra rispondere alla tua domanda :). Ma non ho testato su Windows e non sono sicuro che funzioni.
Bruno Adelé,

@ KonradSzałwiński il contributore github di ChristianTremblay ha aggiunto un supporto per Windows. Ora il gitcheck funziona su Windows. Puoi scaricarlo su github.com/badele/gitcheck
Bruno Adelé il

Ora puoi anche usare gitcheck direttamente da un contenitore docker (con i tuoi file nell'host) Per maggiori informazioni vedi il progetto gitchub github
Bruno Adelé,

Grazie per la pubblicazione, sembra davvero utile. Ho provato a installare ma dopo l'installazione non riesco a trovare la posizione dello script per eseguirlo. $ pip install git + git: //github.com/badele/gitcheck.git Raccolta di git + git: //github.com/badele/gitcheck.git Clonazione di git: //github.com/badele/gitcheck.git in c : \ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build Installazione dei pacchetti raccolti: gitcheck Esecuzione di setup.py install per gitcheck: avviato Esecuzione di setup.py install per gitcheck: terminato con stato 'fatto' Gitcheck-0.3 installato correttamente .22
Lauren Fitch


9

Non è un errore. Quello che probabilmente vedi è lo stato git dopo un'unione automatica non riuscita in cui le modifiche dal telecomando vengono recuperate ma non ancora unite.

Per vedere i commit tra repository locale e remoto, procedere come segue:

git fetch

Questo è sicuro al 100% e non deriderà la tua copia di lavoro. Se ci fossero cambiamenti git statusmostreremo X commits ahead of origin/master.

Ora puoi mostrare il registro dei commit che si trovano nel telecomando ma non nel locale:

git log HEAD..origin

8

Questo ha funzionato meglio per me:

git log --oneline @{upstream}..

o:

git log --oneline origin/(remotebranch)..

2
Per chiunque si @{upstream}stia chiedendo, è letterale ( upstreamè una parola magica), mentre remotebranchè solo il nome del tuo ramo.
Steve Bennett,

7

Esiste uno strumento chiamato unpushed che analizza tutti i repository Git, Mercurial e Subversion nella directory di lavoro specificata e mostra un elenco di file ucommited e commit non compressi. L'installazione è semplice su Linux:

$ easy_install --user unpushed

o

$ sudo easy_install unpushed

per installare a livello di sistema.

Anche l'uso è semplice:

$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)

Vedi unpushed --helpo descrizione ufficiale per maggiori informazioni. Ha anche uno script cronjob unpushed-notifyper la notifica sullo schermo di modifiche non confermate e non eliminate.


5

Per elencare facilmente tutti i commit non compressi in tutti i rami , puoi usare questo comando:

 git log --branches  @{u}..

4

Simile: per visualizzare i rami non uniti:

git branch --all --no-merged

Quelli possono essere sospetti ma raccomando la risposta di cxreg


3

Se il numero di commit che non sono stati espulsi è un numero a una cifra, che spesso è, il modo più semplice è:

$ git checkout

git risponde dicendoti che sei "avanti N commit" rispetto alla tua origine. Quindi ora tieni a mente quel numero quando visualizzi i log. Se sei "in vantaggio di 3 commit", i primi 3 commit nella storia sono ancora privati.


2

un modo di fare le cose è elencare i commit disponibili su un ramo ma non su un altro.

git log ^origin/master master

Cosa fa il carattere '^'?
Aran Mulholland,

@AranMulholland significa non qui.
Alex,

1

Come detto sopra:

git diff origin / master..HEAD

Ma se stai usando git gui

Dopo aver aperto l'interfaccia della GUI, seleziona "Repository" -> In quella " Visualizza cronologia "

Nota: ad alcune persone piace usare il prompt / terminale CMD mentre ad altri piace usare Git GUI (per semplicità)


l'opzione di visualizzazione in git gui è quella.
Rajesh Kolhapure,

-2

Ecco la mia soluzione portatile (shell script che funziona anche su Windows senza installazione aggiuntiva) che mostra le differenze dall'origine per tutti i rami: git-fetch-log

Un esempio di output:

==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

==== test [ahead 1, behind 1]

< commit 83a3161 (test)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 22:50:00 +0100
|
|     Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
|   Date:   2016-03-14 10:34:28 +0100
|
|       Pushed remote
|
o commit 0fccef3
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

I parametri passati per il registro, ad esempio --onelineo --patchpossono essere utilizzati.


-3
git show

mostrerà tutte le differenze nei tuoi commit locali.

git show --name-only

mostrerà l'id di commit locale e il nome di commit.


3
git showmostra solo il commit più recente, indipendentemente dal fatto che sia stato inviato al telecomando o meno, non ti mostrerà tutti i tuoi commit non compressi.

-6
git diff origin

Supponendo che il tuo ramo sia impostato per tenere traccia dell'origine, ciò dovrebbe mostrare le differenze.

git log origin

Ti fornirà un riepilogo degli commit.


3
git log originti mostrerà commit che sono già stati inviati , ma non mostrerà commit non sono stati spinti , il che è più in linea con quanto richiesto dal poster originale.
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.