Интерфейс командной строки GitButler: Скотт Чакон, GitButler

GGitButler
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00Добро пожаловать! Я проведу небольшую демонстрацию для тех, кто не знает о Git Butler. Это новый инструмент контроля версий.
00:00:07Мы работаем над ним пару лет. Мы стянули много всяких фишек из JJ.
00:00:10Так что если вы используете Jujutsu, знайте — мы многое у вас позаимствовали.
00:00:16В общем, если вы не пробовали Git Butler, это инструмент для контроля версий.
00:00:19Обычно это GUI (графический интерфейс),
00:00:21но сейчас мы работаем над CLI, и я хотел показать консольные фишки, так как вы все работаете с Git, а
00:00:26у Git довольно специфический интерфейс командной строки.
00:00:29Некоторые концепции мы также подсмотрели в Jujutsu,
00:00:33но есть и кое-что новое, что мне кажется очень крутым.
00:00:36Я хочу показать это вам, чтобы услышать ваши идеи о том, что еще можно было бы добавить.
00:00:40Так что да, я пройдусь по этим вещам.
00:00:43Итак.
00:00:46Тут есть несколько моментов. Консольная утилита называется «but».
00:00:49Раз уж я сегодня травил батины шутки, название кажется вполне подходящим.
00:00:52Вы можете запустить «but status». Это что-то вроде краткого лога.
00:00:57Если вы пользовались Sapling или Jujutsu и вызывали там log — это похоже.
00:01:00Здесь отображаются файлы, измененные на диске,
00:01:05в вашем рабочем каталоге относительно целевой ветки.
00:01:08Но также видны и ваши коммиты, понимаете?
00:01:11Можно ввести «but status -F», и тогда покажутся файлы, измененные в каждом из коммитов.
00:01:18Если запустить GUI Git Butler, там можно увидеть дорожки (lanes) и всё такое.
00:01:23Но в Git Butler много крутых штук, которые Git не умеет. Например, вот такой лаконичный лог.
00:01:29Просто «but» — и всё.
00:01:30И, знаете,
00:01:32мы можем вывести общий лог, который показывает, локальные это коммиты или нет. В общем, похоже на «short log»
00:01:39в других системах.
00:01:40И мы можем создавать новые ветки.
00:01:44Если я посмотрю статус, то увижу... я тут делаю клон Твиттера.
00:01:50У меня есть пара веток, одна идет поверх другой (stacked).
00:01:52Git в принципе тоже так может, если использовать «update-ref».
00:01:56Например, при ребейзе он переписывает ваши ссылки.
00:02:00Но у нас это происходит более естественно.
00:02:03Мы автоматически обновляем ссылки, вы можете менять данные, и ребейз будет это отслеживать.
00:02:09Но мы также умеем
00:02:11параллельные ветки. То есть можно применять более одной ветки одновременно. И сейчас я...
00:02:23создам новую ветку,
00:02:26запущу команду снова, и вот — у меня новая ветка параллельно тем, над которыми я уже работал.
00:02:33Я могу переключиться в эту ветку и начать назначать изменения или делать коммиты.
00:02:39Сейчас мы это увидим.
00:02:41Еще одна крутая фишка — у нас несколько областей подготовки (staging areas).
00:02:45У каждого стека своя область подготовки, так что можно сказать...
00:02:51«rub» — это такая команда. Можно сказать «rub KU» для этого файла и отправить его в «ZA».
00:02:58Так он назначается конкретной области подготовки. Если я хочу привязать что-то к этой...
00:03:04Система выдает вот такие короткие коды. И вы говорите: «Окей»,
00:03:12«этот файл пойдет сюда, а этот — туда».
00:03:15И когда я нажимаю «commit», я могу закоммитить их в разные ветки одновременно.
00:03:21Давайте взглянем. Мы видим, что это назначено сюда, так что я пишу:
00:03:27«but commit -o».
00:03:30И оно коммитится прямо сюда.
00:03:40Теперь этот файл в этом коммите. И прелесть в том, что это всё еще обычный Git. Я могу
00:03:48сказать...
00:03:50вот так. Оно создает обычный git-коммит, я могу пушить эту ветку и всё остальное.
00:03:57Но...
00:03:59Да, я могу назначать изменения веткам или просто написать «but commit», и оно закоммитит всё нераспределенное в целевую ветку.
00:04:07Я могу сам выбирать, в какую ветку отправлять новые правки.
00:04:11Мы придумали для этого термин «rubbing» (притирание/смешивание).
00:04:14Я уже говорил многим про Калеба, который пил всю ночь и которого сейчас здесь нет.
00:04:18Если он всё-таки зайдёт, нам стоит встать и поаплодировать ему.
00:04:21Так вот, он придумал термин «rubbing» — это когда берешь две вещи, соединяешь их и смотришь, что получится.
00:04:28Если вы играли в Minecraft, то знакомы с концепцией верстака.
00:04:32Вы знаете, как это работает:
00:04:34берешь это и это, совмещаешь и получаешь что-то новое и более интересное.
00:04:38В интерфейсе «but» есть куча вещей, которые можно «притереть» друг к другу через «but rub».
00:04:45Покажу пару примеров. Можно назначать файлы, как я уже показывал — отправить незакоммиченный
00:04:52или измененный файл в ветку. Но можно и «разлипать» их. Тут есть специальный режим «00».
00:05:01Я могу сказать: «but rub»
00:05:05весь этот коммит, например,
00:05:07в «00» и...
00:05:11оно отменяет коммит. По сути, делает «reset --soft»
00:05:17для этого коммита. Также можно вносить правки (amend). Пишем «rub le r»...
00:05:24«y».
00:05:27«RV»... боже, мне нужны очки для чтения. Старею.
00:05:32«SW»... а, извините, на самом деле в...
00:05:35«11 W». Давайте попробуем.
00:05:38Там «IW»? Спасибо.
00:05:41Ой.
00:05:44Это буква «I»?
00:05:48Извиняюсь.
00:06:02И...
00:06:04оно коммитит прямо туда. Я могу сделать...
00:06:10«rub I».
00:06:14Могу отменять коммиты.
00:06:16Можно склеивать (squash). Если я хочу объединить этот коммит и вот этот, я пишу «but rub»
00:06:22«J e GE».
00:06:25И коммиты склеиваются. Я могу отменять коммиты, перемещать их...
00:06:32В общем, всё, что логически ожидаешь от объединения двух объектов.
00:06:37Оно сделает именно это. А если объединить что-то с «нераспределенными изменениями», оно просто это отменит.
00:06:42И вы даже можете... не помню, работает ли это сейчас...
00:06:48вы можете перемещать файлы между коммитами. Например:
00:06:53«J 8 2».
00:07:02И...
00:07:03оно берет файл из того коммита,
00:07:07убирает его оттуда и переносит в коммит, который находится ниже.
00:07:11Интересно тут не то, что это невозможно в Git, а то, что в Git это делать довольно муторно.
00:07:19Трудно отменять отдельные коммиты где-то в середине или переносить файлы между ними, или вносить правку в коммит, который был три шага назад.
00:07:27В обычном Git это делается через...
00:07:31временный fixup-коммит и autosquash или как-то так.
00:07:34Но куда приятнее просто «перетереть» контент туда, куда нужно,
00:07:40и работать с несколькими ветками одновременно.
00:07:43Еще с помощью этого можно легко разделять коммиты. У нас есть команда «but new».
00:07:51Допустим, я пишу:
00:07:54«but new».
00:07:56«H e» — и оно...
00:07:59создает новый пустой коммит в этом месте.
00:08:03Это в стиле Jujutsu — создать коммит, в котором пока ничего нет.
00:08:08А потом я могу «втереть» в него файлы. Например:
00:08:12«Возьми этот файл».
00:08:15«0».
00:08:23«Беру».
00:08:29Файл переносится в этот новый коммит. А теперь я могу добавить описание (describe).
00:08:32Что там было... «X y c».
00:08:45Как бы мне...
00:08:56«Status -F» — статус файлов. Он показывает файлы в каждом коммите. Так что «but ST»...
00:09:02Обычный «but status» просто показывает коммиты,
00:09:04а «but status -F» показывает файлы внутри них, чтобы их можно было перекидывать через «rubbing».
00:09:11Итак, есть «new» и «describe». И последнее — это «marking» (маркировка). Тоже очень в духе JJ.
00:09:16В Jujutsu можно пометить коммит как целевой (target).
00:09:21Тогда всё, что видит система, она будет помещать в этот коммит. Это можно сделать так:
00:09:25довольно любопытная штука. Пишем:
00:09:29«but new -M» или просто «but mark».
00:09:33«Z a» и...
00:09:35оно помечает этот коммит. Видите? Оно уже взяло нераспределенные изменения и поместило их в эту
00:09:42дорожку.
00:09:44Затем я могу делать коммиты или пометить
00:09:47какой-то конкретный коммит.
00:09:56Ой, это ветка, извините.
00:09:58В общем, помечаем конкретный коммит, и если я, скажем, сделаю «echo new»,
00:10:07то изменения автоматически закоммитятся именно в него.
00:10:15Это интересно, потому что это цепочка (stacked branch) из нескольких коммитов, и что бы я сейчас ни делал,
00:10:21оно автоматически дополняет (amend) коммит, который находится на три уровня ниже в стеке.
00:10:26Это похоже на рабочий процесс в JJ: вводишь «jj new» и начинаешь работать,
00:10:31и оно просто автоматически обновляет твой последний коммит.
00:10:33Только здесь можно пометить практически любой коммит,
00:10:36продолжить работу, и правки будут лететь в него, пока вы не снимете метку.
00:10:41Вот так.
00:10:44В общем, вот такие забавные штуки мы разрабатываем.
00:10:48Мне очень нравится работать с этим инструментом.
00:10:52Еще одна вещь, которую мы тоже подсмотрели у JJ — это лог операций (oplog).
00:10:56Эта функция у нас уже давно.
00:10:59В графической версии Git Butler есть вкладка со всеми выполненными операциями.
00:11:03Каждый раз, когда я что-то запускаю, создается запись
00:11:06в истории операций. Я вижу всё, что сделал Git Butler, и могу откатиться к любой точке. Можно сказать:
00:11:12типа
00:11:13«undo».
00:11:14Ой, если написать правильно — «undo» отменит операцию и вернет рабочий каталог и статус в состояние,
00:11:20в котором они были до этого. Или можно сказать
00:11:22«restore»
00:11:24к любому из этих хешей (SHA).
00:11:26Упс.
00:11:29И...
00:11:33оно сбрасывает рабочий каталог, ветки и всё остальное к тому виду, который был раньше.
00:11:38Кстати, так очень удобно проводить демо: я могу создать сценарий,
00:11:44который точно работает, а потом просто откатиться назад и запустить его снова.
00:11:50Но, конечно, это полезно и в жизни: «Знаете, я передумал» или «Я залез в дебри
00:11:54конфликтов». Просто нажал «undo» и работаешь дальше.
00:11:58Ну вот и всё. Ах да, все команды поддерживают вывод в JSON. Можно добавить флаг «-J»
00:12:06или «--json», и любая команда выдаст те же данные, но в формате JSON.
00:12:11Для написания скриптов это гораздо удобнее, чем парсить стандартный вывод Git.
00:12:15Можно просто прогнать через «jq», найти нужную запись
00:12:21и сделать автоматизацию на CLI гораздо приятнее.
00:12:24На этом всё. Большое спасибо!

Key Takeaway

GitButler CLI переосмысляет рабочий процесс Git, предлагая мощные инструменты для управления стеками коммитов, параллельными ветками и операциями отката через интуитивно понятные команды.

Highlights

GitButler — это инновационный инструмент контроля версий, который теперь развивает собственный интерфейс командной строки (CLI) под названием «but».

Разработчики внедрили концепцию «параллельных веток», позволяющую работать над несколькими наборами изменений одновременно без переключения контекста.

Команда «but rub» («притирание») является универсальным механизмом для склеивания коммитов, переноса файлов между ними и управления областью подготовки.

Режим маркировки («mark») позволяет автоматически направлять все текущие изменения в конкретный выбранный коммит, даже если он находится глубоко в стеке.

Встроенный лог операций (oplog) обеспечивает возможность мгновенного отката («undo») к любому предыдущему состоянию репозитория.

Все консольные команды поддерживают вывод в формате JSON, что значительно упрощает автоматизацию и интеграцию с другими инструментами через jq.

Timeline

Введение в GitButler и его философию

Скотт Чакон представляет GitButler как современную альтернативу традиционным инструментам контроля версий. Он открыто признает, что многие идеи, такие как работа со стеками, были заимствованы из проекта Jujutsu (JJ). Основное внимание в демонстрации уделяется новому интерфейсу командной строки, который призван исправить недостатки стандартного CLI Git. Спикер подчеркивает, что цель проекта — сделать работу с кодом более гибкой и интуитивной. Этот раздел задает контекст для последующей технической демонстрации возможностей утилиты.

Основы CLI и визуализация статуса

Демонстрация начинается с основной команды под названием «but», которая служит точкой входа в систему. Команда «but status» выводит краткий и информативный лог, показывающий измененные файлы относительно целевой ветки. В отличие от стандартного Git, здесь наглядно отображаются как локальные коммиты, так и текущие правки на диске. Флаг «-F» позволяет детализировать просмотр, показывая состав файлов внутри каждого отдельного коммита. Автор сравнивает этот интерфейс с системами Sapling и Jujutsu, отмечая его лаконичность.

Параллельные ветки и управление стеками

Спикер демонстрирует уникальную возможность GitButler — одновременную работу с несколькими параллельными ветками. Пользователь может создавать новые ветки, которые существуют в рабочем пространстве бок о бок, а не последовательно. Система использует короткие идентификаторы для быстрого распределения файлов по разным веткам или областям подготовки. Команда «but commit -o» позволяет записывать изменения в конкретную ветку, сохраняя при этом совместимость со стандартными git-ссылками. Это позволяет разработчикам разделять логику правок без постоянного использования команд checkout или stash.

Концепция «Rubbing» и манипуляция коммитами

Центральной темой этого раздела является команда «but rub», название которой вдохновлено механикой верстака из игры Minecraft. Этот инструмент позволяет «смешивать» объекты: например, можно влить незакоммиченный файл в существующий коммит или склеить два коммита между собой. Спикер показывает, как легко переносить отдельные файлы из одного коммита в другой, просто указывая их короткие коды. В обычном Git такие операции потребовали бы сложного интерактивного ребейза или использования fixup-коммитов. Здесь же процесс сводится к одной простой команде, что значительно ускоряет рефакторинг истории.

Создание пустых коммитов и маркировка целей

Скотт показывает продвинутые техники управления потоком изменений, такие как создание пустых коммитов командой «but new». После создания «пустышки» в нее можно постепенно добавлять нужные файлы, используя уже знакомый механизм «rubbing». Особое внимание уделяется функции «mark» (маркировка), которая фиксирует фокус системы на определенном коммите в стеке. После этого любые новые правки в файлах автоматически добавляются в этот помеченный коммит через amend. Это избавляет программиста от необходимости делать промежуточные коммиты и последующие объединения (squash) вручную.

Лог операций, отмена действий и поддержка JSON

В заключительной части обсуждается безопасность и автоматизация при работе с GitButler. Функция «oplog» (лог операций) фиксирует каждое действие пользователя, позволяя мгновенно выполнить команду «undo» для возврата в любое предыдущее состояние. Это крайне полезно при возникновении сложных конфликтов или ошибок во время демонстрации кода. Также упоминается поддержка флага «--json», который превращает вывод любой команды в структурированные данные. Это делает GitButler идеальным инструментом для создания собственных скриптов и цепочек автоматизации без необходимости парсинга текстовых строк.

Community Posts

View all posts