git список всех дочерних веток
Мне нужно пройтись по всем веткам ответвлённых от ветки X и смёрджить в каждую из них мастер ветку
В поисках информации нашёл ответ на ровно противположный вопрос. Там была идея с тем чтобы по команде git branch -v вывести все ветки и смотреть у кого совпадает хэш. Но дело в том что проект ну очень большой и веток 100500 глазами по всем пройтись - не вариант.
Дополнительно могу сказать, что работаю на Fedora Linux 35 так что bash командам так же буду рад, если они тут применимы. Очень желательно обойтись без UI т.е. нужно решение чисто консольными командами, конечно, это правило можно игнорировать если по другому никак))
Ответы (1 шт):
Я вижу решение задачи примерно так.
- Найти первый коммит из ветки X, который не содержится в master. Все ветки, содержащие этот коммит будем считать ответвлёнными от X. Командой
git log --oneline master..Xнаходим все коммиты из X. В выдаче нужно найти самый нижний, например, при помощи tail:git log --oneline master..X|tail -1 - Найти все ветки, содержащие этот коммит, но не содержащие последний коммит из master:
git branch --no-contains master --contains …, сюда подставить коммит, найденный на шаге 1.
UPDATE
Вам в комментарих задали очень важный для понимания вопрос: что вы имеете ввиду, когда говорите "ветка ответвленная от ветки Х"?
Технически в git ветка — это указатель на один коммит.
Логически — все коммиты, являющиеся напрямую или опосредованно предками коммита, на который указывает ветка.
Но чаще всего программисты под веткой подразумевают список коммитов, которые есть в указанной ветке, но которых нет в основной (например, в master).
Именно последнее множество коммитов будет обработано при выполнении merge или rebase. И именно это множество будет выведено командой git log master..X (основная ветка, две точки, обрабатываемая ветка).
Соответственно веткой, ответвленной от X я считаю любую ветку, ответвленную от любого коммита в ветке X.
Если коммит a является предком коммита b, то любая ветка содержащая b логически содержит и коммит a. Учитывая это, любая ветка, ответвленная от любого коммита ветки X содержит первый коммит ветки X. Именно этот коммит мы нашли на шаге 1. Далее по текста коммит1.
Соответственно все ветки, ответвленные от X мы находим командой git branch --contains коммит1
Учитывая сказанное вам о том, что, во-первых, веток много, во-вторых, вам в них все нужно вмёржить master, я предположил, что работа может занять больше одного дня. Соответственно утром второго дня вы можете захотеть получить уже не весь список, а только список тех веток, которые еще не обработали.
Если в ветку еще не вмёржили master, то ветка будет содержать предком коммит1, но не будет содержать коммит master. Если же в ветку вмёржен master, то она будет содержать и коммит1 и master.
Нам нужно отфильтровать последние, поэтому указываем дополнительный фильтр --no-contains master
Важно! Ветка, вмёрженная в master и ветка в которую вмёржен master - это не одон и то же!
UPDATE 2
Такая потребность обычно возникает, если в master'е был сделан какой-то важный коммит, например, багфикс. Так как при многодневной работе master может убежать дальше, то сама ветка master (её новое состояние) опять окажется не вмёрженной. Чтобы этого избежать, во всех описанных командах можно заменить master на хэш того важного коммита.