avançar / atrasar informações entre mestre e filial?

201

Eu criei uma ramificação para teste no meu repositório local ( test-branch) para o qual eu enviei Github.

Se eu for para minha Githubconta e selecionar esta opção test-branch, serão exibidas as informações:

This branch is 1 commit ahead and 2 commits behind master

Minhas perguntas são:

  1. Como posso exibir essas informações localmente (por exemplo: um comando que mostra isso no terminal, em vez de precisar abrir Githubpara vê-lo)?
  2. Eu sei que posso ver as diferenças entre os ramos usando:

    git diff master..test-branch
    

    ou usando Meld(o que eu prefiro):

    git difftool master..test-branch
    

    mas eu queria saber se há uma maneira de ver os commits de frente e de trás separadamente. IE: existe uma maneira de mostrar que 1 comprometo-me à frente por si só e depois esses 2 comprometem- se por si mesmos?

Gabriel
fonte
1
O Git 2.5+ (Q2 2015) será apresentado git for-each-ref --format="%(push:track)" refs/heads. Veja minha resposta abaixo
VonC 8/15
1
Como não consegui encontrar essa pergunta usando as palavras-chave que estou prestes a escrever, quero apenas observar que isso equivale a receber o complemento relativo (ou "diferença de conjunto") entre os conjuntos de confirmações que compõem esses ramos (e contando os elementos). Esperemos que isso chegue aos índices dos mecanismos de pesquisa.
Pmos

Respostas:

309

Aqui está um truque que encontrei para comparar dois ramos e mostrar quantos commits cada ramo está à frente do outro (uma resposta mais geral na sua pergunta 1):

Para filiais locais : git rev-list --left-right --count master...test-branch

Para filiais remotas : git rev-list --left-right --count origin/master...origin/test-branch

Isso fornece resultados como os seguintes:

1 7

Esta saída significa: "Comparado a master, test-branché 7 confirmados à frente e 1 confirmados atrás."

Você também pode comparar filiais locais com filiais remotas, por exemplo, origin/master...masterpara descobrir quantas confirmações a masterfilial local está à frente / atrás de sua contraparte remota.

user1834095
fonte
1
Esta é uma ótima solução para descobrir se posso excluir um ramo ou se ele ainda está à frente do desenvolvimento.
Maverick1st
1
@ Maverick1st, sim, esse comando é particularmente útil quando você está seguindo o fluxo de trabalho gitflow (que eu sou)
user1834095
2
Este é o melhor para o meu caso de uso, para descobrir se o ramo de recursos atual está atrás do mestre remoto ( git rev-list --left-right --count origin/master...@) - desde que o usuário o faça git fetchantes; útil para impedir solicitações de recebimento de ramificações desatualizadas.
jakub.g
9
Para verificar quantas confirmações atrasadas é a ramificação atual:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g 4/16/16
8
@ jakub.g você não precisa cortar se você usar --left-onlyou--right-only
jasonkarns
39

Antes de tudo, para ver quantas revisões você está atrasando localmente, faça um git fetchpara garantir que você tenha as informações mais recentes do seu controle remoto.

A saída padrão de git statusinforma quantas revisões você está à frente ou atrás, mas geralmente acho isso muito detalhado:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Eu prefiro git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

Na verdade, eu alias isso simplesmente git s, e este é o comando principal que eu uso para verificar o status.

Para ver a diferença nas "revisões futuras" de master, posso excluir as "revisões posteriores" de origin/master:

git diff master..origin/master^

Para ver a diferença nas "revisões posteriores" de origin/master, posso excluir as "revisões futuras" de master:

git diff origin/master..master^^

Se houver cinco revisões à frente ou atrás, pode ser mais fácil escrever assim:

git diff master..origin/master~5
git diff origin/master..master~5

ATUALIZAR

Para ver as revisões anteriores / posteriores, a ramificação deve ser configurada para rastrear outra ramificação. Para mim, esse é o comportamento padrão quando clono um repositório remoto e depois de enviar uma ramificação com git push -u remotename branchname. Minha versão é 1.8.4.3, mas está funcionando assim desde que me lembro.

A partir da versão 1.8, você pode definir o ramo de rastreamento assim:

git branch --track test-branch

A partir da versão 1.7, a sintaxe era diferente:

git branch --set-upstream test-branch
janos
fonte
Qual versão gitvocê está usando? Não consigo reproduzir o que você recebe git statusnem com nem git status -sb. Se eu tentar um dos comandos (depois de fazer git fetch), não recebo nenhuma informação sobre confirmações à frente / atrás.
Gabriel
8
Sua maneira de ver commits frente e para trás é aplicada a mastere origin/mastere quero ver essas diffs para mastere de um outro ramo test-branch. Você poderia reformatar sua resposta para resolver esse problema?
Gabriel
As diferenças nas revisões "atrás" e "adiante" só funcionam para mim se eu usar 3 pontos entre os nomes das ramificações (não 2). E o ^ e ^^ não pareciam importar aqui. Exemplo: git diff master ... origem / mestre git diff origem / mestre ... mestre De qualquer forma, "git status -sb" foi muito útil.
Vituel
10

Com o Git 2.5+, agora você tem outra opção para visualizar antecipadamente / atrasar todas as ramificações configuradas para enviar para uma ramificação.

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

Veja mais em " Visualizando confirmações não empurradas do Git "

VonC
fonte
Você poderia fazer isso apenas para a filial atual e sua filial de rastreamento remoto?
spex 8/09/17
@ spex yes: complete refs/headscom o nome da ramificação atual ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Você também pode usar awkpara torná-lo um pouco mais bonito:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Você pode até criar um alias que sempre busca a origem primeiro e depois compara as ramificações

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Antonis
fonte
1

Depois de fazer uma busca git, você pode executar o status git para mostrar quantas confirmações a filial local está à frente ou atrás da versão remota da filial.

Isso não mostra quantos commits estão à frente ou atrás de uma ramificação diferente. Suas opções são o diff completo, olhando para o github ou usando uma solução como a Vimhsa vinculada acima: Status do Git em todos os repositórios

Wade Williams
fonte