Что такое diff — и почему ИИ показывает минусы и плюсы вместо готового файла

Ты просишь агента поправить одну функцию. Он не присылает новый файл — он присылает странную простыню с минусами, плюсами и решётками. Первая мысль: «покажи уже нормально».
А вот тут неожиданная штука: это и есть «нормально». Более того — это единственное место, где ты можешь поймать ИИ за руку. Новый файл целиком ты пролистаешь по диагонали. Diff — прочитаешь.
Разберёмся, как он устроен. Это десять минут один раз и спокойствие навсегда.
Diff — это рецепт, а не отчёт
Главное недопонимание: люди думают, что diff — это список того, что изменилось. Почти, но нет.
Diff — это инструкция, как из старой версии получить новую. Рецепт. Возьми файл А, убери вот эти строки, вставь вот эти — получишь файл Б.
Разница не философская. Из неё следует всё остальное: почему diff такой короткий, почему его умеют применять программы, и почему в нём нет слова «изменено».
Вот как он выглядит:
@@ -12,7 +12,8 @@ export function getUser(id) {
const res = await fetch(`/api/users/${id}`);
- return res.json();
+ if (!res.ok) throw new Error("user not found");
+ return res.json();
}
Файл может быть на восемьсот строк. В diff попали шесть. Остальные не изменились — а значит, в рецепте им делать нечего.
Как читать: минус, плюс и строки вокруг
Всё держится на первом символе строки. Их ровно три:
-— эту строку убрать. Она была в старой версии.+— эту строку вставить. Она появится в новой.- пробел — строка не менялась. Она здесь просто для того, чтобы ты понял, где в файле происходит дело.
Строки с пробелом называют контекстом. Обычно их показывают по три сверху и снизу — чтобы правка не висела в вакууме.
Теперь строка с решётками, которая всех пугает:
@@ -12,7 +12,8 @@
Читается буквально: «в старом файле — начиная со строки 12, показано 7 строк; в новом — начиная со строки 12, показано 8 строк». Минус — про старую версию, плюс — про новую. Стало на строку больше, потому что добавили две, а убрали одну.
Всё. Больше в базовом diff ничего нет.
Почему «изменённой» строки не бывает
Смотри на пример выше ещё раз. Строка return res.json(); стоит и с минусом, и с плюсом — хотя её текст не поменялся ни на символ.
Так и задумано: у diff нет операции «изменить». Есть только «убрать» и «вставить». Любая правка внутри строки показывается как её удаление плюс вставка новой.
Это важно на практике по двум причинам.
Во-первых, не пугайся объёма. Сотня минусов и сотня плюсов может означать, что в файле сдвинули отступы — а не переписали логику.
Во-вторых, именно поэтому diff так удобно применять машинам. Инструкция без двусмысленностей: убери эти строки, поставь эти. Так работает git apply, так накатываются патчи, и так коммит хранит не копию файла, а разницу между состояниями.
Где ты его встретишь
git diffв терминале — что ты наменял, но ещё не закоммитил.- Pull request на GitHub — там PR целиком показан как diff: зелёное добавили, красное убрали.
- ИИ-редактор — Cursor, Claude Code и прочие перед применением правки показывают ровно его.
И вот здесь — практический payoff, ради которого стоило разбираться.
Когда агент показывает diff, смотри не на плюсы, а на минусы. Плюсы — это то, что ты просил. Минусы — то, что он решил убрать по дороге. Просил добавить проверку ошибки, а в минусах поехал чужой console.log, комментарий или целая ветка if? Значит, агент «прибрался» за тебя без спроса.
Поймать это в готовом файле почти нереально. В diff — видно сразу, потому что удалённое подсвечено отдельно. Если нужен более широкий чеклист — у нас есть разбор, как читать код, написанный ИИ.
Diff и патч — это одно и то же?
Почти. Diff — сам текст различий. Патч — файл с этим текстом, который можно передать и применить командой. Разница как между рецептом, который ты диктуешь вслух, и рецептом, записанным на бумажке.
Почему diff цветной, а в терминале иногда нет?
Цвет добавляет программа, а не формат: - красят красным, + зелёным. Если вывод уходит в файл или по конвейеру, цвета пропадают — символы в начале строк остаются, и читать всё ещё можно.
Обязательно ли знать Git, чтобы читать diff?
Нет. Формат старше и шире Git: его понимают все системы контроля версий и любой редактор с ИИ. Но если хочешь разобраться с самим инструментом — начни с базы про Git.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





