# Working tree _Основы Git · GitLab Knowledge Base_ **TL;DR:** Файлы и директории твоего проекта на диске - те, которые ты открываешь в редакторе. Одна из трёх зон Git наряду с индексом ([[add]]) и репозиторием ([[commit]]). Working tree (рабочее дерево, также «рабочая копия») - это просто файлы проекта в том виде, в котором ты их видишь и редактируешь. Git к ним не привязан напрямую: он лежит рядом в `.git/` и наблюдает. ## Что значит «отслеживается» Любой файл в рабочем дереве находится в одном из четырёх состояний с точки зрения Git: 1. **Untracked** - файл существует на диске, но Git о нём ничего не знает. Никогда не попадал ни в индекс, ни в коммит. 2. **Tracked, unmodified** - файл есть в репозитории (в последнем коммите), на диске идентичен этому коммиту. 3. **Tracked, modified** - файл есть в репозитории, но на диске отличается от того, что в HEAD. 4. **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 ` или `git reset --hard`). ## .gitignore и рабочее дерево Файлы из `.gitignore` физически лежат в рабочем дереве, но Git их не показывает как untracked и не предлагает добавить. Удобно для билд-артефактов, локальных конфигов, IDE-метаданных. Проверить, почему конкретный файл игнорируется: ```bash git check-ignore -v # .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` перед переключением спасает. ## Команды ```bash git status ``` Показывает состояние всех трёх зон, включая working tree ```bash git diff ``` Разница между working tree и индексом (что не застейджено) ```bash git restore ``` Откатить файл в working tree до состояния индекса ```bash git clean -fd ``` Удалить untracked файлы и пустые директории (осторожно!) ## См. также - [git add](/courses/git/kb/add.md) - [Commit](/courses/git/kb/commit.md) - [git status](/courses/git/kb/status.md) - [Система контроля версий](/courses/git/kb/vcs.md)