Если вы хотите проверить это программно (например. в скрипте), вы можете проверить, равно ли git merge-base A B
git rev-parse --verify A
(тогда A достижимо из B), или если это git rev-parse --verify B
(тогда B достижимо из A). git rev-parse
здесь необходим для преобразования имени коммита в SHA-1 / идентификатор коммита.
Использование git rev-list
, как в ответе VonC, также возможно.
Edit: в современном Git'е есть явная поддержка этого запроса в виде git merge-base --is-ancestor
.
Если один из коммитов, о которых вы спрашиваете, является ответвлением, то git branch --contains
или git branch --merged
могут быть лучшим непрограммным решением.
Этот вид операций опирается на понятие диапазона ревизий, подробно описанное в вопросе SO: "Разница в 'git log origin/master' vs 'git log origin/master...'".
git rev-list
должен иметь возможность возвращаться назад от коммита, вплоть до другого, если он доступен.
Поэтому я бы попробовал:
git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20
(Граничные коммиты имеют префиксы -
)
Если последний отображаемый коммит совпадает с первым коммитом в команде git rev-list
, то это коммит, достижимый от второго коммита.
Если первый коммит не достижим из второго, git rev-list
не должен возвращать ничего.
git rev-list --boundary A..B
завершится на A
, если A
достижим из B
.
Это то же самое, что:
git rev-list --boundary B --not A
, причем B
является положительной ссылкой, а A
- отрицательной ссылкой.
Он начнет с B
и будет идти назад по графу, пока не встретит ревизию, достижимую из A
.
Я бы утверждал, что если A
напрямую достижима из B
, то она встретит (и отобразит, из-за опции --boundary
) саму A
.