GitK

Инструмент Gitk — это графический браузер репозитория, первый в своем роде. Его можно рассматривать как оболочку графического интерфейса для git log. Он полезен для анализа и наглядного представления истории репозитория. Браузер написан на языке tcl/tk, поэтому его можно переносить между операционными системами. gitk поддерживается Полом Маккеррасом как независимый проект, отдельный от ядра Git. Стабильные версии распространяются как часть пакета Git для удобства конечных пользователей. Gitk может стать полезным учебным пособием для новичков в Git.

Обзор Gitk

Инструмент Gitk может принести пользу при обучении новичков в управлении версиями или разработчиков, которые переходят в Git из другой системы управления версиями, например Subversion. Gitk — удобная утилита, которая поставляется вместе с ядром Git и включает графический пользовательский интерфейс для наглядного представления внутренней механики Git. Среди других популярных графических интерфейсов Git можно выделить git-gui, а также Sourcetree от Atlassian.

Использование

Gitk вызывается аналогично git log. При выполнении команды gitk запускается пользовательский интерфейс Gitk, который будет выглядеть примерно так:

Initial kopiera

На левой верхней панели показаны коммиты в репозитории (сверху — самые последние). На правой нижней панели отображается список файлов, затронутых выбранным коммитом. На левой нижней панели представлены сведения о коммите и полный список изменений. Если нажать файл с правой нижней панели, на левой нижней панели отобразятся изменения в соответствующем разделе кода.

Gitk отражает текущее состояние репозитория. Если оно изменится в результате работы с командной строкой (например, изменятся ветки), Gitk нужно будет перезагрузить. Для перезагрузки Gitk можно использовать команду меню File -> Reload (Файл -> Перезагрузить).

По умолчанию в Gitk отображается текущая история коммитов. Gitk имеет множество параметров командной строки, которые можно передать при инициализации. Эти параметры в основном ограничивают список коммитов, которые отображаются на верхних панелях Gitk. В общем виде командная строка с параметрами версий выглядит следующим образом:

Параметры

gitk [<options>] [<revision range>] [--] [<path>…]

    <revision range>

Можно указать диапазон версий в виде <от>...<до>, чтобы просмотреть все версии между <от> и <до>, или же указать одну версию.

<path>…

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

--all

Отображение всех веток, тегов и ссылок.

--branches[=<pattern>] --tags[=<pattern>] --remotes[=<pattern>]

Отображение выбранных элементов (веток, тегов, удаленных репозиториев), как если бы они были коммитами в главной ветке. Если указан шаблон <pattern>, отображаются только ссылки, соответствующие этому шаблону.

--since=<date>

Отображение коммитов, выполненных позже указанной даты.

--until=<date>

Отображение коммитов, выполненных раньше указанной даты.

--date-order

Сортировка коммитов по дате.

--merge

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

--left-right

Отображение информативных меток, указывающих, к какой стороне сравнения принадлежит коммит. Коммиты с левой стороны имеют в качестве префикса символ «меньше» (<), а коммиты с правой стороны — символ «больше» (>).

--ancestry-path

Если задан диапазон отображаемых коммитов (например, «коммит1..коммит2» или «коммит2 коммит1»), отображаются только те коммиты, которые находятся непосредственно в цепочке предков между коммит1 и коммит2, то есть коммиты, которые являются одновременно потомками коммит1 и предками коммит2 (более подробное объяснение см. в разделе «Упрощение истории» на странице руководства git-log(1)).

L<start>,<end>:<file>

Параметры, которые позволяют эффективно отслеживать историю кода для заданного диапазона номеров строк.

Пояснение и примеры

Чтобы отобразить полезную информацию, утилите Gitk нужен базовый репозиторий с историей коммитов. Приведенный ниже код представляет собой последовательность команд Bash. С их помощью будет создан новый репозиторий с двумя ветками, в которых есть коммиты, и эти ветки будут объединены в одну.

mkdir gitkdemo &&
    cd gitkdemo &&
    git init . &&
    echo "hello world" > index.txt &&
    git add index.txt &&
    git commit -m "added index.txt with hello world content"

В качестве примера изучим этот демонстрационный репозиторий с помощью Gitk. Приведенная выше последовательность команд создает новый репозиторий с одним коммитом и файлом index.txt. Теперь вызовем gitk для изучения репозитория.

Первый коммит

Может ли Gitk сравнить два коммита?

Продолжим работу с демонстрационным репозиторием и создадим дополнительный коммит:

echo "prpended content to index" >> index.txt &&
    git commit -am "prepended content to index"

После выполнения указанных команд необходимо перезагрузить Gitk. Это можно сделать из командной строки или воспользоваться графическим интерфейсом и выбрать команду File -> Reload (Файл -> Перезагрузить). После перезагрузки должен отобразиться новый коммит.

Следующий коммит

Как видите, ссылка на главную ветку main теперь указывает на новый коммит. Чтобы сравнить эти два коммита, воспользуемся левой верхней панелью истории. На панели истории нажмите коммит, который станет основой для сравнения. После этого щелкните правой кнопкой мыши на втором коммите для вызова контекстного меню.

Сравнение коммитов

В контекстном меню доступны следующие варианты:

Diff this -> selected
    Diff selected -> this

При выборе любого из этих вариантов на левой нижней панели появится информация о различиях между двумя коммитами. В нашем примере она будет выглядеть так:

Вывод команды diff

Результаты выполнения команды diff показывают, что в файле index.txt появилась новая строка (prepended content to index), которая была добавлена между двумя коммитами.

Использование Gitk для сравнения двух веток

Продолжим работу с нашим примером репозитория и создадим новую ветку.

git checkout -b new_branch &&
    echo "new branch content" > new_branch_file.txt &&
    git add new_branch_file.txt &&
    git commit -m "new branch commit with new file and prepended content" &&
    echo "new branch index update" >> index.txt &&
    git commit -am "new branch commit to index.txt with new content"

Показанная последовательность команд создает новую ветку с именем new_branch и добавляет в нее файл new_branch_file.txt. Кроме того, добавляется новое содержимое в файл index.txt, и выполняется дополнительный коммит для этого обновления. Теперь у нас есть новая ветка, которая опережает главную на два коммита. Нам придется перезагрузить Gitk, чтобы увидеть эти изменения.

Новая ветка

Это отличная возможность для изучения механизма ветвления в Git. Gitk отображает коммиты в виде линейной последовательности. Термин «ветвление» подразумевает, что на временной шкале должна появиться «ветка» или форк. Ветки Git отличаются от веток в других системах управления версиями. В Git ветка — это указатель на коммит. Указатель перемещается между коммитами по мере их появления. Создавая ветку Git, вы ничего не меняете в структуре репозитория или дереве исходного кода. В результате этой операции появляется только новый указатель.

Чтобы найти коммиты, которыми различаются эти две ветки, нужно запустить Gitk, указав диапазон версий. При выполнении команды gitk main..new_branch откроется окно Gitk, в котором будут показаны только коммиты, расположенные между двумя ссылками на ветки.

Сравнение ветки

Эта утилита эффективна при сравнении веток.

Сравнение Gitk и git-gui

git-gui — еще один графический интерфейс Git на базе Tcl/Tk. Если в Gitk основное внимание уделяется навигации и наглядному представлению истории репозитория, то инструмент git-gui ориентирован на уточнение отдельных коммитов и работу с аннотациями отдельных файлов. Кроме того, он не отображает историю проекта. При этом из меню git-gui можно запустить Gitk для изучения истории. Этот инструмент также вызывается из командной строки с помощью команды git gui.

Сводная информация о Gitk

Подводя итоги, повторю, что Gitk — это оболочка графического интерфейса для git log, которая представляет собой невероятно эффективный инструмент для анализа и наглядного представления истории репозитория. Кроме того, инструмент Gitk может быть полезен при изучении внутреннего устройства Git.

Рекомендовано для вас

Блог Bitbucket

Образовательные программы DevOps

Подробнее о Git

В этом разделе вы найдете другие руководства и ресурсы по Git.