Visualizando confirmações Git não empurradas

1752

Como posso visualizar quaisquer confirmações locais que fiz e que ainda não foram enviadas ao repositório remoto? Ocasionalmente, git statusimprimirá que meu ramo é X confirma antes origin/master, mas nem sempre.

Isso é um erro na minha instalação do Git ou estou faltando alguma coisa?

Josh Buhler
fonte
18
Começando com Git 2.5+ (Q2 2015), a resposta real seria git log @{push}... Ver que novo atalho @{push}(referenciando o ramo de rastreamento remoto que você está empurrando a) em minha resposta abaixo
VonC
59
@Torek - mais uma tarefa simples dificultada pelo Git. Toda vez que uma pergunta do Git aparece com centenas ou milhares de votos positivos e milhões de visualizações, alguém deve pensar: Uau, nós realmente estragamos esse fluxo de trabalho. Infelizmente, os desenvolvedores do Git omitiram a etapa de feedback no ciclo de vida do desenvolvimento, portanto o feedback não é incorporado. Em vez disso, eles continuam cometendo os mesmos erros repetidamente. Para esta pergunta, git status --alldeveria ter aparecido em 2010; ou git status -vdeve realmente fornecer a saída detalhada que inclui as informações extras.
JWW
4
Eu discordo que "git status -v" deve fornecer essas informações porque se destina a fornecer status sobre a árvore de trabalho, pois se refere apenas ao ramo com check-out. No entanto, veja a resposta abaixo sobre "git branch -v", que eu acredito que deveria ser a resposta aceita
JoelFan
13
Esta questão específica do StackOverflow tem o maior número de respostas corretas que todo o trabalho ainda não faz sentido.
Pete Alvin
@ josh-buhler Desculpe, votei para baixo acidentalmente ... enquanto tentava clicar em 'ESTRELA'. Tentou votar novamente, mas não funcionou!
RafiAlhamd 14/02

Respostas:

1828
git log origin/master..HEAD

Você também pode visualizar o diff usando a mesma sintaxe

git diff origin/master..HEAD
Peter B
fonte
3
Isso foi feito por mim - por algum motivo, a origem do log git .. por si só estava lançando um erro. Parece que também tive um problema com a maneira como minha filial local foi configurada - depois de fazer as alterações que encontrei aqui: wincent.com/blog/…… o problema foi resolvido e eu poderia usar o status git novamente para ver o que queria .
Josh Buhler
6
Inestimável: Foi o que fiz git config --global alias.ahead "log origin/master..HEAD --oneline"para descobrir rapidamente onde estou. Ainda mais doces:for i in *; do echo $i && git ahead 2>/dev/null; done
Jamie
15
git log --stat origin/master..HEADpara um pouco de grandiosidade extra
Cory Danielson
141
Esta não é a melhor solução. A origem / mestre nem sempre pode ser a ramificação upstream. Uma solução melhor é usar @ {u} em vez de "origin / master" para indicar a ramificação upstream. Como HEAD está implícito por padrão, também é possível deixar isso de fora. Veja a resposta de @Ben Ling. Alterações de saída: git log @ {u} .. Alterações de entrada: git log .. @ {u}
PlagueHammer
12
@ Noturno Eu só quero ressaltar que, quando esta resposta foi publicada, a @{u}sintaxe ainda não estava disponível, ela ficou disponível no dia 12 de fevereiro de 2010 . Além disso, @{u}não funcionará se o ramo local não estiver configurado com um upstream. Por fim, @{u}atualmente não possui suporte para preenchimento de guias, <remote>/<branch>com o preenchimento de guias continua sendo uma das maneiras mais rápidas de obter essas informações e funcionará se um upstream estiver configurado ou não.
703

Se você deseja ver todos os commits em todos os ramos que ainda não foram enviados, talvez esteja procurando algo assim:

git log --branches --not --remotes

E se você deseja ver apenas o commit mais recente em cada ramo e os nomes dos ramos, isto:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
cxreg
fonte
8
Isso é incrível. Em um cenário relacionado, eu tinha duas ramificações locais com duas ramificações a montante e uma mão local foi mesclada na outra. Eu queria saber quais confirmações eram seguras para serem recuperadas, mas o normal git log master..HEADnão funcionaria, pois havia vários upstreams. Esta postagem me levou git log MyBranch --not --remotesa mostrar todos os commits que não foram enviados a nenhum montante em um único ramo.
Pavon
Isso foi tão útil que eu fiz um alias na minha configuração do zsh. Obrigado.
22820 Scotty C.
Entendo que seu segundo comando também está listando os commit que ainda não foram enviados, apenas mostra apenas um por branch.
Stephane
--decoratemostra os galhos também. --graphtorna ainda mais óbvio.
Raio
Observe que esses comandos listam apenas confirmações que não foram enviadas por nenhum ramo. Exemplo: digamos que você tenha um desenvolvimento de ramificação com o feat-NewThing. Você faz alterações localmente no feat-NewThing. (O registro tem alterações.) Em seguida, você envia feat-newThing para sua ramificação remota. (O log está vazio). Você mescla feat-newThing local para desenvolver localmente. Supondo um avanço rápido, o log ainda não possui alterações.
22417 Patrick St W
325

Você pode mostrar todas as confirmações que possui localmente, mas não a montante com

git log @{u}..

@{u}ou @{upstream}significa a ramificação a montante da ramificação atual (consulte git rev-parse --helpou git help revisionspara obter detalhes).

Ben Lings
fonte
17
No Windows, eu precisava colocar o argumento final entre aspas, como: git log "@ {u} .."
Jon Schneider
git log @{u}.. -p Uma das opções mais úteis é -p , que mostra as diferenças introduzidas em cada confirmação.
MQuiroz
Possivelmente melhor git log @ {push} .., veja outra resposta .
Hans-Peter Störr 26/11/19
183

Isso funcionou para mim:

git cherry -v 

Conforme indicado no Git: Veja todas as confirmações não confirmadas ou confirmadas que não estão em outra ramificação .

Christian Vielma
fonte
21
Eu acho que essa deve ser a resposta principal, pois ela fornece a lista mais sucinta de commits, em vez de difícil leitura, diferença detalhada em todos os arquivos!
ViFI 12/08/16
1
git-cherry - "Localizar confirmações ainda a serem aplicadas ao upstream", parece fornecer o que o OP estava solicitando, mas apenas com assunto de confirmação em vez de toda a mensagem de confirmação.
Eido95
2
Vale a pena notar que isso informa apenas se há confirmações não enviadas na filial que você efetuou check-out no momento. Não informará se você tem uma filial local (atualmente não registrada) com confirmações não enviadas.
precisa
66

Você pode fazer isso com git log:

git log origin..

Supondo que esse originseja o nome do seu upstream, deixando de fora qualquer nome de revisão após o ..implícito HEAD, que lista os novos commits que não foram enviados.

Greg Hewgill
fonte
1
Sempre que vejo uma resposta com git loge "2-pontos-não-3", ele sempre me lembra stackoverflow.com/questions/53569/… ;)
VonC
1
Apenas para adicioná-lo à resposta - se não houver configuração a montante, este comando resultará em dizer que não há configuração a montante. Execute git branch --set-upstream master origin/<branch>para configurar o upstream se você estiver inclinado a usar este comando para ver confirmações que são preparadas.
Asyncwait
Isso será comparado com a ramificação padrão na origem, não com a ramificação remota atual.
Greuze
43

Todas as outras respostas falam sobre "upstream" (o ramo do qual você puxa).
Porém, uma ramificação local pode enviar para uma ramificação diferente daquela que ele puxa.

masterpode não enviar para a ramificação de rastreamento remoto " origin/master".
O ramo upstream de masterpode ser origin/master, mas pode ser enviado para o ramo de rastreamento remoto origin/xxxou até mesmo anotherUpstreamRepo/yyy.
Esses são definidos branch.*.pushremotepara a ramificação atual junto com o global remote.pushDefaultvalor.

É que ramo de rastreamento remoto, que conta quando procuram commits unpushed: aquele que controla o branch at the remoteonde o ramo local seria empurrado para.
O branch at the remotepode ser, novamente, origin/xxxou mesmo anotherUpstreamRepo/yyy.

O Git 2.5+ (Q2 2015) apresenta um novo atalho para isso: <branch>@{push}

Veja 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 de 21 de maio 2015] e confirme e41bf35 [01 de maio de 2015] por Jeff King ( peff) .
(Mesclado por Junio ​​C Hamano - gitster-no commit c4a8354 , 05 jun 2015)

A confirmação adfe5d0 explica:

sha1_name: implementar @{push}taquigrafia

Em um fluxo de trabalho triangular, cada ramificação pode ter dois pontos de interesse distintos: o de @{upstream}onde você normalmente sai e o destino para o qual normalmente envia. Não existe uma abreviação para o último, mas é útil ter.

Por exemplo, você pode querer saber quais confirmações você ainda não enviou :

git log @{push}..

Ou, como exemplo mais complicado, imagine que você normalmente extrai alterações origin/master(que você definiu como sua @{upstream}) e envia as alterações para seu próprio fork pessoal (por exemplo, as myfork/topic).
Você pode enviar para o garfo a partir de várias máquinas, exigindo que você integre as alterações a partir do destino do envio, e não a montante .
Com esse patch, você pode fazer:

git rebase @{push}

em vez de digitar o nome completo.

O commit 29bc885 acrescenta:

for-each-ref: aceite o %(push)formato " "

Assim como temos " %(upstream)" para reportar o " @{upstream}" para cada referência, 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 filiais têm o compromisso de enviar por push ).

Se você deseja ver quantas confirmações suas ramificações locais estão à frente / atrás em comparação com a ramificação para a qual você está empurrando:

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

Alias ​​prático do git para procurar confirmações não enviadas na ramificação 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 do ramo atual.

leva
fonte
8
Isso é incrível! Para aqueles que não estão familiarizados com aliases, adicione-os ao seu arquivo ~ / .gitconfig na seção [alias].
Gary Haran
1
Copiar / colar em bash não funcionar, mas o roteiro é bastante útil e compreensível
greuze
Este não é um alias do bash, como aponta @GaryHaran. Também existe um comando git para adicionar aliases: git alias <alias-name> <command>nesse caso, o comando deve estar entre aspas simples, para escapar de caracteres especiais do shell.
Dag Høidahl 27/01
4
Isso seria: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
Parece basicamente o mesmo que git log @ {u} .. - veja outra resposta .
Hans-Peter Störr 26/11/19
35

Você poderia tentar....

gitk

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

(Estou realmente meio surpreso que ninguém tenha mencionado isso até agora.)

Justin Ohms
fonte
3
gitk --allpara visualizar todos os ramos.
Raio
3
tigé a alternativa ncurses.
Raio
@ justin-ohms gitké incrível! Nunca soube que isso existe! Útil para navegar pelas alterações em uma boa interface do usuário.
RafiAlhamd 14/02
O @ray tigé mais útil em uma situação 'terminal only' - onde você não obtém acesso à GUI da área de trabalho. Aprendendo sobre isso pela primeira vez! INTERESSANTE: tigé o inverso git!
RafiAlhamd
30

git branch -v mostrará, para cada filial local, se está "à frente" ou não.

Aurelien
fonte
2
Sim, caso haja uma confirmação não enviada na ramificação devel, a linha correspondente será * devel 8a12fc0 [ahead 1] commit msg( *será apenas na linha correspondente à ramificação com check-out). ahead 1significa "avançar por um commit", ou seja, há um commit não empurrado.
precisa
2
Não é git branch -vv? Cf. docs: “Se fornecido duas vezes, imprima também o nome da ramificação upstream (consulte também git remote show <remote>).”
Dirty Henry
Não se trata de imprimir o nome da ramificação upstream, mas apenas de imprimir behinde / ou aheadpara cada ramificação local, o que é suficiente para resolver o problema do OP (detecção de confirmações não enviadas). git branch -vé o suficiente para que, assim testados novamente com o Git 2.16.2 :)
Aurelien
O -vv é útil porque mostra uma diferença entre os ramos que estão atualizados com o controle remoto e os que não foram enviados por push. (Com apenas um -v, eles aparecem identicamente na tela.)
RM
30

Eu fiz um commit anteriormente, não fui enviado a nenhum ramo, nem remoto nem local. Apenas o commit. Nada de outras respostas funcionou para mim, mas com:

git reflog

Lá encontrei meu commit.

Olaia
fonte
Conforme indicado neste link , git-scm.com/docs/git-reflog , Registros de referência ou "reflogs", registram quando as dicas de ramificações e outras referências foram atualizadas no repositório local. No meu caso, clonei um repositório, criei um novo ramo, excluí o ramo, criei um novo, criei um commit e alterei o commit. Todas essas etapas foram gravadas como HEAD @ {0}: commit (emendar): .. HEAD @ {1}: commit: ... HEAD @ {2}: finalizado: saindo de ... para ... HEAD @ { 3}: checkout: movendo-se de ... para ... HEAD @ {4}: clone: ​​from #sorry pelo formato SO não permite multilinhas nos comentários, aparentemente
velocidade
isso inclui também a origem confirmada, a melhor solução seria usar o comando fornecido pelo @PlagueHammer ( stackoverflow.com/a/2016954/624048 )
Lincoln
20

Eu uso o seguinte alias para obter apenas a lista de arquivos (e o status) que foram confirmados, mas 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
CCC
fonte
parece interessante, mas $ (nome-rev --name somente CABEÇA git) é "indefinido" no meu caso
vak
13

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

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

No entanto, eu pessoalmente prefiro executar:

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

que mostra as confirmações de todas as ramificações que não foram mescladas a montante, mais a última confirmação a montante (que aparece como um nó raiz para todas as outras confirmações). Eu o uso com tanta frequência que criei um alias nouppara ele.

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

Eu sugiro que você vá ver o script https://github.com/badele/gitcheck , codifiquei esse script para verificar em uma passagem todos os seus repositórios git e mostrar quem não fez o commit e quem não fez push / pull.

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

Bruno Adelé
fonte
1
Você poderia explicar como fazer esse plugin funcionar na máquina Windows? Estou tentando executar o pip, mas o comando está ausente na linha de comando. Eu tenho o Python instalado, mas não tenho certeza se é o suficiente.
Konrad Szałwiński
@ KonradSzałwiński Eu não tenho máquina Windows, mas neste tópico ( stackoverflow.com/questions/4750806/… ), o usuário parece responder à sua pergunta :). Mas eu não testei no Windows e não tenho certeza de que funcione.
Bruno Adelé
@ KonradSzałwiński o colaborador do ChristianTremblay github adicionou um suporte para windows. Agora o geckeck funciona nas janelas. Você pode baixá-lo em github.com/badele/gitcheck
Bruno Adelé 27/11/2014
Agora, você também pode usar gitcheck diretamente de um recipiente janela de encaixe (com seus arquivos em seu host) Para mais informações consulte o projeto gitcheck github
de Bruno Adele
Obrigado por postar isso, parece realmente útil. Tentei instalar, mas após a instalação não consigo encontrar o local do script para executá-lo. $ pip install git + git: //github.com/badele/gitcheck.git Coletando git + git: //github.com/badele/gitcheck.git Clonando git: //github.com/badele/gitcheck.git para c : \ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build Instalando pacotes coletados: gitcheck Executando setup.py instalação para gitcheck: iniciado Executando setup.py instalação para gitcheck: iniciado com status 'concluído' Instalado com sucesso gitcheck-0.3 .22
Lauren Fitch
10
git cherry -v

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

adswebwork
fonte
9

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

Para ver as confirmações entre repositório local e remoto, faça o seguinte:

git fetch

Isso é 100% seguro e não simula sua cópia de trabalho. Se houver mudanças, será git statusexibido X commits ahead of origin/master.

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

git log HEAD..origin
Igor Zevaka
fonte
8

Isso funcionou melhor para mim:

git log --oneline @{upstream}..

ou:

git log --oneline origin/(remotebranch)..
VaTo
fonte
2
Para quem quiser saber, @{upstream}é literal ( upstreamé uma palavra mágica), enquanto remotebranché apenas o nome do seu ramo.
Steve Bennett
7

Existe uma ferramenta chamada não pressionada que varre todos os repositórios Git, Mercurial e Subversion no diretório de trabalho especificado e mostra a lista de arquivos não autorizados e as confirmações não enviadas. A instalação é simples no Linux:

$ easy_install --user unpushed

ou

$ sudo easy_install unpushed

instalar em todo o sistema.

O uso também é simples:

$ 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 --helpou descrição oficial para mais informações. Ele também possui um script cronjob unpushed-notifypara notificação na tela de alterações não confirmadas e não enviadas.

pistola de pregos
fonte
5

Para listar todas as confirmações não enviadas em todas as ramificações facilmente, você pode usar este comando:

 git log --branches  @{u}..
Mohsen Kashi
fonte
4

Similar: Para visualizar ramificações não imersas:

git branch --all --no-merged

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

Christophe Roussy
fonte
3

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

$ git checkout

O git responde dizendo que você está "adiantado N confirma" em relação à sua origem. Portanto, agora lembre-se desse número ao visualizar logs. Se você estiver "à frente em três confirmações", as três confirmações principais da história ainda serão privadas.

Kaz
fonte
2

Uma maneira de fazer as coisas é listar confirmações disponíveis em uma ramificação, mas não em outra.

git log ^origin/master master
Alex
fonte
O que o caractere '^' faz?
Aran Mulholland
@AranMulholland significa não aqui.
26416 Alex
1

Como dito acima:

origem do git diff / master..HEAD

Mas se você estiver usando git gui

Depois de abrir a interface da GUI, selecione "Repositório" -> Abaixo desse item " Visualizar histórico "

Nota: Algumas pessoas gostam de usar o CMD Prompt / Terminal, enquanto outras gostam de usar a GUI do Git (para simplificar)

vrnair24
fonte
A opção visualizar no git gui é a única.
Rajesh Kolhapure
-2

Aqui está minha solução portátil (shell script que também funciona no Windows sem instalação 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 <[email protected]>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <[email protected]>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

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

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

      Last common commit

Os parâmetros passados ​​para o log, por exemplo, --onelineou --patchpodem ser usados.

bimlas
fonte
-3
git show

mostrará todas as diferenças nos seus commit locais.

git show --name-only

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

user2387567
fonte
3
git showmostra apenas a confirmação mais recente, independentemente de ter sido enviada para o controle remoto ou não, não mostrará todas as confirmações não enviadas por push.
-6
git diff origin

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

git log origin

Fornecerá um resumo dos commits.

mopoke
fonte
3
git log originmostrará confirmações que já foram enviadas por push , mas não mostrará confirmações que não foram enviadas , o que é mais parecido com o que o pôster original estava pedindo.