y83 code / справочник

Git

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

раздел
Чат с агентом (Codex)
пунктов возможностей
77
источник
docs/codex/git.md

Попасть на него можно из меню списка диалогов проекта и из списка сессий проекта — пункт 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
Максимум файлов в многофайловом diff200
Порция файлов при подготовке коммита100
Ширина таба при разборе diff4 позиции
Высота списка веток и стеша в шторкедо 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 появляется только когда в репозитории есть коммиты, а пункт списка стеша — только когда стеш не пуст.
  • Список веток приложение умеет, но открыть его нечем: переключение и создание веток приходится делать в терминале.
  • Удаление ветки и записи стеша спрашивает подтверждение, но восстановить их после удаления нельзя.

Источник: docs/codex/git.md. Страница собрана из документации проекта при сборке сайта — без пересказа.