Вы можете получить список ветвей, из которых доступен тег
git for-each-ref --contains my_tag refs/heads
(Вы можете использовать git branch
вместо git for-each-ref
, но for-each-ref
обычно лучше подходит для использования в скрипте. Возможно, вам придется добавить опцию --format
, чтобы вывод выглядел так, как вы хотите. )
Это может вернуть несколько ветвей, и вам придется решить, как это согласовать. Одной из стратегий было бы выяснить, достижима ли одна из ветвей от другой. Например, если у вас есть
x -- x -- A <-[my_tag]
\
... M -- x <--(b1)
\
... M <--(b2)
у нас есть b1
достижимый с b2
и помеченный коммит, достижимый обоими. Вы могли бы интуитивно предпочесть сказать, что A
был объединен с b1
, если «какая команда слияния, я думаю, была выполнена», является важной вещью. Или, если он работает лучше для фиксации рядом с новейшей разработкой, возможно, вы бы выбрали b2
в этом случае В любом случае, вы также можете столкнуться с таким случаем, как
x -- x -- A <-[my_tag]
\
\ x <--(b1)
\ /
... M -- x
\
x <--(b2)
, где совершенно произвольно говорить, что A
был объединен "в b1
" против "в b2
" (против "в какую-то другую ветку, которая больше не существует"). Так что на данный момент вам, возможно, придется просто выбрать один.
Таким образом, вообще говоря, вы не можете однозначно идентифицировать одну ветку, в которую был добавлен отмеченный коммит. Возможно, он был объединен с удаленной веткой или даже может быть объединен в отключенном состоянии HEAD.
Возможно, вам удастся исключить некоторые из этих возможностей из-за вашего знания стратегии ветвления / слияния команды и других практик, но стоит отметить, что сам git не заботится о таких понятиях, как "ветка" в который был включен этот коммит "- он заботится только о таких вещах, как" ветви, которые в текущем состоянии могут достичь этого коммита "; поэтому вы должны навязывать предположения, чтобы быть более конкретными.