У Git файл проходить три місця:
| Місце | Що там | Команда, що переносить далі |
|---|---|---|
| робочий каталог | файли, які ви редагуєте | git add |
| індекс (staging area) | знімок, яким буде наступний коміт | git commit |
| репозиторій | збережені коміти | - |
Індекс - це чернетка наступного коміту. git commit записує не «всі змінені файли», а саме те, що лежить в індексі.
git add app/Models/User.php # додати файл в індекс
git add . # усі зміни в поточному каталозі
git status # що в індексі, що змінено, що не відстежується
git commit -m "Add email verification"
Навіщо цей проміжний крок:
- логічні коміти: за день змінено десять файлів, але це дві різні задачі. В індекс додаються файли першої задачі - коміт, потім другої - ще один коміт;
- контроль: перед комітом видно, що саме потрапить в історію (
git diff --staged), і випадковийdd()чи налагоджувальний файл не проскочать; - частини файлу:
git add -pдодає в індекс лише вибрані фрагменти змін.
Важлива деталь: індекс зберігає вміст файлу на момент git add. Якщо після add файл змінити ще раз, у коміт піде стара версія, а нові зміни залишаться в робочому каталозі - git status покаже файл одночасно в двох секціях.
Прибрати з індексу, не втрачаючи змін у файлі:
git restore --staged app/Models/User.php
git commit -a додає в індекс усі зміни вже відстежуваних файлів і комітить їх одним кроком. Нові файли він не підхоплює - їх треба додати через git add явно.