Working tree (рабочее дерево, также «рабочая копия») - это просто
файлы проекта в том виде, в котором ты их видишь и редактируешь.
Git к ним не привязан напрямую: он лежит рядом в .git/ и
наблюдает.
Что значит «отслеживается»
Любой файл в рабочем дереве находится в одном из четырёх состояний с точки зрения Git:
- Untracked - файл существует на диске, но Git о нём ничего не знает. Никогда не попадал ни в индекс, ни в коммит.
- Tracked, unmodified - файл есть в репозитории (в последнем коммите), на диске идентичен этому коммиту.
- Tracked, modified - файл есть в репозитории, но на диске отличается от того, что в HEAD.
- Tracked, staged - изменения файла попали в индекс через
git add, готовы к коммиту.
Файл может быть одновременно staged и modified: ты застейджил одну
правку, потом сделал ещё одну. Тогда git status покажет файл в
обоих разделах одновременно.
Чистая working tree
«Чистое» рабочее дерево означает: нет ни modified, ни staged, ни
untracked файлов. git status пишет:
nothing to commit, working tree clean
Это важное состояние. Многие команды (например, git pull или
git switch) могут отказаться работать, если рабочее дерево
«грязное» и операция привела бы к перезаписи изменений.
Чтобы быстро довести working tree до чистого состояния:
- закоммитить правки (
git add+git commit), - отложить их (
git stash), - выбросить их (
git restore <file>илиgit reset --hard).
.gitignore и рабочее дерево
Файлы из .gitignore физически лежат в рабочем дереве, но Git их
не показывает как untracked и не предлагает добавить. Удобно для
билд-артефактов, локальных конфигов, IDE-метаданных.
Проверить, почему конкретный файл игнорируется:
git check-ignore -v <file>
# .gitignore:5:node_modules/ node_modules/main.js
Подводные камни
- Working tree - это не одно и то же, что checkout. Чекаут - это операция (заменить состояние working tree содержимым другого коммита). Working tree - само состояние.
- В bare-репозиториях (
git init --bare) working tree нет вообще - есть только содержимое
.git/. Используется для серверной стороны git push/fetch. - При переключении ветки Git переписывает рабочее дерево
содержимым целевого коммита. Несохранённые правки могут
помешать -
git stashперед переключением спасает.