Несмотря на то, что Дэв прав, информация не хранится напрямую, это не значит, что вы никогда не узнаете. Вот несколько вещей, которые вы можете сделать.
Поиск ветвей, на которых зафиксирован коммит
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, это ваша отправная точка!
Если вы не работаете в репозитории, в котором была сделана фиксация, лучшее, что вы можете сделать в этом случае, - это изучить reflogs и выяснить, когда коммит был впервые представлен в вашем репо; если повезет, вы взяли ветвь, которой он был посвящен. Это немного сложнее, потому что вы не можете одновременно обходить как дерево коммитов, так и флаги. Вы хотите проанализировать вывод reflog, изучив каждый хеш, чтобы увидеть, содержит ли он требуемый коммит или нет.
Найти последующий коммит слияния
Это зависит от рабочего процесса, но при хороших рабочих процессах коммиты производятся в ветвях разработки, которые затем объединяются. Вы можете сделать это:
git log --merges <commit>..
чтобы увидеть коммиты слияния, которые имеют данный коммит в качестве предка. (Если коммит был объединен только один раз, первым должно быть слияние, за которым вы следите; в противном случае, я полагаю, вам придется изучить несколько из них.) Сообщение коммита слияния должно содержать имя ветви, которая была слита. *
Если вы хотите рассчитывать на это, вы можете использовать опцию --no-ff
для git merge
, чтобы форсировать создание коммитов слияния даже в случае ускоренной перемотки вперед. (Однако не слишком рвитесь, это может стать запутанным, если его чрезмерно использовать.) Ответ VonC на связанный вопрос услужливо развивает эту тему.