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На этом всё. Большое спасибо!