Você poderia mudar sua resposta aceita? A maioria gosta da --is-ancestorsolução.
Robert Siemer
Respostas:
51
Se você deseja verificar isso programaticamente (por exemplo, no script), pode verificar se git merge-base A Bé igual a git rev-parse --verify A(então A é acessível a partir de B), ou se é git rev-parse --verify B(então B é acessível a partir de A). git rev-parseaqui é necessário para converter do nome de confirmação para confirmar o ID SHA-1 / commit.
Edit: no Git moderno, há suporte explícito para esta consulta na forma de git merge-base --is-ancestor.
Se um dos commits que você está perguntando for uma dica de ramificação , então git branch --contains <commit>ou git branch --merged <commit>pode ser uma solução não programática melhor.
Possivelmente, o caminho mais rápido seria para git checkout -b quickcheck <more-recent-commit-ID>e depois git branch --contains <older-commit-ID>(e git branch -D quickcheckpara se livrar do ramo temporário).
clee
2
Duas abordagens possíveis, ambas muito piores que a da resposta de @ MattR.
Jwg 9/08
6
@jwg: A resposta do MattR é melhor, mas essa resposta (e provavelmente está sendo aceita) é anterior ao git 1.8.0 e git merge-base --is-ancestorpor 2 anos.
Jakub Narębski
@ JakubNarębski Justo, desculpe.
GTC
2
Em um grande repositório (2 milhões de commits), comparei a velocidade git branch --contains <commit>e git merge-base --is-ancestor ...: 3m40s vs 0.14s
hagello
259
No Git 1.8.0, isso é suportado como uma opção para merge-base:
Verifique se o primeiro é um ancestral do segundo e saia com o status 0, se verdadeiro, ou com o status 1, se não for. Os erros são sinalizados por um status diferente de zero que não é 1.
Em outras palavras: git merge-base THING --is-ancestor OF_THING && echo yes || echo nopor exemplo:git merge-base my-feature-branch --is-ancestor master && echo yes || echo no
user1735594 14/02
2
O @smarber git merge-base --is-ancestor -- commit committrabalha com hashes ao meu lado com git2.1.4 (Debian / Devuan 7.10 jessie) e 1.9.1 (Ubuntu 14.04 confiável), que são bastante antigos agora. Funciona mesmo para o Debian wheezy, se você o fizer sudo apt-get install git/wheezy-backports.
Se o último commit exibido for o mesmo que o primeiro commit no git rev-listcomando, será um commit acessível a partir do segundo commit.
Se o primeiro commit não estiver acessível a partir do segundo, git rev-listnada retornará.
git rev-list --boundary A..B
terminaria por A, se Aestiver acessível a partir de B.
É o mesmo que:
git rev-list --boundary B --not A
, com Buma referência positiva e Auma referência negativa .
Ele inicia Be volta ao gráfico até encontrar uma revisão acessível a partir dele A.
Eu diria que, se Afor diretamente acessível B, ele encontrará (e será exibido, devido à --boundaryopção) em Asi.
Oh, cara, parece que eu tenho que voltar e trabalhar nas minhas costeletas de script do Shell!
Lawrence I. Siden
1
pergunta: por que -85e54e2...o snippet tem um sinal de menos? também um possível erro de digitação: "... é o mesmo que o primeiro cometer ..."
sdaau
1
@sdaau -significa que é um commit de limite. Editei a resposta para torná-la mais clara, além de atualizar os links dos documentos e corrigir o erro de digitação desta resposta de 5 anos.
VonC 15/03/2015
11
Outra maneira seria usar git loge grep.
git log --pretty=format:%H abc123 | grep def456
Isso produzirá uma linha de saída se a confirmação def456 for um ancestral da confirmação abc123, ou nenhuma saída de outra forma.
Geralmente, você pode omitir o --prettyargumento, mas é necessário se você quiser ter certeza de que apenas pesquisa através de hashes de confirmação reais e não através de comentários de log e assim por diante.
Se você estiver usando git merge-base --is-ancestor, certifique-se de usar o Git 2.28 (terceiro trimestre de 2020)
Com o Git 2.28 (terceiro trimestre de 2020), alguns campos " struct commit" que nem sempre precisam estar presentes foram movidos para confirmar lajes.
O commit da estrutura é usado em muitos contextos. No entanto, os membros generatione graph_possão usados apenas para operações relacionadas a commit-graph e, de outra forma, desperdiçam memória.
Esse desperdício teria sido mais pronunciado na transição para o número de geração v2, que usa o número de geração de 64 bits em vez dos atuais 32 bits.
Como eles geralmente são acessados juntos, vamos apresentar o struct commit_graph_datae movê-los para uma commit_graph_datalaje.
Enquanto o conjunto de testes geral é executado tão rápido quanto master(séries: 26m48s,: master27m34s, mais rápido em 2,87%), alguns comandos como git merge-base --is-ancestorforam retardados em 40%, conforme descoberto por Szeder Gábor .
Depois de minimizar o acesso à laje de consolidação, a desaceleração persiste, mas está mais próxima de 20%.
Derrick Stolee acredita que a desaceleração é atribuível ao algoritmo subjacente, e não à lentidão do acesso de commit-slab, e faremos o acompanhamento em uma série posterior.
--is-ancestor
solução.Respostas:
Se você deseja verificar isso programaticamente (por exemplo, no script), pode verificar se
git merge-base A B
é igual agit rev-parse --verify A
(então A é acessível a partir de B), ou se égit rev-parse --verify B
(então B é acessível a partir de A).git rev-parse
aqui é necessário para converter do nome de confirmação para confirmar o ID SHA-1 / commit.Usar
git rev-list
como na resposta do VonC também é possível.Edit: no Git moderno, há suporte explícito para esta consulta na forma de
git merge-base --is-ancestor
.Se um dos commits que você está perguntando for uma dica de ramificação , então
git branch --contains <commit>
ougit branch --merged <commit>
pode ser uma solução não programática melhor.fonte
git checkout -b quickcheck <more-recent-commit-ID>
e depoisgit branch --contains <older-commit-ID>
(egit branch -D quickcheck
para se livrar do ramo temporário).git merge-base --is-ancestor
por 2 anos.git branch --contains <commit>
egit merge-base --is-ancestor ...
: 3m40s vs 0.14sNo Git 1.8.0, isso é suportado como uma opção para
merge-base
:Na página do manual:
Por exemplo:
fonte
git merge-base THING --is-ancestor OF_THING && echo yes || echo no
por exemplo:git merge-base my-feature-branch --is-ancestor master && echo yes || echo no
git merge-base --is-ancestor -- commit commit
trabalha com hashes ao meu lado comgit
2.1.4 (Debian / Devuan 7.10 jessie) e 1.9.1 (Ubuntu 14.04 confiável), que são bastante antigos agora. Funciona mesmo para o Debian wheezy, se você o fizersudo apt-get install git/wheezy-backports
.Esse tipo de operação baseia-se na noção de intervalo de revisões detalhadas na pergunta SO: " Diferença em 'origem do git log / mestre' vs 'origem do git log / mestre ..' ".
git rev-list
deve poder voltar de um commit, até outro, se possível.Então, eu tentaria:
(Confirmações de limite são prefixadas
-
)Se o último commit exibido for o mesmo que o primeiro commit no
git rev-list
comando, será um commit acessível a partir do segundo commit.Se o primeiro commit não estiver acessível a partir do segundo,
git rev-list
nada retornará.terminaria por
A
, seA
estiver acessível a partir deB
.É o mesmo que:
, com
B
uma referência positiva eA
uma referência negativa .Ele inicia
B
e volta ao gráfico até encontrar uma revisão acessível a partir deleA
.Eu diria que, se
A
for diretamente acessívelB
, ele encontrará (e será exibido, devido à--boundary
opção) emA
si.fonte
-85e54e2...
o snippet tem um sinal de menos? também um possível erro de digitação: "... é o mesmo que o primeiro cometer ..."-
significa que é um commit de limite. Editei a resposta para torná-la mais clara, além de atualizar os links dos documentos e corrigir o erro de digitação desta resposta de 5 anos.Outra maneira seria usar
git log
egrep
.Isso produzirá uma linha de saída se a confirmação def456 for um ancestral da confirmação abc123, ou nenhuma saída de outra forma.
Geralmente, você pode omitir o
--pretty
argumento, mas é necessário se você quiser ter certeza de que apenas pesquisa através de hashes de confirmação reais e não através de comentários de log e assim por diante.fonte
--pretty
usar --oneline:git log --oneline ce2ee3d | grep ec219cc
works greathttps://stackoverflow.com/a/13526591/895245 menciona, agora para torná-lo mais amigável ao ser humano:
fonte
git show-branch branch-sha1 commit-sha1
Onde:
fonte
Se você estiver usando
git merge-base --is-ancestor
, certifique-se de usar o Git 2.28 (terceiro trimestre de 2020)Com o Git 2.28 (terceiro trimestre de 2020), alguns campos "
struct commit
" que nem sempre precisam estar presentes foram movidos para confirmar lajes.Consulte commit c752ad0 , commit c49c82a , commit 4844812 , commit 6da43d9 (17 de junho de 2020) por Abhishek Kumar (
abhishekkumar2718
) .(Incorporado por Junio C Hamano -
gitster
- in commit d80bea4 , 06 de julho de 2020)fonte
Desenvolvendo a resposta do itub, caso você precise fazer isso para todas as tags no repositório:
fonte