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?



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.


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

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 "


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"

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.