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
.
@{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}
taquigrafiaEm 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}
), emyfork/topic
mudanças para sua própria bifurcação pessoal (por exemplo, comomyfork/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
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.