Используем Гит

Приложение А: Что такое индексация изменений (stage changes) и зачем оно нужно

перевод из StackOverflow

Вопрос

Я только осваиваю системы контроля версий. Я понимаю, что «фиксация»(коммит) — это, по сути, создание резервной копии при обновлении новой «текущей» версии проекта.

Чего я не понимаю, так это того, что такое staging с практической точки зрения. Является ли staging чем-то, что существует только номинально, например по традиции, или оно служит какой-то цели? Когда вы совершаете коммит, он все равно будет учитывать все, верно?

Ответ

Когда вы выполняете коммит, он фиксирует только изменения в индексе («staged» файлы). У этого есть множество применений, но наиболее очевидным является разбиение рабочих изменений на более мелкие, автономные части.
Допустим, при работе над кодом новой функции в файле function.cpp вы заметили ошибку в основном коде в main.cpp. Вы можете зафиксировать только это исправление, попросив git добавить в индекс только этот файл (или даже добавить только часть файла опцией git add -p (b707 - не спрашивайте что это, не слышал о таком :)), а когда закончите редактировать функцию - зафиксировать добавления отдельным коммитом.
Теперь, если с функцией что-то пойдет не так - вы сможете отменить ее добавление, не отменяя исправление бага в main.cpp, который вы исправили отдельным коммитом.
Если вы используете git commit -a, вы просто принудительно добавляете все прямо перед фиксацией.

Вы также можете использовать staged файлы как промежуточную рабочую копию с помощью опции --cached для многих команд. Например, git diff --cached покажет вам, чем staged changes отличаются от HEAD(последнего сделанного коммита), чтобы вы могли видеть, что вы собираетесь зафиксировать, не смешивая это с другими изменениями в проекте.

b707 - небольшое добавление
Точно также как в программировании существуют “правила хорошего тона” при написании программ - например использовать “говорящие” имена переменных и не использовать “магичесие числа” - в Git тоже есть свод таких правил. Одно из них гласит, что каждая фиксация должна содержать только правки, связанные общей логикой. Например, добавление нового метода - одна правка, устранение бага - другая, удаление комментов третья. Думаю что ответ выше обьясняет, зачем это нужно.

2 лайка