Exibindo Commits do Git Unpushed

Como posso ver os commits locais que eu fiz, que ainda não foram enviados para o repository remoto? Ocasionalmente, o git status mostrará que minha ramificação é X confirmada antes da origin/master , mas nem sempre.

Isso é um bug com a minha instalação do Git, ou estou faltando alguma coisa?

 git log origin/master..HEAD 

Você também pode ver o diff usando a mesma syntax

 git diff origin/master..HEAD 

Se você quiser ver todos os commits em todos os branches que ainda não foram enviados, você pode estar procurando por algo assim:

 git log --branches --not --remotes 

E se você quiser apenas ver o commit mais recente em cada ramificação, e os nomes das ramificações, esta:

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

Você pode mostrar todos os commits que você tem localmente, mas não upstream com

 git log @{u}.. 

@{u} ou @{upstream} significa o ramo upstream do branch atual (veja git rev-parse --help ou git help revisions para detalhes).

Isso funcionou para mim:

 git cherry -v 

Como indicado no Git: Veja todos os commits ou commits que não estão em outro branch .

Você pode fazer isso com o git log :

 git log origin.. 

Assumindo que origin é o nome do seu upstream, deixando de fora qualquer nome de revisão depois .. implica HEAD , que lista os novos commits que não foram enviados.

Handy git alias para procurar por commits não processados ​​no branch atual :

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

O que isso basicamente faz:

 git log origin/branch..branch 

mas também determina o nome atual da ramificação.

Você poderia tentar….

 gitk 

Eu sei que não é uma opção de linha de comando pura, mas se você tiver instalado e estiver em um sistema de GUI é uma ótima maneira de ver exatamente o que você está procurando mais muito mais.

(Eu estou realmente surpreso que ninguém mencionou isso até agora.)

Todas as outras respostas falam sobre “upstream” (o ramo de onde você puxa).
Mas um ramo local pode empurrar para um ramo diferente daquele que ele puxa.

master pode não empurrar para o ramo de rastreamento remoto ” origin/master “.
A ramificação upstream do master pode ser origin/master , mas pode ser anotherUpstreamRepo/yyy para o ramo de rastreamento remoto origin/xxx ou até mesmo para anotherUpstreamRepo/yyy .
Esses são definidos por branch.*.pushremote para o branch atual junto com o valor global remote.pushDefault .

É aquela ramificação de rastreamento remoto que conta ao procurar confirmações não pagas: aquela que rastreia a branch at the remote onde a ramificação local seria enviada.
O branch at the remote pode ser, novamente, origin/xxx ou até mesmo anotherUpstreamRepo/yyy .

Git 2.5+ (Q2 2015) introduz um novo atalho para isso: @{push}

Veja cometer 29bc885 , commit 3dbe9db , commiter adfe5d0 , commit 48c5847 , commiter a1ad0eb , commit e291c75 , commit 979cb24 , commit 1ca41a1 , commit 3a429d0 , commit a9f9f8c , commiter 8770e6f , commit da66b27 , commit f052154 , commit 9e3751d , commit ee2499f [tudo a partir de 21 maio 2015], e cometer e41bf35 [01 de maio de 2015] por Jeff King ( peff ) .
(Mesclado por Junio ​​C Hamano – gitster – em commit c4a8354 , 05 jun 2015)

Commit adfe5d0 explica:

sha1_name : implementar @{push} taquigrafia

Em um stream de trabalho triangular, cada ramificação pode ter dois pontos de interesse distintos: o @{upstream} qual você normalmente obtém e o destino para o qual você costuma enviar. Não há uma abreviação para o último, mas é útil ter.

Por exemplo, você pode querer saber quais commits ainda não foram enviados :

 git log @{push}.. 

Ou, como um exemplo mais complicado, imagine que você normalmente obtém mudanças de origin/master (que você define como seu @{upstream} ), e myfork/topic mudanças para sua própria bifurcação pessoal (por exemplo, como myfork/topic ).
Você pode empurrar para o seu fork de várias máquinas, exigindo que você integre as mudanças do destino de push, em vez de upstream .
Com este patch, você pode apenas fazer:

 git rebase @{push} 

em vez de digitar o nome completo.

Commit 29bc885 adiciona:

for-each-ref : aceita o formato ” %(push)

Assim como temos ” %(upstream) ” para reportar o ” @{upstream} ” para cada ref, este patch adiciona ” %(push) ” para corresponder ” @{push} “.
Ele suporta os mesmos modificadores de formato de rastreamento que o upstream (porque você pode querer saber, por exemplo, quais ramificações foram submetidas para push ).

Se você quiser ver quantos commits suas filiais locais estão à frente / atrás em relação ao branch que você está empurrando para:

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

git branch -v mostrará, para cada ramificação local, se está “adiantado” ou não.

Eu uso o seguinte alias para obter apenas a lista de arquivos (e o status) que foram confirmados, mas que não foram enviados (para a ramificação atual)

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

então faça:

 git unpushed 

Eu acredito que a maneira mais típica de fazer isso é executar algo como:

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

No entanto, eu pessoalmente prefiro correr:

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

que mostra os commits de todos os branches que não são fundidos upstream, mais o último commit no upstream (que aparece como um nó raiz para todos os outros commits). Eu uso isso tantas vezes que eu criei alias noup para isso.

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

Eu sugiro que você vá ver o script https://github.com/badele/gitcheck , eu codifiquei este script para verificar em uma passagem todos os seus repositorys git, e mostrar quem não se comprometeu e quem não empurrou / puxou.

Aqui um resultado de amostra insira a descrição da imagem aqui

Não é um inseto. O que você provavelmente vê é o status git após uma mesclagem automática com falha, em que as alterações do controle remoto são buscadas, mas ainda não foram mescladas.

Para ver os commits entre o repository local e o remoto, faça o seguinte:

 git fetch 

Isso é 100% seguro e não vai escarnecer da sua cópia de trabalho. Se houver alterações, o git status mostrará X commits ahead of origin/master .

Agora você pode mostrar log de confirmações que estão no controle remoto, mas não no local:

 git log HEAD..origin 

Existe uma ferramenta chamada unpushed que verifica todos os repositorys Git, Mercurial e Subversion no diretório de trabalho especificado e mostra uma lista de arquivos não confirmados e confirmações unpushed. A instalação é simples no Linux:

 $ easy_install --user unpushed 

ou

 $ sudo easy_install unpushed 

para instalar todo o sistema.

O uso é simples também:

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

Veja unpushed --help ou descrição oficial para mais informações. Ele também possui um script de unpushed-notify para unpushed-notify na canvas de alterações não confirmadas e não processadas.

 git cherry -v 

Isso listará seu histórico de comentários local (ainda não enviado) com a mensagem correspondente

Isso funcionou melhor para mim:

 git log --oneline @{upstream}.. 

ou:

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

Para listar todos os commits unpushed em todos os branches, você pode usar este comando:

  git log --branches @{u}.. 

Eu tive um commit feito anteriormente, não fui empurrado para qualquer branch, nem remoto nem local. Apenas o commit. Nada de outras respostas funcionou para mim, mas com:

 git reflog 

Lá encontrei meu commit.

Se o número de confirmações que não foram enviadas for um número de um único dígito, o que geralmente acontece, a maneira mais fácil é:

 $ git checkout 

git responde dizendo que você está “à frente N compromete” sua origem. Então, basta manter esse número em mente ao visualizar os registros. Se você está “à frente por 3 commits”, os 3 principais commits no histórico ainda são privados.

Semelhante: para visualizar ramificações não mescladas:

 git branch --all --no-merged 

Aqueles podem ser suspeitos, mas eu recomendo a resposta por cxreg

Uma maneira de fazer as coisas é listar os commits que estão disponíveis em um branch, mas não em outro.

 git log ^origin/master master 

Aqui está a minha solução portátil (script de shell que funciona no Windows também sem instalação adicional) que mostra as diferenças de origem para todas as ramificações: git-fetch-log

Um exemplo de saída:

 ==== 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 

parameters passados ​​para log, por exemplo, --oneline ou --patch podem ser usados.

 git show 

mostrará todos os diffs em seus commits locais.

 git show --name-only 

mostrará o ID de confirmação local e o nome da confirmação.

 git diff origin 

Supondo que sua filial esteja configurada para rastrear a origem, isso deve mostrar as diferenças.

 git log origin 

Vai te dar um resumo dos commits.