Хотя Дэв прав, что информация не не хранятся напрямую, это не значит, что вы никогда не сможете узнать. Вот несколько вещей, которые вы можете сделать.
git branch --contains <commit>
Это сообщит вам все ветки, в истории которых есть данная фиксация. Очевидно, это менее полезно, если фиксация уже была объединена.
Если вы работаете в репозитории, в котором была сделана фиксация, вы можете искать в журналах рефлогов строку для этого коммита. Рефлоги старше 90 дней удаляются с помощью git-gc, поэтому, если фиксация слишком старая, вы ее не найдете. Тем не менее, вы можете сделать это:
git reflog show --all | grep a871742
, чтобы найти фиксацию a871742. Результат должен быть примерно таким:
a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
, указывающий, что фиксация была сделана на ветке «завершение». Выходные данные по умолчанию показывают сокращенные хэши фиксации, поэтому не ищите полный хеш, иначе вы ничего не найдете.
git reflog show
на самом деле просто псевдоним для git log -g --abbrev-commit --pretty = oneline
, поэтому, если вы хотите поиграть с форматом вывода, чтобы сделать разные вещи доступен для grep, это ваша отправная точка!
Если вы не работаете в репозитории, в котором была сделана фиксация, лучшее, что вы можете сделать в этом случае, - это изучить журналы рефлогов и определить, когда фиксация была впервые внесена в ваше репо; если повезет, вы получили ветку, к которой он был привязан. Это немного сложнее, потому что вы не можете одновременно проходить дерево фиксации и рефлоги. Вам нужно проанализировать вывод reflog, исследуя каждый хэш, чтобы увидеть, содержит ли он желаемую фиксацию или нет.
Это зависит от рабочего процесса, но при хороших рабочих процессах коммиты выполняются в ветвях разработки, которые затем объединяются. Вы можете сделать это:
git log --merges <commit>..
, чтобы увидеть коммиты слияния с заданными совершить как предок. (Если фиксация была слита только один раз, первой должна быть слияние, которое вам нужно; в противном случае, я полагаю, вам придется изучить несколько.) Сообщение о фиксации слияния должно содержать имя ветки, которая была слита.
Если вы хотите рассчитывать на это, вы можете использовать параметр - no-ff
для git merge
, чтобы принудительно создать коммит слияния даже в случай перемотки вперед. (Однако не стоит слишком торопиться, это может стать запутанным при чрезмерном использовании.) Ответ VonC на связанный вопрос помогает развить эту тему.
Я думаю, что кто-то должен столкнуться с той же проблемой, которая не может узнать ответвление, хотя это на самом деле существует в одном ответвлении.
необходимо вытянуть все сначала:
git pull --all
Затем делают поиск ответвления:
git name-rev <SHA>
или:
git branch --contains <SHA>
@khichar.anil покрыл большую часть из этого в его ответе.
Просто добавление флага для удаления тегов дает нам:
git name-rev --name-only --exclude=tags/* $SHA
Помимо поиска по всему дереву до тех пор, пока вы не найдете подходящий хэш, нет.