Чтение изменений

Семантический дифф

Чистое переименование выглядит в построчном диффе как удалённый целиком файл и добавленный целиком файл. Формально это правда и совершенно бесполезно.

Над каждым диффом файла Gitcito показывает полосу Что изменилось: обе версии файла разбираются через tree-sitter — настоящие синтаксические деревья, а не регулярные выражения — и их объявления сопоставляются друг с другом.

Полоса «что изменилось»: переименования и изменения сигнатур, символ за символом

Вердикт Пример
Переименовано startServer → bootServer
Сигнатура open(path) → open(path, mode)
Добавлено / Удалено новая функция; удалённая
Перемещено тот же код, на 40 строк ниже
Изменено то же имя и сигнатура, другое тело

Переименования и изменения сигнатур идут первыми — именно их ревьюеру нельзя пропустить. Клик по строке перепрыгивает к этому символу в диффе.

Что он умеет разбирать

TypeScript, TSX, JavaScript, Python, Go, Rust, Java, C, C++, C#, Ruby, PHP, Swift, Kotlin, Scala, Lua, Bash и Zig.

Файл на языке, для которого нет грамматики, просто остаётся с обычным построчным диффом — полоса вообще не появляется. То же и для файлов больше 400 КБ.

Честные ограничения

  • Переименование, у которого изменилось и тело, показывается как переименование и прямо об этом сообщает.
  • Две однострочные функции, которые случайно похожи друг на друга, не сопоставляются: ниже порога по размеру совпадение должно быть почти точным, так что вы получите честные «удалено + добавлено» вместо выдуманного переименования.
  • Символы, которые уехали на несколько строк только потому, что что-то выше них подросло, не помечаются как «перемещённые» — иначе настоящие перемещения утонули бы.

См. также: Просмотр диффов · Что изменилось с тех пор

Улучшить этот перевод на GitHub