Модуль 8 · Урок 29 із 58

Git model: snapshots, working tree, index і HEAD

Git стає передбачуваним, коли ви перестаєте сприймати його як кнопку «зберегти все». Repository зберігає snapshots, working tree містить поточні файли, index готує наступний snapshot, а HEAD називає commit, від якого ви працюєте.

snapshotsworking treeindexHEAD

Безпечна Git-практика модуля 8

Пакет містить тільки synthetic repository files, локальний Python CLI, tests і read-only history verifier. Не додавайте .git, .env, credentials, персональні або production-дані, machine paths чи зовнішні endpoints.

Завантажити практичний пакет →

Repository — локальна база об’єктів і references

Git зберігає стан проєкту як послідовність snapshots. Commit посилається на tree, parent commit і metadata. Незмінений file content не треба логічно зберігати заново: snapshot може посилатися на вже наявний object. GitHub або інший host не є самим Git — більшість status, diff, commit і history operations працюють локально.

Межа: git init створює repository у поточній теці; git clone отримує repository разом із history та налаштовує remote. Жодна з команд не робить ваші майбутні commits автоматично публічними.

Три області пояснюють більшість команд

ОбластьЩо міститьПитання
Working treeФайли, які зараз бачить editorЩо я змінив відносно index/HEAD?
Index / staging areaТочна версія paths для наступного commitЩо ввійде в snapshot?
Repository / HEADCommitted objects і current referenceВід якого commit я працюю?

Один file може мати staged version і додаткові unstaged edits одночасно. Тому «file staged» не означає, що всі його поточні bytes підуть у commit.

status — інвентар, а не діагноз

git status --short
git status

status порівнює HEAD, index і working tree та показує tracked/untracked/conflicted states. Short format зручний для automation, але дві колонки треба читати окремо: index status і working-tree status. Перед зміною state спершу зафіксуйте цей inventory.

diff відповідає на різні питання

git diff                 # working tree проти index
git diff --staged        # index проти HEAD
git diff HEAD -- src/    # усе поточне проти HEAD для path

Звичайний git diff не показує вже staged changes. Review перед commit має включати щонайменше status і diff --staged. Pathspec звужує inspection, але не повинен приховувати випадково staged unrelated file.

Tracked states не дорівнюють file existence

  • Untracked: file існує у working tree, але Git ще не відстежує його.
  • Modified: tracked content відрізняється від selected comparison area.
  • Staged: version записана в index для наступного commit.
  • Committed: snapshot доступний через commit object.

.gitignore впливає на intentionally untracked files. Він не припиняє tracking file, який уже є в history/index.

Безпечний observation loop

  1. git status --short — перелік paths і states.
  2. git diff — unstaged content.
  3. git diff --staged — candidate snapshot.
  4. git log --oneline --decorate -n 5 — current history/HEAD.
  5. Лише потім state-changing command.
Identitygit rev-parse --show-toplevel.
Branchgit branch --show-current.
Candidategit diff --staged.
Remotegit remote -v, якщо потрібен.

Definition of Done

  • Можете пояснити working tree, index, HEAD без метафори «Git зберіг файл».
  • Розрізняєте diff і diff --staged.
  • Перед commit перевіряєте exact candidate snapshot.
  • Не плутаєте локальний repository із GitHub.
  • Не додаєте untracked secrets «щоб status став чистим».

Методичні джерела

Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Git і GitHub.

Практична перевірка · урок 29 з 47

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Файл змінено, його version додано в index, а потім у working tree зроблено ще одну правку. Що ввійде в commit?
2. Яка пара команд найкраще показує unstaged changes і точний candidate snapshot перед commit?
3. Чому твердження «GitHub зберіг мій commit після git commit» є неправильним у базовому workflow?