Como listar ramificações que contêm um determinado commit?


1088

Como posso consultar o git para descobrir quais ramificações contêm um determinado commit? gitknormalmente listará os ramos, a menos que haja muitos, caso em que apenas diz "muitos (38)" ou algo parecido. Preciso conhecer a lista completa, ou pelo menos se certas ramificações contêm a confirmação.



Pergunta relacionada para um commit equivalente por comentários: stackoverflow.com/questions/16304574/…
UpAndAdam

Respostas:


1471

Na página de manual do git-branch :

 git branch --contains <commit>

Listar apenas ramificações que contêm a confirmação especificada (HEAD, se não especificado). Implica --list.


 git branch -r --contains <commit>

Listas remoto rastreamento ramos bem (como mencionado no user3941992 's resposta abaixo) que é 'ramos locais que têm uma relação direta com a filial remota'.


Veja também este artigo pronto para o git .

A --containstag descobrirá se um certo commit já foi trazido para sua ramificação. Talvez você tenha um SHA de confirmação de um patch que pensou ter aplicado ou apenas deseja verificar se a confirmação do seu projeto de código aberto favorito que reduz o uso de memória em 75% já está disponível.

$ git log -1 tests
commit d590f2ac0635ec0053c4a7377bd929943d475297
Author: Nick Quaranto <nick@quaran.to>
Date:   Wed Apr 1 20:38:59 2009 -0400

    Green all around, finally.

$ git branch --contains d590f2
  tests
* master

Nota: se o cometer está em um ramo de monitoramento remoto , adicione a -aopção .
(como MichielB comenta abaixo )

git branch -a --contains <commit>

MatrixFrog comenta que mostra apenas quais ramificações contêm esse commit exato .
Se você deseja saber quais ramificações contêm uma confirmação "equivalente" (ou seja, quais ramificações escolheram essa confirmação), isso é git cherry:

Como git cherry compara o changeset em vez do ID de confirmação (sha1) , você pode usar git cherrypara descobrir se uma confirmação feita localmente foi aplicada <upstream>sob um ID de confirmação diferente.
Por exemplo, isso acontecerá se você estiver alimentando correções <upstream>por email, em vez de enviar ou enviar confirmações diretamente.

           __*__*__*__*__> <upstream>
          /
fork-point
          \__+__+__-__+__+__-__+__> <head>

(Aqui, os commits marcados com ' -' não apareceriam git cherry, o que significa que eles já estão presentes <upstream>.)


3
testse master- masteré o ramo atual, portanto, o asterisco.
blueyed

54
Isso mostra apenas quais ramificações contêm esse commit exato . Se você quiser saber quais ramificações contêm uma confirmação "equivalente" (ou seja, quais ramificações escolheram essa confirmação), isso é git cherry: "Como o git cherry compara o changeset em vez do ID de confirmação (sha1), você pode usar o git cherry para descobrir se uma confirmação que você fez localmente foi aplicada <upstream> sob um ID de confirmação diferente. Por exemplo, isso acontecerá se você estiver alimentando correções <upstream> por email, em vez de enviar ou enviar confirmações diretamente ". kernel.org/pub/software/scm/git/docs/git-cherry.html
MatrixFrog

62
Adicione um -aparâmetro para também verificar ramificações remotas.
Raman

28
Você também pode fazer git tag --contains <commit>. Consulte Procurando por todas as tags que contêm uma confirmação? .
Andrew Marshall

5
Para a git cherryparte @UpAndAdam, faça a pergunta aqui: stackoverflow.com/questions/16304574/… , infelizmente, a pergunta ainda não foi respondida.
adeelx

22

Você pode executar:

git log <SHA1>..HEAD --ancestry-path --merges

No comentário do último commit na saída, você pode encontrar o nome original da ramificação

Exemplo:

       c---e---g--- feature
      /         \
-a---b---d---f---h---j--- master

git log e..master --ancestry-path --merges

commit h
Merge: g f
Author: Eugen Konkov <>
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'feature' into master

6
Agradável! I utilizado git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1para obter isso em uma linha
James EJ

1
Se você deseja usar o comando git puro, pode usar:git log <SHA1>..master --ancestry-path --merges --oneline -1
Bartosz

Nota: Quando seu commit sha é o commit mais recente no ramo master / foo (HEAD) ... você não pode executar um A..Bintervalo de commit, apenas não use um range como este :: git log HEAD --oneline -1> 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.
Devin G Rhode /

Se este repositório git é um submódulo e você está tentando resolver o problema desanexado da HEAD ... então você tem uma pergunta difícil sobre uma ramificação preferida ... No meu exemplo anterior, você poderia facilmente dizer que mastersempre é preferível se estiver nesta lista . A partir daí, é menos claro. Você poderia tentar e ler git branch de arquivo .gitmodules: git config -f .gitmodules submodule.src/foo/submodule.branch. Pode ser um garfo / pr de longa data. Você pode cd para repo root e executar git config submodule.src/foo/submodule.branch. Você também pode usar o ramo git atual dos superprojetos.
Devin G Rhode /

Como um pequeno aparte: git config submodule.src/foo/submodule.branchPode ser influenciado por qualquer variedade de configurações do git, incluindo um arquivo .gitconfig repo-local. (requer execução git config --local include.path ./path/to/your/.gitconfig)
Devin G Rhode
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.