Como obter o histórico de consolidação para apenas um ramo?


128

Digamos que eu criado um novo ramo my_experimenta partir mastere fez várias commit my_experiment. Se eu fizer um git logquando my_experiment, vejo as confirmações feitas nesta ramificação, mas também as confirmações feitas masterantes da my_experimentscriação da ramificação.

Eu consideraria muito útil ver o histórico de todos os commit no my_experimentsramo até que ele atinja a criação desse ramo - efetivamente, um histórico verdadeiro apenas desse ramo. Caso contrário, não está claro para mim ao examinar o log se os commits estavam na my_experimentsramificação ou não.

Existe uma maneira de fazer isso com o Git?

Respostas:


139

Você pode usar um intervalo para fazer isso.

git log master..

Se você fez check-out de sua my_experimentfilial. Isto irá comparar onde masterestá a HEAD(na ponta de my_experiment).


3
Ok falou cedo demais. Isso foi feito no meu exemplo simples. Mas agora estou olhando para o repo real de outra pessoa e me ocorre que, para usar esse comando corretamente, eu precisaria saber de qual ramificação minha ramificação atual foi criada. Talvez eu deva ser capaz de diferenciar isso do gitk, mas isso não é óbvio para mim. Alguma ideia?
Marplesoft

@ Marplesoft Pode ser complicado descobrir isso. Veja esta pergunta .
alex

Você poderia explicar brevemente como isso funciona? O que git log master..diz ao Git?
tonix

2
@tonix Siga o link na resposta para obter mais informações sobre como um intervalo funciona (a master..) parte.
alex

7

O git merge-basecomando pode ser usado para encontrar um ancestral comum. Portanto, se my_experiment ainda não foi mesclado no master e my_experiment foi criado a partir do master, você pode:

git log --oneline `git merge-base my_experiment master`..my_experiment

Se você deseja incluir o pai do seu primeiro commit, adicione ^ e - first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie

7

Nota: se você limitar esse log ao último n commit (os últimos 3 confirmados, por exemplo, git log -3), certifique-se de colocar um espaço entre 'n' e sua ramificação:

git log -3 master..

Antes do Git 2.1 (agosto de 2014), este erro: git log -3master..realmente mostrava os últimos 3 commits da ramificação atual (aqui my_experiment), ignorando o masterlimite (ou seja, se my_experimentcontiver apenas um commit, 3 ainda serão listados, 2 deles de master)

Veja commit e3fa568 de Junio ​​C Hamano ( gitster) :

revisão: analise " git log -<count>" com mais cuidado

Essa linha de comando digitada simplesmente ignora " master" e acaba mostrando duas confirmações da atual HEAD:

$ git log -2master

porque alimentamos " 2master" atoi()sem garantir que a string inteira seja analisada como um número inteiro.

Use a strtol_i()função auxiliar em seu lugar.


1

Você pode usar apenas git log --oneline


Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
DebanjanB

1

Eu acho que uma opção para seus propósitos é git log --online --decorate. Isso permite que você saiba a confirmação verificada e a parte superior confirma para cada ramo que você possui na sua história. Ao fazer isso, você tem uma boa visão da estrutura do seu repo e dos commits associados a uma ramificação específica. Eu acho que ler isso pode ajudar.


0

Eu sei que é muito tarde para este ... Mas aqui está um oneliner (não tão simples) para obter o que você estava procurando:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Estamos listando confirmações com nome da filial e posições relativas aos estados reais da filial com git show-branch(enviando os avisos para /dev/null).
  • Depois, mantemos apenas aqueles com o nome da nossa ramificação dentro do suporte com grep -E "\[$BRANCH_NAME".
  • Onde real $BRANCH_NAMEé obtido com git branch | grep -E '^\*' | awk '{ printf $2 }'(o ramo com uma estrela, ecoou sem essa estrela).
  • Dos nossos resultados, removemos a linha redundante no início com tail -n+2.
  • E então, limpamos a saída, removendo tudo o que precede [$BRANCH_NAME]com sed -E "s/^[^\[]*?\[/[/".
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.