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?

Marplesoft
fonte

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).

alex
fonte
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
cforbish
fonte
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.

VonC
fonte
1

Você pode usar apenas git log --oneline

Manoj Rana
fonte
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.

Daniel Casas
fonte
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/^[^\[]*?\[/[/".
menssana
fonte