Попасть на него можно из меню списка диалогов проекта и из списка сессий проекта — пункт Git открывает репозиторий той рабочей папки, в которой вы находитесь.
Шапка
Шапка сделана в виде командной строки и отвечает на вопрос «где я сейчас». Строка шапки читается слева направо: имя проекта, текущая ветка, расхождение с сервером, число изменённых файлов, сумма добавленных и удалённых строк, число записей в стеше и время последнего обновления. Пустые значения в строку не попадают, поэтому у чистой папки вы увидите только имя проекта и слово clean. Расхождение с сервером показывается только когда оно есть: числа впереди означают свои коммиты, которые сервер ещё не видел, числа позади — чужие коммиты, которых нет у вас. В конце строки может появиться состояние экрана: reading… пока приложение читает репозиторий, offline когда чтение не удалось, not a repo когда в папке нет репозитория.
- Кнопка Pull забирает изменения с сервера и сразу перебазирует вашу ветку на свежую. Пока идёт загрузка, вместо кнопки крутится кружок.
- Кнопка Push отправляет ваши коммиты на сервер. Пока идёт отправка, вместо кнопки тоже крутится кружок.
- Обе кнопки есть только когда у репозитория настроен удалённый адрес. Без него они не появляются вообще.
- Кнопка Refresh перечитывает репозиторий заново и заодно обновляет время последнего обновления в шапке.
- Потянуть список вниз тоже перечитывает репозиторий — это тот же Refresh, просто без кнопки.
Меню // git в шапке меняется в зависимости от содержимого репозитория:
- About repository открывает шторку со сводкой: путь, корень репозитория, ветка, связь с сервером, адреса удалённых репозиториев, последний коммит, счётчики изменений, стеш и общее число коммитов.
- Undo last commit отменяет последний коммит и появляется, только когда в репозитории есть хотя бы один коммит.
- Stash list · N открывает список отложенных изменений и появляется, только когда стеш не пуст.
Вкладка commits
Вкладка commits — это история репозитория: список сделанных коммитов, самый новый сверху. Коммиты собраны по дням, над группой стоит подпись today, yesterday или дата вроде 21 Sep, а сама подпись не уезжает при прокрутке. У каждого коммита видно короткий хэш, текст сообщения, автора и относительное время: сейчас, 5m, 3h, 2d, а для старых дат — дата.
- Тап по строке открывает этот коммит: появляется полоса с его хэшем и сообщением, а вкладка переключается на список файлов.
- Полоса выбранного коммита закрывается тапом по слову clear либо тапом по самой полосе.
- Долгий тап по строке открывает небольшое меню с тремя пунктами: скопировать хэш, скопировать сообщение, скопировать дату.
- Ссылки коммита показываются чипами под сообщением. Чип той ветки, на которой вы находитесь, выделен бирюзовым и жирным, а остальные — обычные: это теги и другие ветки, где встречается коммит. В строке видно не больше двух чипов, а остальные считаются подписью вида
+3. - Кнопка load more внизу списка дочитывает историю и появляется только тогда, когда в репозитории есть ещё не показанные коммиты.
Файлы выбранного коммита
После тапа по коммиту вместо изменений показывается его содержимое. Сверху идёт строка с хэшем и сообщением, а под ней — список файлов, разложенный по разделам так же, как список изменений. В файлах этого коммита делений-галок нет: выбор тут не нужен, посмотреть можно всё. Под хэшем и сообщением видно, в каких ветках встречается этот коммит, — показываются первые четыре ветки. Тап по строке с хэшем и сообщением копирует хэш в буфер обмена.
Вкладка changes
Вкладка changes показывает то, что сейчас изменено в папке и ещё не закоммичено. Файлы разложены по разделам, и порядок разделов всегда один: сначала конфликты, потом изменённые, потом добавленные, потом удалённые, в самом низу новые файлы. Слева у каждого файла стоит деление в квадратных скобках: [ ] — файл не попадёт в коммит, [x] — попадёт. У выбранного файла слева появляется бирюзовая полоска во всю высоту строки, чтобы выбор было видно сразу, а не только по символу.
- Тап по делению выбирает или снимает файл. Это влияет только на будущий коммит: подготовленный список приложение не трогает, пока вы не нажмёте commit.
- Тап по самой строке файла открывает его diff — что именно в нём поменялось.
- Кнопка all в шапке раздела выбирает все файлы раздела, кнопка none снимает все. В разделе конфликтов такой кнопки нет: там файлы нельзя выбрать для коммита.
- Слева у файла стоит буква, которая объясняет, что с ним случилось. M — изменён, A — добавлен, D — удалён, ? — новый файл, который ещё не следится репозиторием, ! — конфликт, T — тип файла поменялся, R — файл переименован.
- Справа у файла видно счётчики строк: сколько добавлено зелёным плюсом и сколько удалено красным минусом. У новых файлов вместо чисел написано new.
Нижняя панель изменений
Под списком файлов стоит узкая панель, которая всегда на виду. В её первой строке написано, сколько файлов выбрано из скольких, а рядом — сумма добавленных и удалённых строк по всем изменениям папки.
- Пока есть конфликты, под этой строкой появляется красная надпись о том, что коммит заблокирован. Кнопка commit при этом не нажимается.
- Кнопка stash прячет все изменения в стеш и очищает папку от изменений, включая новые файлы. Кнопка stash есть, только когда есть что прятать.
- Кнопка pop stash возвращает последнюю запись стеша обратно в папку. Кнопка pop stash занимает место кнопки stash, когда стеш уже не пуст.
- Кнопка commit открывает окно коммита и доступна, только когда выбран хотя бы один файл и конфликтов нет.
Окно коммита
Окно коммита открывается снизу и остаётся поверх экрана, пока вы его не закроете или не сделаете коммит. В нём три вещи: текст сообщения, чип amend и список файлов, которые уедут в коммит. В шапке окна написано // commit и счётчики вида 2/5 files, чтобы было видно, что именно выбрано.
- Поле сообщения занимает от трёх до шести строк. Пока оно пустое, кнопка commit не нажимается.
- Чип amend last меняет смысл коммита. Без чипа создаётся новый коммит поверх истории, а с ним переписывается последний: его сообщение и файлы заменяются вашими, а отмены этого действия уже нет.
- При включении чипа в пустое поле подставляется сообщение последнего коммита. Так удобно править чужие правки, ничего не набирая заново, а если поле уже заполнено вашим текстом, он остаётся.
- Рядом с чипом показана настоящая команда, которая выполнится: обычный коммит или переписывание последнего.
- Список выбранных файлов показывает первые шесть. Если их больше, внизу написано, сколько ещё не поместилось.
- Пока есть конфликты, внизу окна висит красная надпись, и кнопка commit остаётся недоступной.
- Кнопка cancel закрывает окно и очищает его. Ничего не коммитится, файлы остаются выбранными, но текст сообщения и режим amend сбрасываются.
Что происходит после нажатия:
- Выбранные файлы добавляются в подготовленный список, а снятые, но лежавшие в нём раньше, оттуда убираются.
- Создаётся коммит с вашим сообщением, окно закрывается, а список изменений и история перечитываются заново.
- Список файлов обрабатывается порциями, поэтому коммит с сотней файлов делается так же спокойно, как с одним.
- Если что-то пошло не так, окно коммита открывается снова с вашим сообщением, а сверху показывается причина.
Отмена последнего коммита
Пункт Undo last commit не откатывает файлы на место: коммит снимается, а его изменения остаются подготовленными, чтобы вы могли поправить и закоммитить заново. После подтверждения сразу открывается окно коммита с сообщением снятого коммита и отметками на его файлах. Подтверждение всегда запрашивается, а в окне прямо показана команда, которая выполнится.
Ветки
Приложение умеет показывать список веток, искать по нему, переключаться между ветками, создавать новые и удалять ненужные. На сегодняшний день открыть этот список на экране нечем: кнопки, которая его показывает, нет ни в шапке, ни в меню, ни в нижней панели. На практике ветку приходится переключать и создавать в терминале, а экран Git показывает только то, на какой ветке вы находитесь сейчас.
Как выглядел бы список веток, если бы он открывался:
- Сверху было бы поле поиска по названию ветки и по её связи с сервером, а справа в шапке — название текущей ветки.
- Список был бы ограничен по высоте и прокручивался бы, поэтому веток может быть сколько угодно.
- У текущей ветки слева стояла бы звёздочка, и сама строка была бы бирюзовой. Переключиться на неё повторно нельзя.
- Под названием ветки показывалась бы её связь с сервером: сколько своих коммитов впереди и сколько чужих позади. Если связь пропала, написано gone, а если всё совпадает — in sync.
- Тап по строке переключил бы на эту ветку, а меню на строке умело бы две вещи: Checkout для перехода и Delete с подтверждением. У текущей ветки пункт Checkout не показывается, потому что переключаться на неё уже некуда.
- Кнопка new branch открывала бы небольшое окно с одним полем и создавала бы ветку с введённым именем.
Список отложенных изменений
Шторка стеша показывает записи, которые вы прятали командой stash. У каждой записи виден её номер, сообщение и та ветка, из которой она была спрятана.
- Меню записи умеет три вещи. Apply возвращает изменения в папку и оставляет запись на месте, Pop возвращает их и убирает запись, Drop удаляет запись безвозвратно.
- Если стеш пуст, вместо списка показана короткая надпись
// empty. - Удаление записи всегда спрашивает подтверждение и показывает команду, которая выполнится.
- Кнопка stash all прячет все изменения папки новой записью. Кнопка stash all доступна, только когда в папке есть что прятать.
- Pop из меню любой записи закрывает шторку, потому что возвращённая запись больше не нужна в списке.
О репозитории
Шторка // about собирает в одном месте всё, что обычно приходится искать по верхам экрана. Шторка разделена на части: путь, синхронизация с сервером, удалённые репозитории, последний коммит и сводка по изменениям.
- Строка target всегда показывает папку, открытую на экране. Строка root с корнем репозитория появляется, только если это разные папки — например, когда вы открыли вложенную папку проекта.
- В части синхронизации видно текущую ветку, её сервер и расхождение. Если сервер не привязан, в строке сервера написано none, а в строке расхождения — no upstream. Когда расхождения нет, написано in sync, иначе числа вида
↑2 ↓1. - Удалённые репозитории показываются своими именами, а в их адресах маскируется пароль после двоеточия. Адрес вида
git@host:путьостаётся без изменений. - Последний коммит выводится хэшем, сообщением, автором и датой. Автор и дата не показываются, если git их не вернул.
- В сводке по изменениям видно, сколько файлов каждого вида, сколько записей в стеше и сколько всего коммитов в репозитории.
- У части строк есть кнопка копирования — у пути, корня репозитория, адресов удалённых репозиториев и хэша последнего коммита. У остальных строк кнопки нет.
Просмотр изменений файла
Тап по файлу в списке изменений или в списке файлов коммита открывает полноэкранный просмотр того, что в файле поменялось. Шапка показывает путь к файлу, счётчики добавленных и удалённых строк и, если файл новый или права поменялись, короткую пометку об этом. Каждая строка имеет две колонки номеров: слева номер в старой версии файла, справа номер в новой. У добавленных строк вторая колонка заполнена, у удалённых первая, а у неизменённых строк заполнены обе.
- Добавленные строки подсвечены зелёным, удалённые красным, а блоки заголовков — отдельным приглушённым фоном. Тот же стиль используется в карточке правок внутри чата.
- Служебные строки самого git не показываются. Вместо них в шапке написано, что файл новый, удалён или что права сменились с одной цифры на другую.
- Табы раскрываются в пробелы по четыре, иначе номера строк разъезжаются с текстом.
- Список прокручивается по вертикали и по горизонтали одним жестом. Длинная строка не обрезается многоточием, а прокручивается целиком.
- Кнопка в шапке копирует весь diff файла в буфер обмена как обычный текст.
Случаи, когда вместо строк показывается короткая надпись:
- Двоичный файл: Git не показывает содержимое бинарных файлов.
- Конфликт: приложение показывает только итоговый diff, а разрешить конфликт нужно в терминале.
- Пустой новый файл: в файле нет ни одной строки.
- Нет изменений: либо файл не отличается от сохранённого, либо git не вернул ни одной строки diff.
- Просмотр недоступен: когда разобрать diff не получилось совсем, вместо строк написано, что он недоступен.
- Очень большой файл: сверху пишется, что показаны только первые строки, потому что весь файл целиком не влезает.
Папка без репозитория
Если в рабочей папке репозитория ещё нет, вместо вкладок показывается сообщение // not a git repository и путь к папке. Под ним стоит кнопка git init, которая создаёт репозиторий прямо в этой папке. Вместе с репозиторием создаётся файл с правилами игнора, и под кнопкой показан его будущий состав: папка зависимостей, файл с секретами, папки сборок, логи, служебные папки редактора и файл настроек операционной системы. Без такого файла в коммит сразу попало бы всё подряд, поэтому он создаётся вместе с репозиторием.
Технические данные
| Параметр | Значение |
|---|---|
| Порция истории при открытии экрана | 30 коммитов |
| Порция при нажатии load more | ещё 30 коммитов |
| Разделы изменений и их порядок | конфликты, изменённые, добавленные, удалённые, новые |
| Буквы вида изменения файла | M, A, D, ?, !, T, R |
| Максимум строк diff на файл | 4000 |
| Максимум файлов в многофайловом diff | 200 |
| Порция файлов при подготовке коммита | 100 |
| Ширина таба при разборе diff | 4 позиции |
| Высота списка веток и стеша в шторке | до 400dp |
| Строк в поле сообщения коммита | от 3 до 6 |
| Файлов, показываемых в окне коммита | 6, дальше подпись вида +N |
| Чипов ссылок у коммита | 2, дальше подпись вида +N |
| Подписи времени коммита | now, 5m, 3h, 2d, после этого дата |
| Подписи групп коммитов | today, yesterday, дата, earlier |
| Забрать изменения с сервера | pull с перебазированием |
| Отмена последнего коммита | мягкий сброс на предыдущий, изменения остаются подготовленными |
| Сообщение записи стеша | auto stash, вместе со всеми новыми файлами |
| Работа за один раз | одна операция, повторные нажатия игнорируются |
| Правила игнора при создании репозитория | зависимости, .env, сборки, логи, файлы редакторов |
| Где выполняются команды | локальный git на телефоне или git на сервере по ssh для удалённого агента |
Что агент умеет
- Агент работает в той же папке, которую открывает этот экран, поэтому всё, что он меняет, сразу попадает в список изменений.
- Агент может сделать коммит, и этот коммит появится в истории рядом с вашими.
- Агент может создавать ветки, переключаться между ними, отменять последний коммит и прятать изменения в стеш, и всё это сразу видно на экране Git.
- Агент может забрать изменения с сервера и отправить свои, и экран покажет, насколько репозиторий разошёлся с сервером.
- Агент может править файл, и вы увидите точные строки, которые он добавил или удалил, с их номерами.
Ограничения
- Коммит невозможен, пока есть конфликты: кнопка не нажимается, а внизу висит объяснение.
- Текст коммита обязателен: пустое поле не даёт нажать кнопку.
- Список изменений сам по себе не обновляется: после правок агента нужно нажать Refresh или потянуть экран вниз. После коммита, стеша, смены ветки и забора с сервера список перечитывается сам.
- Пока идёт любая операция, остальные кнопки не нажимаются — приложение не даёт запустить вторую задачу поверх первой.
- Pull идёт с перебазированием, поэтому история у вас после забора изменений может выглядеть иначе, чем до него.
- Отмена последнего коммита необратима: снять его обратно уже нельзя, изменения просто останутся подготовленными.
- Diff двоичных файлов и конфликтов не показывается — только короткая надпись с объяснением.
- Большой файл показывается частично, и вверху пишется, сколько строк поместилось.
- Пункт Undo last commit появляется только когда в репозитории есть коммиты, а пункт списка стеша — только когда стеш не пуст.
- Список веток приложение умеет, но открыть его нечем: переключение и создание веток приходится делать в терминале.
- Удаление ветки и записи стеша спрашивает подтверждение, но восстановить их после удаления нельзя.