20 полезных, но малоиспользуемых команд Git

0
455
views

Если вы когда-нибудь просматривали руководство по git (или запускали man git), то вы наверняка заметили, что там есть куда больше команд, чем большинство из нас использует ежедневно. Многие из этих команд невероятно мощные и могут значительно облегчить вам жизнь (другие немного нишевые, но все равно их полезно знать).

В этой статье описаны 20 моих любимых малоиспользуемых функций git, с помощью которых вы сможете улучшить свой процесс разработки, произвести впечатление на коллег и ответить на вопросы собеседования по git!

Содержание (и TL;DR):

  • Git Web — открыть встроенный графический интерфейс
  • Git Notes — прикрепить дополнительную информацию к коммитам
  • Git Bisect — дебажить как профессионал
  • Git Grep — найти что угодно
  • Git Archive — сжать проект для шеринга
  • Git Submodules — импортировать другие репозитории в ваш
  • Git Bugreport — скомпилировать баг-репорт с информацией о системе
  • Git Fsck — проверить и восстановить недоступные объекты
  • Git Stripspace — удалить пробелы в конце текста
  • Git Diff — сравнить изменения между двумя файлами
  • Git Hooks — выполнить скрипт при запуске команды git
  • Git Blame — показать, кто написал данную строку
  • Git Large File Storage — сохранить большие файлы в git
  • Git Garbage Collection — оптимизировать git-репо
  • Git Show — легко просмотреть любой объект git
  • Git Describe — дать читаемое имя на основе последнего тега
  • Git Tag — создать метки версий в определенных точках
  • Git Reflog — список всех действий, выполненных над репозиторием
  • Git Log — просмотреть журнал коммитов и диаграммы ветвей
  • Git Cherry Pick — вытащить фичу в вашу ветку
  • Git Switch — быстро переключиться между ветками
  • Бонус — расширение git за счет дополнительных команд!

Git Web

Запустите git instaweb для мгновенного просмотра рабочего репозитория в gitweb.

Git имеет встроенный веб-визуализатор для просмотра локальных репозиториев. Он позволяет управлять репозиторием через графический интерфейс в браузере. Этот визуализатор имеет множество полезных функций, включая:

  • просмотр и перемещение по версиям, проверку diff-ов, содержимого файлов и метаданных
  • просмотр журналов коммитов, ветвей, каталогов, истории файлов и прикрепленных данных
  • генерирование RSS- или Atom-лент коммитов и журналов активности репозитория
  • поиск по коммитам, файлам, изменениям и diff-ам.

Чтобы открыть визуализатор, просто запустите git instaweb из вашего репозитория. Ваш браузер откроется и загрузит http://localhost:1234. Если у вас не установлен Lighttpd, вы можете указать альтернативный веб-сервер с помощью флага -d. Другие опции можно указать либо с помощью флагов (например, -p для порта, -b для открытия браузера и т.д.), либо в блоке [instaweb] в вашем git config.

Есть также команда git gui, которая открывает git-приложение с графическим интерфейсом.

Git Notes

Используйте git notes для добавления дополнительной информации к коммитам.

Иногда нужно прикрепить к коммиту дополнительные данные (помимо изменений, сообщения, даты и времени и информации об авторе).

Заметки хранятся в .git/refs/notes. Поскольку они отделены от данных объекта коммита, вы можете в любое время изменить заметки, связанные с коммитом, без изменения хэша SHA-1.

Просматривать заметки можно с помощью git log, большинства git-приложений с GUI или с помощью команды git notes show. Некоторые git-хосты также показывают заметки в представлении коммита (хотя GitHub больше не показывает заметки).

Git Bisect

С помощью git bisect можно найти коммит, в котором появилась ошибка, используя бинарный поиск.

Примечание редакции Techrocks: о том, как работает git bisect, можно почитать в статье «Дебаггинг с использованием git bisect».

Это одна из самых мощных и в то же время простых в использовании команд git. А в том, что касается отладки, это просто спасательный круг. После запуска bisect проверяет коммиты, а вы указываете, какой коммит является хорошим (без бага) или плохим (с багом). В результате вы сможете найти самый ранний коммит, в котором появился баг.

Чтобы начать работу, запустите git bisect start и передайте ему точно «хороший» коммит с помощью git bisect good <commit-hash> и точно «плохой» (по умолчанию текущий) с помощью git bisect bad <optional-hash>.

После этого bisect проверит коммит, находящийся посередине между хорошим и плохим, а вы укажете, есть ли в этом коммите баг (с помощью git bisect good или git bisect bad).

Затем процесс будет повторяться. Bisect будет проверять коммит, стоящий посередине между плохим и хорошим, и так до тех пор, пока вы не найдете именно тот коммит, в котором появился баг. Проверку можно в любой момент отменить с помощью git bisect reset.

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

Git Grep

Используйте git grep для поиска кода, файлов, коммитов или чего-либо еще в вашем репозитории.

Вы когда-нибудь сталкивались с необходимостью поиска строки по всему git-проекту? С помощью git grep вы можете легко отыскать любую строку или RegEx в проекте, а также искать по веткам. Это как более мощный Ctrl + F!

git grep <regexp> <ref>

git grep имеет множество опций, позволяющих сузить поиск или задать формат результатов. Например, используйте -l для возврата только имен файлов, -c для указания количества совпадений в каждом файле, -e для исключения результатов, соответствующих условию, --and для указания нескольких условий, -n для поиска по номеру строки.

Поскольку git grep совместим с regex, вы можете гораздо более детально проработать строку поиска.

Также можно указать расширения файлов, среди которых нужно искать. Например, git grep 'console.log' *.js выведет все console.log в файлах JavaScript.

Второй параметр команды — ref — может быть именем ветки, коммита, диапазоном коммитов или чем-либо еще. Например, git grep "foo" HEAD~1 будет искать предыдущий коммит.

Git Archive

Используйте git archive для объединения всего репозитория в один файл.

При шеринге или резервном копировании репозитория часто предпочтительнее сохранить его в виде одного файла. Использование git archive включает всю историю репозитория, поэтому его можно легко извлечь обратно в исходную форму.

Команда также имеет множество дополнительных опций, так что вы можете указать, какие именно файлы будут включены в архив, а какие нет.

git archive --format=tar --output=./my-archive HEAD

Git Submodules

Используйте git submodule, чтобы вытащить в свой репозиторий любой другой.

Подмодули (англ. submodules) позволяют подключать одно хранилище к другому. Обычно они используются для определения зависимостей ядра или разделения компонентов на отдельные хранилища. Более подробную информацию можно найти в этой статье.

Выполнение следующей команды вытащит модуль в указанное место, а также создаст файл .gitmodules, чтобы он всегда загружался при клонировании репозитория. Используйте флаг --recursive для включения подмодулей при клонировании репозитория.

git submodule add https://github.com/<user>/<repo> <path/to/save/at>

Существует также команда git subtree, которая делает похожие вещи, но без необходимости в файлах метаданных.

Git Bug Report

Используйте git bugreport для составления баг-репорта, включающего информацию о git и системе.

Эта команда соберет системную информацию, а затем откроет стандартный шаблон баг-репорта (шаги для воспроизведения, фактический и ожидаемый результат и т.д.). Заполненный файл должен представлять собой полный баг-репорт со всей необходимой информацией.

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

А если вы собираетесь отправить баг-репорт в основную систему git, вы также можете выполнить команду git diagnose, а затем создать issue здесь.

Git Fsck

Используйте git fsck для проверки всех объектов или восстановления недоступных.

Хотя необходимость в этом возникает нечасто, иногда может потребоваться проверить объекты, хранящиеся в git. Здесь на помощь приходит команда fsck (от File System ChecK), которая проверяет базу данных объектов и верифицирует SHA-1 ID всех объектов и соединений, которые они создают.

Она также может использоваться вместе с флагом --unreachable для поиска объектов, которые больше недоступны по любой именованной ссылке (поскольку, в отличие от других команд, fsck включает все объекты в .git/objects).

Git Stripspace

Используйте git stripspace для форматирования пробельных символов в заданном файле.

Избегать пробелов в конце строк, нескольких последовательных пустых строк, пустых строк в начале и в конце ввода и заканчивать каждый файл новой строкой — это best practices кодинга. Существует множество инструментов для разных языков, которые делают это автоматически (например, prettier), но в Git есть и аналогичный встроенный функционал.

Эта функция предназначена для метаданных (сообщения коммитов, теги, описания ветвей и т.д.), но также работает, если вы передадите ей файл, а ответ перенаправите тоже в файл. Например, cat ./path-to-file.txt | git stripspace или git stripspace < dirty-file.txt > clean-file.txt.

Вы также можете использовать эту команду для удаления комментариев (с помощью --strip-comments) или даже для комментирования строк (с помощью --comment-lines).

Git Diff

С помощью git diff можно сравнить два варианта кода.

Вы наверняка знаете, что, запустив git diff, можно вывести все изменения с момента последнего коммита. Также при помощи git diff <commit-sha> можно сравнить 2 коммита или 1 коммит с HEAD. Но команда diff способна на большее.

С помощью diff можно сравнивать любые произвольные файлы: diff file-1.txt file-2.txt (больше не нужно посещать diffchecker.com!).

Или сравнивать две ветки или ссылки друг с другом: git diff branch1..branch2.

Обратите внимание, что двойная точка (..) — это то же самое, что и пробел, и указывает на то, что инпут diff должен быть вершиной ветвей. Но вы также можете использовать троеточие (...), чтобы преобразовать первый параметр в ссылку на общий коммит-предок двух инпутов diff — это очень полезно! Если вы хотите сравнить только один файл в разных ветках, просто передайте имя файла в качестве третьего аргумента.

Вы можете захотеть просмотреть все изменения, сделанные в заданном диапазоне дат, скажем, за последнюю неделю. Для этого используйте git diff HEAD@{7.day.ago} HEAD@{0}. Опять же, это может быть сопряжено с указанием имени файла, ветвей, конкретных коммитов.

Есть также команда git range-diff, которая предоставляет простой интерфейс для сравнения диапазонов коммитов.

Существует множество других возможностей применения инструмента git diff, поэтому я рекомендую ознакомиться с документацией.

Git Hooks

Используйте hooks для выполнения команд или скриптов при определенном действии в git.

Хуки позволяют автоматизировать практически все. Например:

  • обеспечение соответствия стандартам (сообщение коммита, имя ветки, размер патча),
  • улучшение качества кода (тесты, lint),
  • добавление дополнительной информации к коммиту (пользователь, устройство, ID тикета),
  • вызов webhook для записи события или запуска конвейера и т.д.

Для большинства событий git, таких как commit, rebase, merge, push, update, applypatch и т.д., доступны предварительные и последующие хуки.

Хуки хранятся в .git/hooks (если вы не настроили их в другом месте с помощью git config core.hooksPath). Просмотреть их можно с помощью команды git hook. Поскольку это просто shell-файлы, их можно использовать для запуска любой команды.

Хуки не размещаются в удаленном репозитории, поэтому для обмена и управления ими в команде вам потребуется менеджер хуков, например lefthook или husky. Существует также несколько сторонних инструментов, которые упрощают управление хуками, я рекомендую overcommit.

Помните, что хуки всегда можно обойти (с флагом --no-verify), поэтому никогда не полагайтесь только на них, особенно в вопросах безопасности.

Git Blame

Используйте git blame, чтобы показать информацию об авторе определенной ревизии или строки.

Это классический способ быстро узнать, кто написал определенную строку кода («А кто это сделал?!»). Но также полезно определить, в какой момент времени что-то изменилось, и просмотреть этот коммит и связанные с ним метаданные.

Например, чтобы вывести имя автора коммита и информацию о коммите для строк с 400 по 420 файла index.rs, можно запустить команду git blame -L 400,420 index.rs.

Git LFS

Сохраняйте большие файлы с помощью git lfs, чтобы не перегружать репозиторий.

Часто ваш проект содержит большие файлы (такие как базы данных, бинарные активы, архивы или медиафайлы), которые замедляют рабочий процесс git и превышают лимиты использования. Вот тут-то и приходит на помощь Large File Storage — он позволяет хранить эти большие ресурсы в другом месте, сохраняя их отслеживаемыми в git и поддерживая те же элементы управления доступом. LFS работает путем замены этих больших файлов текстовыми указателями, которые отслеживаются в git.

Чтобы воспользоваться LFS, просто запустите git lfs track <file glob>, что приведет к обновлению вашего файла .gitattributes. Вы можете указать файлы по их расширению (например, *.psd), директории или по отдельности.

Для просмотра списка отслеживаемых файлов LFS запустите git lfs ls-files.

Git GC

Используйте git gc для оптимизации вашего репозитория.

Со временем в git-репозиториях накапливается различный мусор, который занимает место на диске и замедляет работу. Именно здесь на помощь приходит встроенный сборщик мусора. Запуск git gc удалит осиротевшие и недоступные коммиты (с помощью git prune), сожмет ревизии файлов и сохраненные git-объекты, а также выполнит некоторые другие общие задачи, такие как упаковка ссылок, обрезка reflog и обновление индексов.

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

Git Show

Используйте git show, чтобы легко просматривать любой объект git.

Эта команда выдает объекты (блобы, деревья, теги или коммиты) в легком для чтения виде. Чтобы ею воспользоваться, просто запустите git show <object>. Вероятно, вы также захотите добавить флаг --pretty для более чистого вывода, но есть и другие опции. В общем, это очень мощная команда, которая может вывести вам именно то, что нужно.

Особенно git show полезна для предпросмотра файла в другой ветке без переключения на нее. Для этого просто запустите git show branch:file.

Git Describe

Используйте git describe для поиска последнего тега, доступного из коммита, и наделения его человекочитаемым именем.

Запустите git descibe, и вы увидите строку в читаемом формате, созданную из комбинации имени последнего тега с текущим коммитом. Можно также передать конкретный тег.

Обратите внимание, что чтобы это работало, для начала нужно создать теги (если только вы не добавите флаг --all). Git describe по умолчанию будет использовать только аннотированные теги, поэтому, чтобы заставить его использовать и легковесные теги, нужно указать флаг --tags.

Git Tag

Помечайте определенные точки в истории вашего репозитория с помощью git tag.

Бывает полезно пометить конкретные важные моменты в истории репозитория. Чаще всего теги используются для обозначения версий релизов. Создать тег просто: git tag <tagname>. Также можно пометить исторический коммит с помощью git tag -a v4.2.0 <commit sha>. Как и в случае с коммитами, вы можете добавить сообщение, используя опцию -m.

Не забудьте запушить тег в удаленный репозиторий с помощью git push origin <tagname>.

Чтобы получить список всех тегов, просто запустите git tag и, по желанию, используйте -l для поиска с символами подстановки.

После этого вы сможете проверить конкретный тег, выполнив git checkout <tagname>.

Git Reflog

Выведите список всех обновлений, сделанных в вашем репозитории, с помощью git reflog.

Git отслеживает обновления ветвей с помощью механизма, называемого журналом ссылок, или «рефлогом». Отслеживаются различные события, включая clone, pull, push, commit, checkout и merge. Часто бывает нужно найти ссылку на событие, поскольку многие команды принимают такие ссылки в качестве параметров. Просто запустите git reflog, чтобы просмотреть последние события в HEAD.

Особенно reflog полезен для восстановления потерянных коммитов. Git никогда ничего не теряет, даже при переписывании истории (например, при ребейзинге или изменении коммита). Reflog позволяет вам вернуться к коммитам, даже если на них не ссылается ни одно ответвление или тег.

По умолчанию reflog использует HEAD (вашу текущую ветку), но вы можете запустить его на любой ветке (git reflog show <branch name>). Также его можно использовать для просмотра скрытых изменений с помощью git reflog stash. Или для вывода всех ссылок: git reflog show --all.

Примечание редакции Techrocks: о скрытии изменений при помощи stash можно почитать в статье «Stash: знакомимся со «скрытым» функционалом Git».

Git Log

Используйте git log для просмотра списка коммитов.

Скорее всего, вы уже знакомы с применением git log для просмотра списка последних коммитов в вашей текущей ветке. Но есть еще несколько вещей, которые вы можете сделать с помощью git log.

Например, git log --graph --decorate --oneline покажет красивую схему коммитов с указателями ссылок.

Также часто требуется фильтровать логи по различным параметрам, наиболее полезными из которых являются:

  • git log --search="<anything>" — поиск в логах конкретных изменений кода
  • git log --author="<pattern>" — показать лог только для определенного автора(ов)
  • git log --grep="<pattern>" — отфильтровать лог с использованием поискового запроса или regex
  • git log <since>..<until> — показать все коммиты между двумя ссылками
  • git log -- <file> — показать все коммиты, сделанные только в определенном файле.

Или можно просто запустить git shortlog для получения списка коммитов в укороченном формате.

Git Cherry Pick

Используйте git cherry-pick, чтобы выбрать указанные коммиты по ссылке и добавить их в рабочий HEAD.

Иногда бывает нужно вытащить определенный коммит из другого места в вашу текущую ветку. Это может быть очень полезно для быстрых правок, отмены изменений, восстановления потерянных коммитов и, в некоторых случаях, — для совместной работы в команде.

Обратите внимание, что зачастую лучше использовать традиционный merge, так как cherry picking коммитов может привести к появлению дубликатов коммитов в логе.

Использование команды очень простое. Достаточно выполнить git cherry-pick <commit-hash>, и указанный коммит будет перенесен в вашу текущую ветку.

Git Switch

Используйте git switch для перемещения между ветками.

Нам часто приходится перемещаться между ветками. Команда switch — это упрощенная версия git checkout. Она может использоваться для создания веток и переключения между ними, но в отличие от checkout не копирует измененные файлы при перемещении.

Если добавить к команде switch флаг -c, можно создать новую ветку и сразу перейти в нее, например: git switch -c <new branch>. Это напоминает применение checkout -b.

Выполнение git switch - отбросит все внесенные вами экспериментальные изменения и вернет вас к предыдущей ветке.

Git Standup

Используйте git standup, чтобы, основываясь на коммитах git, вспомнить, что вы делали в последний рабочий день.

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

Если ваш босс требует от вас ежедневного отчета о проделанной работе, но вы постоянно не можете вспомнить, что именно вы сделали — эта программа для вас! Она покажет красиво отформатированный список всего сделанного за определенный промежуток времени. Использование простое: запустите git standup, или используйте эти опции, чтобы указать, какие именно данные должны быть показаны (автор, временные рамки, ветви и т.д.).

Бонус

Git можно легко расширить с помощью дополнений, добавляя команды для полезных задач. Одно из самых полных расширений — git-extras от @tj. Оно дает больше 70 дополнительных команд для автоматизации обычных задач git.

Список других полезных надстроек git можно найти на stevemao/awesome-git-addons.

Если вы работаете с репозиториями GitHub, то GitHub CLI позволит вам выполнять общие задачи (управление PR, проблемами, обзорами кода и т.д.) из командной строки.

Перевод статьи «20 Git Commands you (probably) didn’t know about».

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here