
Частичный stage файлов в git
Приходилось ли вам работать с длинными JSON-ами в git-е?
Мне вот приходилось, когда в проект внедрялись дизайн-токены. Схема такая: есть «источник правды» в виде хранилища значений разных элементов интерфейса (цвета, размеры шрифтов, параметры теней и тд) в виде плагина к Figma. Из этого хранилища дизайнеры применяют значения в макетах, а для разработки выгружается JSON-файл. Затем файл процессится и из него генерятся кастомные свойства аля --ui-element-background-color-default
, которые уже используются в стилях.
Так вот, на этапе разработки эта JSON-ина была одна и большая. И часто случалось так, что от дизайнеров приходила сразу пачка разнородных изменений в один этот файл. И нужно было как-то отделить мух от котлет, и все текстовые правки одного файла разделить на несколько коммитов в разные ветки.
Руками копировать правки — так себе идея. Тут пригодится возможность git-а делать добавление частичных правок файла в stage.
Когда вы добавляете файл в stage — это на самом деле не целиком файл, а именно конкретное состояние этого файла, его «снепшот». То есть если в файле две текстовые правки, застейджить можно только одну из них, а вторую пока не брать.
Для этого в VSCode нужно перейти в файл, выделить интересующие текстовые правки и выполнить команду cmd(ctrl)+shift+P
> Git: Stage Selected Ranges
и в stage уйдут только частичные правки файла, остальные правки останутся в изменённом файле.
Похожим образом можно также частично откатывать изменения в файлах. Например, что бы подчистить временные логи. Для этого нужно выбрать файл, так же выделить текстовые правки и выполнить команду cmd(ctrl)+shift+P
> Git: Revert Selected Ranges
. Либо в окошке с диффами тыкнуть на дифф и выбрать Revert this change
.
Из консольного git-а такое частичное добавление в stage также работает. Для этого есть команда git add -p
. Если, к примеру, была правка в двух местах файла, то появится такое сообщение (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?
. Выбор y
— правка стейджится, n
— не стейджится, ?
— помощь по остальным вариантам команд.
Для частичного реверта нужна команда git restore -p
, которая вызовет такой же интерактивный диалог только с другим вопросом: Discard this hunk from worktree?
.