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