Как получить родителей коммита слияния в git?

142

Некоторые команды git принимают родительский элемент как ревизию; другие (например, git revert) в качестве родительского числа. Как достать родителей для обоих случаев. Я не хочу использовать команду графического журнала, поскольку для этого часто требуется прокрутка длинного дерева вниз, чтобы найти второго родителя.

Casebash
источник

Ответы:

183

Простой git log <hash>вызов для фиксации слияния показывает сокращенные хэши своих родителей:

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

git выводит родителей в соответствии с их количеством: первый (крайний слева) хеш - для первого родителя и так далее.

Если вам нужны только хеши, есть два эквивалентных варианта:

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

git rev-list также может отображать хэши родителей, хотя сначала будет перечислен хеш для фиксации:

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

Если вы хотите исследовать родителей, вы можете обратиться к ним напрямую с каратами как <commit>^1и <commit>^2, например:

git show <commit>^1

Это обобщает; для слияния осьминога вы можете ссылаться на n- го родителя как <commit>^n. Вы можете обращаться ко всем родителям с помощью <commit>^@, хотя это не работает, когда требуется одна фиксация. Дополнительные суффиксы могут появляться после n- го родительского синтаксиса (например <commit>^2^, <commit>^2^@), тогда как они не могут появляться после ^@( <commit>^@^недопустимо). Подробнее об этом синтаксисе читайте на rev-parseстранице руководства .

Каскабель
источник
2
Отвечая на свой вопрос: результаты 'git rev-list --parents -n 1 <somehash>' следующие: <somehash> <parent1> <parent2>. Т.е. родители - один номер.
mikemaccana
Вы также можете использовать git- parent github.com/danielribeiro/dotfiles/blob/master/bin/git-parents . Просто поместите его в свой PATH и вызовите $ git parent <commit> (<commit> по умолчанию HEAD)
Даниэль Рибейро
@jefromi, я действительно хочу, чтобы часть «Также обратите внимание, что в нормальном выводе журнала действительно отображается ...» была в верхней части вашего ответа. :)
Адам Монсен
3
git logи git showвыводить очень разные вещи, когда есть только один родитель. Предпочитайте, git logесли вам нужна последовательность.
Ноэль Яп
Этот ответ не работает на моей машине Ubuntu с расширением git (v2.17.1). Я не вижу Mergeфайла на git log -1выходе.
mja
31

Ниже приведен самый простой способ просмотра родителей слияния.

git show --pretty=raw 3706454
user1483344
источник
15
git cat-file -p 3706454 такая же, но даже короче :)
sabgenton
1
Оба они очень полезны!
tecknut 07
Другой вариантgit log --pretty=raw -1 3706454
selalerer 06