Это правда, что git не хранит эту информацию постоянно, но в любом случае вы можете узнать это.Git имеет reflogs!
git reflog show <branch>
Если ветвь была создана за последние 90 дней (по умолчанию; используйте gc.reflogExpire
, чтобы изменить это), последней строкой в этом reflog будет создание ветки.
Здесь я предполагаю, что вы хотите знать, это коммит, в котором была создана ветвь, а не какая ветка с которой он разветвлен.Это было бы на лот сложнее выяснить - я бы предпочел, чтобы каждая ветка заняла свою позицию в момент создания целевой ветви и проверила, включает ли она начальную точку целевой ветви.
Мораль этой истории в том, что вы должны принять рабочий процесс, в котором вы знаете, из какой ветви вы разветвляли свою ветку.Новые функции и исправления предположительно начнутся в какой-то стабильной точке вашей основной ветви, а подтемы могут быть названы <topic>-<subtopic>
в качестве напоминания.
Редактировать:
Хорошо, так что давайте представим, что вы знаетефиксация и время (в этом случае фиксация и время создания ветки).Вы пытаетесь выяснить, на какой ветви был этот коммит в тот момент.
git for-each-ref --format='%(refname)' refs/heads/* | while read b; do
if [ "$(git rev-parse $b@{$date_time})" = "$target_commit" ]; then
echo "branch $b contained commit $target_commit at $date_time"
fi
done
Я думаю, это должно работать как скрипт bash / однострочный.Идея: для каждой ветви занять свою позицию в заданную дату и время и посмотреть, является ли это целевым коммитом.Если вы хотите быть еще более гибким, вы можете проверить, является ли $(git merge-base $(git-rev-parse $b@{$date_time}))
целевым коммитом;то есть, был ли целевой коммит предком данной ветви в то время.
И, конечно, в тех случаях, когда ваша история относительно чиста, вы всегда можете использовать gitk --branches
или git log --graph --branches [--oneline]
, чтобы просто увидеть красивую картинку.