Что такое…

Что такое 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.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →