Cегодня Git является стандартным инструментом для хранения кодовых баз ПО. Практически любая команда разработчиков использует инструменты и сервисы удаленного хостинга Git, поддерживающие разные способы работы с кодовыми базами. Одни программисты довольствуются лишь официальным интерфейсом Git CLI (Command-Line Interface). Другие дополнительно используют инструменты визуализации, такие как Gitk. Между тем есть разработчики, которые редко работают с CLI, но часто используют GUI, даже для staging и committing.
Git CLI предлагает комплексное решение для управления репозиториями Git через терминальные интерфейсы. Кроме того, множество сокращенных параметров командной строки позволяют максимизировать производительность.
Всем известны повседневно используемые команды Git для подготовки файлов (staging), фиксации состояния репозитария (committing), ветвления и слияния файлов, управления удаленными репозиториями. Несмотря на то, что интерфейс командной строки Git предоставляет множество опций и субкоманд, мы обычно пользуемся привычным набором. А ведь в Git есть еще и другие полезные скрытые возможности. Рассмотрим несколько таких команд и приемов.
1. Поиск лучших разработчиков
Команда обычно состоит из нескольких программистов. Бесплатный проект с открытым исходным кодом получает значительную помощь от участников сообщества. Из этого следует, что репозитории Git содержат коммиты от множества авторов. А как получить по этим коммитам перечень лучших участников (contributors)? Проще всего проверить на GitHub (или аналогичном Git-хостинге) вкладку contributor, как показано ниже:
Можно локально ранжировать всех участников проекта по количеству коммитов с помощью встроенной команды Git:
git shortlog -sn
Объединив приведенную выше команду Git с командой head
на Unix можно получить n
ведущих участников:
git shortlog -sn | head -3 # Перечислит 3 ведущих участников
Указав флаг --email
можно даже получить адрес электронной почты каждого автора. Кроме того, если соблюдать определенное соглашение по описаниям к коммиту, с помощью следующей команды можно узнать, кто исправил большую часть ошибок:
git shortlog -sn --grep="^fix" --no-merges | head -1
Здесь мы пропускаем подсчет коммитов слияния с флагом --no-merges
.
2. Получение текущего хэша коммита для сценариев DevOps
Разработчики часто включают в сборку программы текущий хэш коммита Git, чтобы связать снапшот кода с опубликованной версией ПО. Если, используя Flutter, запросить через интерфейс командной строки сведения о версии, вы получите несколько сокращенных хэшей коммитов, как показано ниже:
Эти хэши коммитов обычно включаются в двоичные файлы ПО с помощью сценариев DevOps. Например, если нужно добавить хэш коммита в скомпилированный бинарный файл GNU/Linux, можно получить текущий коммит и отправить его в GCC через определения макросов CLI:
gcc main.c -o main -DGIT_COMMIT_HASH="\"<commit-hash>\""
Получить текущий коммит можно с помощью команды:
git rev-parse HEAD
Вы можете использовать приведенную выше команду Git в сценариях DevOps, как показано ниже:
gcc main.c -o main -DGIT_COMMIT_HASH="\"$(git rev-parse HEAD)\""
Следующим образом можно получить доступ к приведенному выше определению макроса в коде:
#include <stdio.h>int main() { printf("Commit: %s\n", GIT_COMMIT_HASH); return 0; }
3. Сравнение в Git для коммитов и веток
Обычно опытный программист вводит команду git diff
после модификации кодовой базы, чтобы проверить изменения. И это несмотря на то, что современные GUI-редакторы непосредственно отображают git diff
. Дело в том, что это очень гибкая команда, как и любая другая в Git. Например, различия можно найти на основе расширения файла:
git diff *.txt
Также можно получить различия между двумя коммитами:
git diff HEAD~2 HEAD~1
Приведенная команда показывает разницу между предыдущим коммитом и более ранним. Кроме того, с помощью команды diff
можно сравнивать ветви. Попробуйте ввести имена ветвей вместо идентификаторов коммита.
4. Запросы и форматирование журналов Git
Работа с репозиторием Git сравнима с записью отдельных событий в дневник и позволяет просматривать предыдущие события. Для контроля последних изменений разработчики часто используют команду git log
. Она имеет несколько опций командной строки для запроса коммитов и форматирования выходных данных. Например, мы можем отфильтровать коммиты по имени автора:
git log --author="John Smith" --oneline
Можно также использовать опцию CLI --grep
для фильтрации результатов на основе описаний коммитов, как ранее это делали с командой shortlog
.
Команда Git log
показывает по умолчанию подробные выходные данные, но можно получить и минимальный отклик с некоторыми краткими флагами CLI, такими как --oneline
. Git также предлагает способы настройки форматов записи в журнал. Вот пример:
Получить приведенный выше вывод можно с помощью следующей команды:
git log --format="%Cgreen%h%Creset %an"
Дополнительные сведения о синтаксисе форматирования Git можно найти в официальной документации. Синтаксис форматирования помогает писать ориентированные на Git сценарии DevOps с помощью Bash, Python и популярных языков сценариев, подобных JavaScript.
5. Форматирование необработанных выходных данных в виде таблиц
Знаете ли вы, что некоторые команды Git, такие как git branch
, могут использоваться с флагом --column
, чтобы отформатировать построчный вывод в столбцы? Команда git column
предлагает разработчикам ту же функцию, что и унифицированная команда helper
. Она форматирует стандартные выходные данные в таблицы в соответствии с разными входными параметрами. Предположим, вы создаете шаблон, разделенный новой строкой, с помощью команды seq
на Unix. Таблицу с этими данными можно создать, передав вывод команды seq
в git column
.
Вот пример:
seq 1 100 | git column --mode=column
Мы видим, что вся числовая последовательность отформатирована в виде таблицы в соответствии с размером окна имеющегося терминала:
git column
можно использовать в любом Bash-скрипте для вывода выходных данных в структурированном и удобном для пользователя виде.
6. Добавление коротких заметок к коммитам
Разработчики, как правило, пишут к коммитам четкие и понятные описания. Они позволяют поддерживать историю работы над проектом в оптимальном состоянии. Кроме того, благодаря общепринятым соглашениям о коммитах некоторые команды разработчиков автоматически генерируют заметки к релизам версий вместе с описаниями коммитов.
Как добавить дополнительные заметки к коммиту? Если вы добавите что-то в описание коммита, оно появится в GUI удаленного хостинга Git. А как добавить скрытую заметку, чтобы напомнить о каких-то технических работах или записать сообщение для сервера CI/CD?
В этом помогает встроенная функция git notes
. С помощью следующей команды можно связать заметку с текущим коммитом:
git notes add -m "Test note"
Заметку можно записать и в несколько строк с помощью программы-редактора, не указав опцию -m
. Прочитать текущую заметку можно с помощью команды git notes show
. Кроме того, команда git log
показывает заметки по умолчанию. Ранее GitHub использовал в качестве комментариев заметки Git, но теперь предпочтение отдано веб-комментариям.
Git по умолчанию не отправляет и не извлекает (push/pull) заметки, но с помощью следующих команд можно явно обрабатывать удаленные заметки:
git push <remote> refs/notes/* git fetch origin refs/notes/*:refs/notes/*
7. Проверка коммита
Чтобы проанализировать изменения в коде, обычно проверяют Git-коммиты на таких удаленных сервисах Git-хостинга, как GitHub. Он показывает коммит с изменениями в файле и позволяет начать обсуждение прямо в нем. Встроенные функции Git также позволяют изучить тот или иной коммит локально. Например, с помощью следующей команды можно увидеть сведения о текущем коммите:
git show
С помощью синтаксиса HEAD~n
или хэша коммита можно просмотреть предыдущие коммиты. Например, эта команда выдает детали третьего коммита-предка:
git show HEAD~3
Здесь также сработает известная опция --oneline
— она выведет минимальную информацию о коммите:
Читайте также:
- Обзор команд Git для отмены изменений
- Полезные команды Git
- Продвинутый функционал Git: хитрые приемы и команды
Читайте нас в Telegram, VK и Дзен
Перевод статьи Shalitha Suranga: 7 Lesser-Known Git Commands and Tricks