Visualizando commits Git unpushed
Pergunta
Como posso ver nenhum commit locais que eu fiz, que ainda não foram empurrados para o repositório remoto? Ocasionalmente, git status
irá imprimir que o meu ramo é X comete à frente de origin/master
, mas nem sempre.
Este é um bug com a minha instalação do Git, ou estou faltando alguma coisa?
Solução
git log origin/master..HEAD
Você também pode ver o diff usando a mesma sintaxe
git diff origin/master..HEAD
Outras dicas
Se você quiser ver todos os commits em todos os ramos que ainda não são empurrados, você pode estar à procura de algo como isto:
git log --branches --not --remotes
E se você só quiser ver o mais recente comprometer em cada ramo, e os nomes do ramo, isto:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
Você pode mostrar todos os commits que você tem localmente, mas não a montante com
git log @{u}..
@{u}
ou @{upstream}
meio do ramo a montante do ramo atual (veja git rev-parse --help
ou git help revisions
para mais detalhes).
Isso funcionou para mim:
git cherry -v
Como indicado em Git: Veja todos os commits unpushed ou commits que não estão em outro ramo
. Você pode fazer isso com git log
:
git log origin..
Assumindo que origin
é o nome do seu montante, deixando de fora qualquer nome de revisão após ..
implica HEAD
, que lista as novas submissões que não foram empurrados.
apelido git acessíveis para procurar commits unpushed em atual ramo:
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline
O que isto faz basicamente:
git log origin/branch..branch
mas também determina nome de ramo atual.
Todas as outras respostas falar sobre "upstream" (o ramo que você puxar a partir).
Mas um filial local pode impulso para um diferente ramo do que aquele que puxa a partir.
master
não pode empurrar para o controle remoto ramo de rastreamento "origin/master
".
O a montante ramo para master
pode ser origin/master
, mas poderia empurrar para o origin/xxx
rastreamento filial remota ou mesmo anotherUpstreamRepo/yyy
.
Aqueles são definidas por branch.*.pushremote
para o ramo atual juntamente com o valor global remote.pushDefault
.
É que de rastreamento remoto ramo que conta quando procuram commits unpushed:. A que as faixas do branch at the remote
onde o filial local seria empurrado para
O branch at the remote
pode ser, de novo, origin/xxx
ou mesmo anotherUpstreamRepo/yyy
.
Git 2.5+ (Q2 2015) introduz um novo atalho para isso: <branch>@{push}
cometer 29bc885 , cometer 3dbe9db , cometer adfe5d0 , cometer 48c5847 , cometer a1ad0eb , cometer e291c75 , cometer 979cb24 , cometer 1ca41a1 , cometer 3a429d0 , cometer a9f9f8c , cometer 8770e6f , cometer da66b27 , cometer f052154 , cometer 9e3751d , cometer ee2499f [tudo a partir de 21 de maio de 2015], e cometer e41bf35 [01 de maio de 2015] b y Jeff King (peff
) .
(incorporada pela Junio ??C Hamano - gitster
- em cometer c4a8354 , 05 de junho de 2015)
Commit adfe5d0 explica:
sha1_name
: implementar@{push}
atalhoEm um fluxo de trabalho triangular, cada ramo pode ter dois pontos distintos de interesse: o
@{upstream}
que você normalmente puxar, eo destino que você normalmente empurrar para. Não é um atalho para o último, mas é útil ter.Por exemplo, você pode querer saber o que compromete você não temainda empurrou :
git log @{push}..
Ou como um exemplo mais complicado, imagine que você normalmente puxar mudanças a partir
origin/master
(que você definiu como seu@{upstream}
), e mudanças de envio a seu próprio garfo pessoal (por exemplo, comomyfork/topic
).
Você pode empurrar para o garfo de várias máquinas, exigindo que você integram as alterações do destino impulso, em vez da montante .
Com este patch, você pode apenas fazer:
git rebase @{push}
em vez de digitar o nome completo.
Commit 29bc885 acrescenta:
for-each-ref
: aceitar "%(push)
" formatoAssim como nós temos "
%(upstream)
" para relatar a "@{upstream}
" para cada ref, este patch adiciona "%(push)
" para corresponder "@{push}
".
Ele suporta os mesmos modificadores formato de rastreamento como a montante (porque você pode querer saber, por exemplo, que ramos têm commits para empurrar ).
Se você quiser ver quantos comprometer suas filiais locais são à frente / trás em comparação com o ramo que você está empurrando a:
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
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 um lote inteiro mais.
(Eu estou realmente tipo de surpreendeu ninguém mencionou até agora.)
git branch -v
mostrará, para cada ramo local, quer se trate da "frente" ou não.
Eu uso o seguinte apelido para obter apenas a lista de arquivos (e o status) que foram cometidos, mas não foram empurrados (para o ramo atual)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
em seguida, basta fazer:
git unpushed
Eu tinha um commit feito anteriormente, não empurrado para qualquer ramo, nem remoto nem local. Apenas a cometer. Nada de outras respostas funcionou para mim, mas com:
git reflog
Lá encontrei o meu cometer.
Eu acredito que a maneira mais comum 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 compromete de todas ramos que não são incorporadas a montante, mais o último commit no montante (que aparece como um nó de raiz para todos os outros commits) . Eu usá-lo tantas vezes que eu criei apelido noup
para ele.
git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
Não é um bug. O que você provavelmente vendo é git status depois de uma auto-junção falhou onde as mudanças de controle remoto são buscados, mas ainda não se fundiram.
Para ver os commits entre repo local e remoto faça o seguinte:
git fetch
Este é 100% seguro e não vai zombar de sua cópia de trabalho. Se houve mudanças git status
show de X commits ahead of origin/master
wil.
Você pode agora mostrar o registo de commits que estão no remoto, mas não no local:
git log HEAD..origin
Eu sugiro que você vá ver o script https://github.com/badele/gitcheck , i ter codificado esse script para check in One Pass todos os seus repositórios git, e mostrar que não tenha cometido e que não tenha empurrado / puxado.
Aqui, um resultado da amostra
git cherry -v
Isto irá listar o seu comentário história local (ainda não empurrou) com a mensagem correspondente
Há ferramenta chamada unpushed que verifica todos os repos Git, Mercurial e Subversion no diretório de trabalho especificado e mostra uma lista de arquivos ucommited e commits unpushed. A instalação é simples sob 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 oficial descrição para obter mais informações. Ele também tem uma unpushed-notify
roteiro cronjob para a notificação na tela de mudanças uncommited e unpushed.
Isso funcionou melhor para mim:
git log --oneline @{upstream}..
ou
git log --oneline origin/(remotebranch)..
Similar: Para visualizar ramos unmerged:
git branch --all --no-merged
Aqueles pode ser suspeito, mas eu recomendo a resposta por cxreg
Para listar todas unpushed cometer em todos os ramos facilmente você pode usar este comando:
git log --branches @{u}..
Se o número de submissões que não foram empurrados para fora é um número de um dígito, o que muitas vezes é, a maneira mais fácil é:
$ git checkout
responde git por lhe dizer que você está "à frente N comete" em relação a sua origem. Portanto, agora apenas manter esse número em mente ao visualizar logs. Se você está "à frente por 3 commits", o top 3 commits na história ainda são privados.
uma maneira de fazer as coisas é a lista de commits que estão disponíveis em um ramo, mas não o outro.
git log ^origin/master master
Aqui está a minha solução portátil (shell script que funciona no Windows também sem instalar adicional), que mostra as diferenças de origem para todos os ramos: git-fetch-log
Um exemplo de saída:
==== 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
Os parâmetros passados ??para o log, por exemplo, --oneline
ou --patch
pode ser usado.
git show
irá mostrar todos os diffs em seus commits locais.
git show --name-only
mostrará o local de cometer id eo nome do cometer.
git diff origin
Assumindo que o seu ramo está configurado para rastrear a origem, em seguida, que deve mostrar-lhe as diferenças.
git log origin
Vamos dar-lhe um resumo dos commits.