Как вывести список всех веток git, созданных из любого коммита конкретной ветки - PullRequest
3 голосов
/ 17 октября 2019

Есть несколько вопросов, которые близки к тому, что я спрашиваю, но не совсем одинаковые.

Я хочу перечислить все ветви, созданные из ветки git в любой момент истории этой ветки .

Ответы на похожие вопросы включают использование git branch --contains [branch-name], но это не дает того, чего я добиваюсь.

Примите во внимание следующее (просто) пример и дерево:

$ git init
$ git checkout -b master
$ touch master.txt
$ git add .
$ git commit -m "Initial master commit"
$ git checkout -b develop
$ touch develop.txt
$ git add .
$ git commit -m "Initial develop commit"
$ git checkout -b feature/a
$ touch a.txt
$ git add .
$ git commit -m "feature/a commit"
$ git checkout develop
$ git checkout -b feature/b
$ touch b.txt
$ git add .
$ git commit -m "feature/b commit"

master
      \
       \         feature/a
        \       /
         develop
                \
                 feature/b

Если я хочу получить все ветви, содержащие ветку develop, я могу сделать git branch --contains develop и получу следующий результат:

$ git branch --contains develop

  develop
  feature/a
  feature/b

Круто. Но давайте использовать более реальный пример (- - это коммиты), где есть несколько ветвей объектов, которые объединяются в разное время:

$ git checkout develop
$ git merge feature/a
$ git branch -d feature/a

master
      \
       \         feature/a
        \       /         \
         develop           -
                \
                 feature/b

В этом случае feature/a было завершено, объединены в разработку, а затем удалены. И теперь последний коммит для develop опережает feature/b, над которым все еще ведется работа. Теперь, если я запускаю git branch --contains develop, я получаю следующее:

$ git branch --contains develop

  develop

Не круто. Я хотел бы видеть и develop, и feature/b, так как feature/b был разветвлен от более старого коммита develop.

У меня сложный проект с большим количеством функций, исправление ошибок, улучшения и т. д. ветви, которые были сделаны из различных точек в жизни develop, и не все из них были извлечены, и сейчас git branch --contains develop довольно бесполезно рассказывать мне, какие ветви выдающиеся.

1 Ответ

4 голосов
/ 17 октября 2019

Я понял, каков был ответ, когда я заканчивал писать вопрос (ага, чтобы записать мысли на «бумаге»).

Команда git branch --contains develop рассматривает толькопоследний коммит ветки develop, поэтому вам нужно получить SHA первого коммита ветки develop.

К сожалению, здесь все становится сложнее. Из Pro Git § 3.1 Ветвление Git - что такое ветвь :

Ветвь в Git - это просто легкий подвижный указатель на [a] commit.

Поскольку ветвь является просто легким указателем, git не имеет явного представления о своей истории или дате создания.

Я потратил слишком много времени на то, чтобы собрать оригинальный SHA для ветки, и, наконец, пришел к выводус одним, но есть некоторые предпосылки / ограничения.

  • Вам необходимо знать, для какой ветви вы хотите использовать исходный коммит SHA (в нашем случае, develop)
  • Вам нужнознать ветку, из которой она была разветвлена, и , которую ветка не может опередить (в нашем случае, master) - это определенно не идеально, но любой может дать лучший ответ :)
$ git branch --contains $(git rev-list master..develop | tail -1)

  develop
  feature/b

Если вам интересно, материал в $() - это то, как я получаю самый ранний коммит SHA из списка git rev (лучший подход, чем оригинал благодаря комментарию от @alfunx).

...