Como obter os pais de uma consolidação de mesclagem no git?

140

Alguns comandos git tomam o pai como uma revisão; outros (como git revert), como um número pai. Como obter os pais para os dois casos. Não quero usar o comando gráfico log, pois isso geralmente exige a rolagem de uma árvore longa para encontrar o segundo pai.

Casebash
fonte

Respostas:

179

Simple git log <hash>chamado para um commit de mesclagem mostra hashes abreviados de seus pais:

 $ git log -1 395f65d
 commit 395f65d438b13fb1fded88a330dc06c3b0951046
 Merge: 9901923 d28790d
 ...

git gera os pais de acordo com seu número: o primeiro hash (mais à esquerda) é para o primeiro pai e assim por diante.

Se tudo o que você deseja são apenas os hashes, as duas opções equivalentes são:

$ git log --pretty=%P -n 1 <commit>
$ git show -s --pretty=%P <commit>

git rev-list também pode mostrar os hashes dos pais, embora ele primeiro liste o hash de um commit:

$ git rev-list --parents -n 1 <commit>

Se você deseja examinar os pais, pode consultá-los diretamente com quilates como <commit>^1e <commit>^2, por exemplo:

git show <commit>^1

Isso generaliza; para uma mesclagem de polvo, você pode consultar o enésimo pai como <commit>^n. Você pode consultar todos os pais com <commit>^@, embora isso não funcione quando uma única confirmação é necessária. Sufixos adicionais podem aparecer após a nona sintaxe pai (por exemplo <commit>^2^, <commit>^2^@), enquanto que não podem depois ^@( <commit>^@^não é válido). Para mais informações sobre esta sintaxe, leia a rev-parsepágina de manual.

Cascabel
fonte
1
Respondendo à minha própria pergunta: os resultados de 'git rev-list --parents -n 1 <somehash>' são: <somehash> <parent1> <parent2>. Ou seja, os pais são um numerados.
Mikemaccana
Você também pode usar o git-parents github.com/danielribeiro/dotfiles/blob/master/bin/git-parents . Basta colocá-lo no seu PATH e chamar $ git parents <commit> (<commit> assume como padrão HEAD) #
Daniel Ribeiro
@ jefromi, eu realmente quero que a parte "Observe também que a saída normal do log mostra ..." esteja no topo da sua resposta. :)
Adam Monsen
3
git loge git showproduz coisas muito diferentes quando há apenas um pai. Prefira git logse você deseja consistência.
Noel Yap
Esta resposta não funciona na minha máquina Ubuntu com git (v2.17.1). Não vejo Mergearquivo na git log -1saída.
Md22
29

A seguir, é a maneira mais simples de encontrar os pais de uma mesclagem

git show --pretty=raw 3706454
user1483344
fonte
14
git cat-file -p 3706454 é o mesmo, mas ainda mais curto :)
sabgenton
1
Ambos são muito úteis!
Tecknut
Outra opçãogit log --pretty=raw -1 3706454
selalerer 6/06/18