Поиск коммитов во всем git репо

Я хотел бы понять разницу между git log --all --grep=<> а также git log --grep=<>, Моя цель - пройти весь репо при поиске. Если я не добавлю --all, значит ли это, что я пропущу все сообщения коммитов в ветках? Похоже, неинтуитивный по умолчанию для меня.

2 ответа

Решение

Вы правы, что вам нужно --all здесь (или, возможно, вы захотите --branches вместо).

"Интуитивно" в Git немного сложнее, и поведение git log для меня интуитивно понятен, но только потому, что я изучил git и его специфические представления о том, как работать с графами коммитов.

log Команда не сильно отличается от всех других команд commit-graph-traversing. Все они работают, как на самом деле, многие из них просто запускаются или запускаются, а затем используют вывод: git rev-list, Вы даете ему некоторые идентификаторы фиксации начальной точки, или некоторые имена, или любой синтаксис, описанный в gitrevisions и находит идентификаторы SHA-1 для каждого коммита, доступного по этим идентификаторам.

Каждый коммит внутри репо - в том числе коммиты, которые были "заброшены" (но по-прежнему доступны для поиска с помощью reflogs) из-за операции перебазирования, коммиты, находящиеся в стеке stash, и даже git notes совершает - работает таким образом, так что это было бы плохо для git log найти все коммиты. Даже --all Флаг на самом деле не находит все коммиты.

Если вы просматриваете git rev-list документация, вы увидите, что --all означает "каждая ссылка в refs/ namespace" (следовательно, все ветви, все теги и заметки, но не специальные ссылки, такие как ORIG_HEAD оставленный после перебазирования, ни каких-либо записей журнала, например). Та же самая формулировка появляется в git log документация, но я люблю отсылать людей к git rev-list так как я думаю, что это в конечном итоге более показательным.

git log это инструмент для обхода графика коммитов и распечатки информации коммитов. --grep фильтр на этом ходу.


git log начинается с вашего текущего коммита (т.е. HEAD) и работает оттуда через историю.

git log --all посещает все коммиты. Это довольно редко, иногда требуется интегратору.

--grep это фильтр. Фильтрует поток коммитов, которые посетили git log, Фильтры только удаляют записи, но никогда не добавляют. За каждый коммит git log посещения --grep решает, должно ли это быть включено. Это может иметь больше смысла, если вы думаете об этом как о нормальном канале Unix.

git log | grep foo

Значения по умолчанию должны работать лучше всего с наиболее распространенным случаем. Команды как diff а также log наиболее используются в разработке. Интеграция происходит гораздо реже. Таким образом, настройки по умолчанию предназначены для разработчиков.

Общее использование git log для разработчиков ищет изменения, которые способствовали этой фиксации. Они ищут ответы на вопрос "почему это написано так?" или "откуда взялась эта ошибка?" Вот почему по умолчанию идет график с вашего текущего коммита. Редко, когда вы хотите искать коммиты, которые не были объединены в вашем коде, это больше задача менеджера по интеграции.

--grep не меняет то, что совершает git log посещения. Если это подразумевает --allЭто было бы удивительно и негибко. Удивительно, потому что это запутало бы значение "фильтра", и довольно редко вы хотите искать несвязанные ветви. Негибкий, потому что как вы ищете только определенные коммиты? Я полагаю, вы могли бы потребовать --no-all чтобы отключить его, а затем, возможно, больше переключателей, возможно, --branches, чтобы получить то, что вы имеете в виду.

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

Другие вопросы по тегам