Семантический дифф
Чистое переименование выглядит в построчном диффе как удалённый целиком файл и добавленный целиком файл. Формально это правда и совершенно бесполезно.
Над каждым диффом файла 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 КБ.
Честные ограничения
- Переименование, у которого изменилось и тело, показывается как переименование и прямо об этом сообщает.
- Две однострочные функции, которые случайно похожи друг на друга, не сопоставляются: ниже порога по размеру совпадение должно быть почти точным, так что вы получите честные «удалено + добавлено» вместо выдуманного переименования.
- Символы, которые уехали на несколько строк только потому, что что-то выше них подросло, не помечаются как «перемещённые» — иначе настоящие перемещения утонули бы.
См. также: Просмотр диффов · Что изменилось с тех пор