git branch --contains
должен обеспечить то, что вы хотите.
Опция --contains
показывает нам все ветви, которые содержат конкретный commit-ish. Конец, который мы хотим, является первым на A
после его разветвления от master
. Было бы проще получить merge-base
от A
и master
, но он также будет содержать master
и что-нибудь, что ветвится от master
после A
.
Мы можем найти первый совершить SHA на A
с:
git log --format=format:%h master..A | tail -1
%h
дает нам короткий совершить SHA, поэтому мы не должны нарезать выход по умолчанию после этого. tail
выбирает самую раннюю фиксацию на A
, или вы также можете передать log
опцию --reverse
и использовать head
. Если ваш филиал длится миллион, это позволит обрабатывать die sooner, но на тот момент у вас есть другие проблемы.
Затем мы используем A
«первый SHA в branch --contains
:
git branch --contains $(git log --format=format:%h master..A | tail -1) --no-merged A
Опция --no-merged A
игнорирует ветви A
сам, в котором четко содержит коммит мы выбрали.
Если вы в настоящее время проверили одну из ветвей, которые расходились от A
, мерзавец будет означать, что с *
как это происходит, когда вы просто запустите git branch
. Я не могу найти способ снять это в чистом Git, но вы можете использовать любое количество команд unix, чтобы удалить его из вывода.
Концепция ветви, которая расходится с другой веткой, немного нечеткая в git. Это связано с тем, что ветви просто указывают на одну фиксацию, и история репо не всегда является деревом. – GolfWolf
Например, посмотрите [этот график] (http://pastebin.com/qc4Umc2g) и скажите, какие ветви «расходятся» от A – GolfWolf
. Сказав это, вы можете попытаться найти ветви, чей [общий предок] (https : //www.kernel.org/pub/software/scm/git/docs/git-merge-base.html) с ветвью A впереди мастера. Однако, после того, как ветвь A и ее потомки объединены обратно в master, это больше не будет работать. – GolfWolf