Как я могу отслеживать, откуда взялись коммиты после их объединения?

Моя компания не поддерживает репозиторий git (мы эффективно используем CVS), но я сохраняю репо локально для своего собственного здравомыслия. Раньше я хотел воспитывать коммиты, связанные, скажем, bug-report-abcde. Я могу grep через сообщения фиксации найти bug-report-abcde и просмотреть их. Прямо сейчас у меня есть функция Emacs, подключенная для обеспечения текущего имени ветки как "заголовка" в commit:

Title

Summary summary summary

Branch: bug-report-abcde

Таким образом, мой вопрос: это лучший способ найти, какая ветвь была исходным источником коммита, после того, как коммит был объединен с другой ветвью? Или есть способ извлечь эту информацию из самого git?

Ответ 1

Git не отслеживает эту информацию по дизайну.

http://markmail.org/message/yfb5ihwddjmrstz6

So don't think of it as "git throws away branch identity" as much as
"git never cared about branch identity in the first place, and doesn't
think it relevant."

Название вашей ветки - это имя вашего ветки. Это может быть буквально все, что вы хотите. Или вы не можете использовать название ветки и находиться в состоянии отдельной головы. В долгосрочной перспективе сохраняется только фиксированная доступность.

Если у вас есть информация, которую вы хотите отслеживать (например, номер дефекта), вам необходимо включить ее в сообщение фиксации.

Если вы используете центральный сервер, вы можете настроить крюк приема, который каким-то образом регистрирует информацию о имени удаленного ветки (git notes). Моя компания использует это. Я нахожу это только квази-полезным (в основном, если вы хотите кричать на менеджера программы, а не на парня, который написал или нажал код).

Ответ 2

merges-introducing() {
    # merges-introducing $introducing [$descendant]
    local introducing;
    if introducing=`git rev-parse $1`; then 
        shift
        git rev-list --ancestry-path --parents --reverse ^$introducing ${@-HEAD} \
        | awk '{seen[$1]=1} NR>1 && !seen[$2] {print $1}' \
        | xargs -r git show --oneline --no-patch
     fi
}

Находит слияния, включающие фиксацию из объединенной истории.

git rev-list --ancestry-path перечисляет только фиксации на линии спуска из нижнего фиксации (^$introducing здесь) вверх (по умолчанию HEAD, текущая проверка), --parents дает родителям для каждого из них --reverse перечисляет коммиты с самого начала (сначала $introducing), а постобработка awk|xargs печатает только слияния, чей первый родитель не находится на этом пути предков.

Если кто-то не вошел и не отредактировал вручную сообщения о слиянии, строки темы для этих коммитов скажут название ветки и любой исходный url соответствующих (и не fastforward) слияний, самых старых в первую очередь.