Как я могу определить, является ли один коммит потомком другого?

126
задан Joachim Sauer 23 November 2012 в 09:57
поделиться

2 ответа

Если вы хотите проверить это программно (например. в скрипте), вы можете проверить, равно ли 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 могут быть лучшим непрограммным решением.

47
ответ дан 24 November 2019 в 00:43
поделиться

Этот вид операций опирается на понятие диапазона ревизий, подробно описанное в вопросе 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.

15
ответ дан 24 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: