Visualizzazione dei commit Git non premuti

Come posso visualizzare i commit locali che ho effettuato, che non sono ancora stati inviati al repository remoto? Occasionalmente, lo git status stamperà che il mio ramo è X commesso prima origin/master , ma non sempre.

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

 git log origin/master..HEAD 

È inoltre ansible visualizzare la differenza utilizzando la stessa syntax

 git diff origin/master..HEAD 

Se vuoi vedere tutti i commit su tutti i rami che non sono ancora stati spinti, potresti cercare qualcosa di simile a questo:

 git log --branches --not --remotes 

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

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

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

 git log @{u}.. 

@{u} o @{upstream} indica il ramo upstream del ramo corrente (consultare git rev-parse --help o git help revisions per i dettagli).

Questo ha funzionato per me:

 git cherry -v 

Come indicato su Git: Vedi tutti i commit o commit non schierati che non si trovano in un altro ramo .

Puoi farlo con git log :

 git log origin.. 

Supponendo che l’ origin sia il nome dell’upstream, lasciando fuori qualsiasi nome di revisione dopo .. implica HEAD , che elenca i nuovi commit che non sono stati inseriti.

Pratico alias git per cercare commit non urgenti nel ramo attuale :

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

Cosa questo fondamentalmente fa:

 git log origin/branch..branch 

ma determina anche il nome del ramo corrente.

Potresti provare ….

 gitk 

So che non è una pura opzione da riga di comando, ma se la si installa e si trova su un sistema GUI è un ottimo modo per vedere esattamente ciò che si sta cercando e molto altro ancora.

(Sono in realtà un po ‘sorpreso nessuno l’ha menzionato finora.)

Tutte le altre risposte parlano di “upstream” (il ramo da cui si estrae).
Ma una filiale locale può spingere verso un ramo diverso da quello da cui tira.

master potrebbe non inviare al ramo di tracciamento remoto ” origin/master “.
Il ramo upstream per il master potrebbe essere origin/master , ma potrebbe anotherUpstreamRepo/yyy ramo di tracciamento remoto origin/xxx o anche anotherUpstreamRepo/yyy .
Quelli sono impostati per branch.*.pushremote per il ramo corrente insieme al valore global remote.pushDefault .

È quel ramo di remote-tracking che conta quando si cerca di commettere unpushed: quello che tiene traccia del branch at the remote dove verrà spinto il ramo locale .
Il branch at the remote può essere, di nuovo, origin/xxx o anche anotherUpstreamRepo/yyy .

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

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

Commit adfe5d0 spiega:

sha1_name : implementa una stenografia @{push}

In un stream di lavoro triangular, ciascun ramo può avere due punti distinti di interesse: il @{upstream} da cui normalmente si estrae e la destinazione che si preme normalmente. Non c’è una scorciatoia per quest’ultimo, ma è utile avere.

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

 git log @{push}.. 

O come un esempio più complicato, immagina di tirare normalmente le modifiche da origin/master (che hai impostato come @{upstream} ), e spingere le modifiche al tuo fork personale (ad esempio, myfork/topic ).
È ansible inviare alla fork da più macchine, richiedendo di integrare le modifiche dalla destinazione push, anziché 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 formato ” %(push)

Proprio come abbiamo ” %(upstream) ” per segnalare ” @{upstream} ” per ogni ref, questa patch aggiunge ” %(push) ” per far corrispondere ” @{push} “.
Supporta gli stessi modificatori del formato di tracciamento come upstream (perché potresti voler sapere, ad esempio, quali rami hanno commit di push ).

Se vuoi vedere quanti commit le tue filiali locali sono avanti / indietro rispetto al ramo che stai spingendo a:

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

git branch -v mostrerà, per ogni ramo locale, se è “avanti” o no.

Uso il seguente alias per ottenere solo l’elenco di file (e lo stato) che sono stati impegnati ma non sono stati inseriti (per il ramo corrente)

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

quindi fai solo:

 git unpushed 

Credo che il modo più tipico per farlo sia eseguire qualcosa come:

 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 in upstream (che si presenta come nodo root per tutti gli altri commit). Lo uso così spesso da aver creato alias noup per questo.

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

Ti suggerisco di andare a vedere la sceneggiatura https://github.com/badele/gitcheck , ho codificato questo script per controllare in un solo passaggio tutti i tuoi repository git, e mostra chi non ha commesso e chi non ha spinto / tirato.

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

Non è un errore. Quello che probabilmente vedrete è stato git dopo un fallito auto-merge in cui le modifiche dal remoto vengono recuperate ma non ancora unite.

Per vedere i commit tra repo locale e remoto fai questo:

 git fetch 

Questo è sicuro al 100% e non prende in giro la tua copia di lavoro. Se ci sono state modifiche git status wil show 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 

C’è uno strumento chiamato unpush che analizza tutti i repository di Git, Mercurial e di Subversion nella directory di lavoro specificata e mostra l’elenco dei file e dei commit non premuti. L’installazione è semplice sotto Linux:

 $ easy_install --user unpushed 

o

 $ sudo easy_install unpushed 

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 --help o descrizione ufficiale per maggiori informazioni. Ha anche uno script unpushed-notify per la unpushed-notify sullo schermo di modifiche non bloccate e non spinte.

 git cherry -v 

Questo elencherà la cronologia dei commenti locali (non ancora inviata) con il messaggio corrispondente

Questo ha funzionato meglio per me:

 git log --oneline @{upstream}.. 

o:

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

Per elencare facilmente tutto il commit non premuto in tutti i rami , puoi usare questo comando:

  git log --branches @{u}.. 

Ho fatto un commit in precedenza, non spinto a nessun ramo, né remoto né locale. Solo il commit. Niente da altre risposte ha funzionato per me, ma con:

 git reflog 

Lì ho trovato il mio impegno.

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

 $ git checkout 

git risponde dicendoti che sei “avanti N commette” la tua origine. Quindi ora tieni a mente quel numero quando guardi i registri. Se sei “avanti di 3 commit”, i primi 3 commit nella cronologia sono ancora privati.

Simile: per visualizzare rami non raggruppati:

 git branch --all --no-merged 

Quelli possono essere sospetti ma raccomando la risposta da cxreg

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

 git log ^origin/master master 

Ecco la mia soluzione portatile (script di shell 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  | Date: 2016-03-10 09:11:11 +0100 | | Commit on remote | o commit 2304667 (branch) Author: BimbaLaszlo  Date: 2015-08-28 13:21:13 +0200 Commit on local ==== master [ahead 1] < commit 280ccf8 (master) | Author: BimbaLaszlo  | Date: 2016-03-25 21:42:55 +0100 | | Commit on local | o commit 2369465 (origin/master, origin/HEAD) Author: BimbaLaszlo  Date: 2016-03-10 09:02:52 +0100 Commit on remote ==== test [ahead 1, behind 1] < commit 83a3161 (test) | Author: BimbaLaszlo  | Date: 2016-03-25 22:50:00 +0100 | | Diverged from remote | | > commit 4aafec7 (origin/test) |/ Author: BimbaLaszlo  | Date: 2016-03-14 10:34:28 +0100 | | Pushed remote | o commit 0fccef3 Author: BimbaLaszlo  Date: 2015-09-03 10:33:39 +0200 Last common commit 

I parametri passati per il log, ad esempio --oneline o --patch possono essere utilizzati.

 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.

 git diff origin 

Supponendo che il tuo ramo sia impostato per tracciare l’origine, allora questo dovrebbe mostrarti le differenze.

 git log origin 

Vi darò un riassunto dei commit.