Приложение А: Что такое индексация изменений (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 тоже есть свод таких правил. Одно из них гласит, что каждая фиксация должна содержать только правки, связанные общей логикой. Например, добавление нового метода - одна правка, устранение бага - другая, удаление комментов третья. Думаю что ответ выше обьясняет, зачем это нужно.