Имя ветви Git, в некотором смысле, - это последний хэш-идентификатор. То есть, если git log branchX
показывает, что вы сначала зафиксировали b8eead8ba4ff375911af6
, тогда branchX
- это имя, представляющее b8eead8ba4ff375911af6
, и:
git show branchX
покажет такой же коммит, как:
git show b8eead8ba4ff375911af6
Если вам по какой-то причине нужен хеш-идентификатор - например, потому что вы собираетесь изменить хеш-идентификатор, на который указывает имя ветви, добавив новые коммиты, - самая простая команда для его получения: git rev-parse
hash=$(git rev-parse refs/heads/$branch)
В остальном см. ответ alfunx . Обратите внимание, что если коммиты образуют ромбовидный граф, например ::1010*
I--J
/ \
...--G--H M--N <-- branchX
\ /
K--L
тогда есть два коммита, которые следуют сразу за H
, но либо I
, либо K
не являются предками друг друга, они связаны только тем, что оба являются потомками H
и предки (в данном случае дедушки и бабушки) слияния совершают M
. Используя git rev-list --ancestry-path ^<anything-identifying-H> <anything-identifying-branchX>
, вы получите список коммитов I
, J
, K
, L
, M
и N
. Листинг начнется с N
и вернется к M
в качестве его второй записи, но в этот момент Git теперь имеет выбор: перечислять J
или L
. Именно здесь вступают в силу выбранные вами варианты сортировки. Сортировка по умолчанию - хронологическая по дате и времени коммиттера.
Перечислив либо J
, либо L
, Git теперь может перечислить родителя того, какой коммит он перечислил, или оставшегося коммита на другом форке истории. Git перечислит один из них. Если он решил сначала перечислить J
, затем I
, теперь он должен перечислить L
, а затем K
в этом порядке; если он сначала выбрал список L
, затем K
, теперь он должен отображать I
, а затем J
в этом порядке. Но он может также перечислить их в порядке J
, L
, K
, I
, например; или J
, L
, I
, K
. Добавление --topo-order
ограничивает git rev-list
, чтобы избежать чередования коммитов с двух сторон.
Порядок линеаризации в сложных графах обычно проблематичен: не существует единого решения, которое бы обрабатывало все случаи. Вот почему git rev-list
предлагает несколько вариантов сортировки.