Поиск ветки git commit

553
задан törzsmókus 11 November 2016 в 15:54
поделиться

4 ответа

Хотя Дэв прав, что информация не не хранятся напрямую, это не значит, что вы никогда не сможете узнать. Вот несколько вещей, которые вы можете сделать.

Найдите ветки, в которых находится фиксация

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 на связанный вопрос помогает развить эту тему.

815
ответ дан 22 November 2019 в 22:02
поделиться

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

необходимо вытянуть все сначала:

git pull --all

Затем делают поиск ответвления:

git name-rev <SHA>

или:

git branch --contains <SHA>
0
ответ дан 22 November 2019 в 22:02
поделиться

@khichar.anil покрыл большую часть из этого в его ответе.

Просто добавление флага для удаления тегов дает нам:

git name-rev --name-only --exclude=tags/* $SHA
1
ответ дан 22 November 2019 в 22:02
поделиться

Помимо поиска по всему дереву до тех пор, пока вы не найдете подходящий хэш, нет.

-4
ответ дан 22 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: