Зачем это нужно
В предыдущем уроке мы закрепили правило:
One Task -> One Change
Когда feature разбита на маленькие независимые tasks, появляется соблазн выполнить часть работы параллельно. Например:
- один агент делает backend endpoint;
- второй агент делает UI form;
- третий агент пишет E2E tests;
- четвертый агент делает review.
Если все они работают в одной рабочей директории, результат быстро становится неуправляемым:
- агенты перезаписывают изменения друг друга;
git diffсмешивает несколько задач;- tests запускаются на промежуточном состоянии;
- невозможно понять, кто изменил файл;
- один агент может случайно удалить temporary файлы другого;
- merge conflicts появляются раньше, чем есть commits.
Git worktrees решают эту проблему на уровне файловой системы.
Worktree дает отдельную рабочую директорию для отдельной branch, но использует тот же Git repository storage. Для agentic development это удобно: каждый агент получает собственное место для работы, собственный branch и собственный diff.
Главная мысль урока:
Parallel agents need isolated working trees.
Worktrees give each task its own directory, branch and diff.
Основная идея
Branch изолирует историю. Worktree изолирует рабочую директорию.
Обычный single-agent workflow:
repo/
branch: feature/auth-reset
working tree: one directory
agent: one active editor
Parallel workflow без worktrees:
repo/
branch: feature/auth-reset
working tree: one directory
Agent A edits backend
Agent B edits UI
Agent C edits tests
Здесь все агенты пишут в одно физическое место. Даже если tasks логически независимы, их diffs смешиваются.
Parallel workflow с worktrees:
repo-main/
branch: main
repo-auth-api/
branch: feature/auth-api
Agent A
repo-auth-ui/
branch: feature/auth-ui
Agent B
repo-auth-tests/
branch: test/auth-e2e
Agent C
Теперь каждый агент работает в своей директории. У каждого свой git status, свой git diff, свой test run и свой commit.
Ключевые термины
| Термин | Значение |
|---|---|
| Worktree | Дополнительная рабочая директория, подключенная к тому же Git repository. |
| Main worktree | Основная директория repository, где обычно был сделан git clone. |
| Linked worktree | Дополнительная директория, созданная через git worktree add. |
| Branch isolation | Каждый worktree обычно связан со своей branch. |
| Parallel-ready task | Task, которую можно выполнять независимо от других без постоянной синхронизации. |
| Integration branch | Branch, куда последовательно собирают результаты нескольких worktrees. |
| Merge conflict | Ситуация, когда Git не может автоматически объединить изменения. |
| Shared environment | Ресурсы вне Git, которые могут конфликтовать: ports, DB, cache, .env, services. |
| Worktree cleanup | Удаление worktree после merge или отказа от experiment. |
Branch vs Worktree
Branch - это указатель в истории Git.
Worktree - это directory checkout для branch.
Можно иметь много branches, но в одной обычной working tree одновременно checked out только одна branch.
Worktree позволяет иметь несколько checked out branches одновременно:
Branch feature/auth-api -> directory ../project-auth-api
Branch feature/auth-ui -> directory ../project-auth-ui
Branch test/auth-e2e -> directory ../project-auth-tests
Сравнение:
| Механизм | Что изолирует | Что не изолирует |
|---|---|---|
| Branch | Git history | Рабочую директорию, если branch переключается в одном folder. |
| Worktree | Рабочую директорию и checked-out branch | Shared external resources: DB, ports, caches. |
| Separate clone | Все файлы и Git metadata | Требует больше disk/network, сложнее синхронизировать. |
| Checkpoint | Промежуточное состояние agent edits | Не заменяет branch/commit/review. |
Worktree часто лучше отдельного clone, потому что использует тот же repository storage и быстрее создается.
Схема worktrees для параллельных агентов
main
│
├─ worktree/auth-api
│ branch: feature/auth-api
│ Agent A: backend endpoint
│
├─ worktree/auth-ui
│ branch: feature/auth-ui
│ Agent B: reset form UI
│
└─ worktree/auth-tests
branch: test/auth-e2e
Agent C: E2E regression tests
В виде flow:
Главное: parallel work начинается только после decomposition. Worktrees не исправляют плохой task graph. Они помогают безопасно выполнить уже разделенные tasks.
Базовые команды
Посмотреть worktrees:
git worktree list
Создать worktree с новой branch от main:
git worktree add -b feature/auth-api ../project-auth-api main
Создать worktree для уже существующей branch:
git worktree add ../project-auth-api feature/auth-api
Перейти в worktree:
cd ../project-auth-api
git status --short
git branch --show-current
Удалить worktree после завершения:
git worktree remove ../project-auth-api
Почистить записи о worktrees, которые были удалены вручную:
git worktree prune
Для курса достаточно этих команд.
Где создавать worktrees
Обычно worktrees удобно создавать рядом с основным repository, а не внутри него.
Хорошо:
~/codex/ai-agent-development-101
~/codex/ai-agent-development-101-auth-api
~/codex/ai-agent-development-101-auth-ui
~/codex/ai-agent-development-101-auth-tests
Плохо:
~/codex/ai-agent-development-101/worktrees/auth-api
Вложенные worktrees могут запутать tooling, search, editor и ignore rules. Иногда это допустимо в настроенной команде, но для 101 workflow проще использовать sibling directories.
Naming convention:
<project>-<task-scope>
Примеры:
| Worktree path | Branch | Agent task |
|---|---|---|
../app-auth-api |
feature/auth-api |
Backend API |
../app-auth-ui |
feature/auth-ui |
UI form |
../app-auth-tests |
test/auth-e2e |
E2E tests |
../app-agent-plan-mode |
test/agent-plan-mode |
Agent workflow eval |
../app-docs-git-worktrees |
docs/git-worktrees-lesson |
Docs lesson |
Название должно помогать понять ownership worktree.
Важное ограничение: одна branch в одном worktree
Обычно Git не дает checkout одной и той же branch сразу в двух worktrees.
Это правильно. Иначе два рабочих дерева могли бы независимо менять один branch pointer.
Плохая идея:
Agent A and Agent B both write to feature/auth-reset in two directories.
Лучше:
Agent A -> feature/auth-api
Agent B -> feature/auth-ui
Agent C -> test/auth-e2e
Затем changes интегрируются через PRs или integration branch.
Какие tasks можно выносить в worktrees
Worktree подходит для tasks, которые достаточно независимы.
Хорошие кандидаты:
- backend endpoint после согласованного API contract;
- UI form после согласованного request/response contract;
- tests/evals для уже описанного behavior;
- documentation lesson;
- isolated bug fix;
- refactor в отдельном module;
- tool policy eval;
- skill trigger tests;
- migration planning в read-only/discovery mode.
Плохие кандидаты:
- tasks, которые меняют один и тот же файл;
- tasks без согласованного interface;
- tasks, где один агент постоянно зависит от результата другого;
- broad refactor shared module;
- database schema change, от которого зависят все остальные;
- dependency upgrade, который меняет environment для всех;
- product decision, который еще не принят.
Правило:
Parallel-ready means independent enough to produce separate reviewable diffs.
Parallel-ready checklist
Перед тем как создать worktree для task, проверьте:
[ ] Task имеет один verifiable outcome
[ ] Task имеет свой branch name
[ ] Expected files/areas не пересекаются с другой task
[ ] Shared interface согласован
[ ] Acceptance criteria понятны
[ ] Verification commands определены
[ ] Integration point известен
[ ] Stop conditions указаны
[ ] Агент знает, что не должен менять shared contract без approval
Если хотя бы первые три пункта не выполнены, worktree может создать видимость порядка, но conflict все равно придет.
Worktree plan
Перед параллельной работой полезно написать worktree plan.
Формат:
Base branch:
Integration strategy:
Worktrees:
- path:
branch:
agent:
task:
expected files:
verification:
dependencies:
stop conditions:
Conflict risks:
Merge order:
Пример:
Base branch:
main
Integration strategy:
Merge each task through separate PR into main, then run integration tests.
Worktrees:
- path: ../app-auth-api
branch: feature/auth-reset-api
agent: Agent A
task: Add reset password API endpoint
expected files:
- src/auth/resetPasswordController.ts
- src/auth/resetPasswordService.ts
- tests/auth/resetPassword.api.test.ts
verification:
- npm test -- resetPassword.api
dependencies:
- reset token repository contract exists
stop conditions:
- API contract missing
- schema migration required
- path: ../app-auth-ui
branch: feature/auth-reset-ui
agent: Agent B
task: Add reset password form
expected files:
- web/routes/reset-password.tsx
- web/components/ResetPasswordForm.tsx
- web/components/ResetPasswordForm.test.tsx
verification:
- npm test -- ResetPasswordForm
dependencies:
- API contract from design doc
stop conditions:
- API response contract changes
- path: ../app-auth-e2e
branch: test/auth-reset-e2e
agent: Agent C
task: Add E2E reset password flow
expected files:
- tests/e2e/password-reset.spec.ts
verification:
- npm run test:e2e -- password-reset
dependencies:
- API and UI branches integrated or mocked contract
stop conditions:
- cannot run browser test locally
Conflict risks:
- API contract changes may affect UI and E2E
- test fixtures may overlap
Merge order:
1. API
2. UI
3. E2E
4. integration verification
Такой plan лучше, чем просто запустить трех агентов и надеяться на Git.
Пример: Password Reset backend/ui/tests
Feature:
Password Reset
Разделение:
| Worktree | Branch | Task | Why parallel-ready |
|---|---|---|---|
../app-auth-api |
feature/auth-reset-api |
Endpoint and service | API contract already defined. |
../app-auth-ui |
feature/auth-reset-ui |
Reset form | Can build against documented contract or mock. |
../app-auth-tests |
test/auth-reset-e2e |
E2E scenario | Can be written against expected behavior, may need final integration. |
Но не все можно параллелить.
Если reset token database model еще не согласован, сначала нужна sequential task:
AUTH-010:
Define reset token repository and data model.
Только после этого backend, UI и tests можно разделять.
Worktrees и dependency graph
Из модуля 4:
Большая feature -> task graph -> parallel-ready branches
Worktree - это способ физически выполнить ветви графа.
Если tasks имеют dependency, worktree не отменяет dependency. Он только дает отдельное место для работы.
Worktrees и one task - one change
Каждый worktree должен соответствовать одному task boundary.
Плохо:
../app-auth-api
Agent A:
- backend endpoint
- UI form
- docs rewrite
- dependency upgrade
Хорошо:
../app-auth-api
Agent A:
- backend endpoint only
- API integration tests
- no UI
- no dependency upgrade
Worktree не делает diff маленьким автоматически. Агент все равно должен работать по правилу one task - one change.
Worktrees и dirty working tree
Одна из сильных сторон worktrees: можно оставить dirty work в основной директории и начать новую isolated task рядом.
Сценарий:
Main working tree has user edits in docs.
Need to run agent on auth bug fix.
Вместо того чтобы stash/revert user edits:
git worktree add -b fix/auth-token-reuse ../app-auth-token-reuse main
cd ../app-auth-token-reuse
Теперь агент работает в чистой директории, не трогая user edits в main worktree.
Но важно:
- base branch должна быть правильной;
- незакоммиченные user edits не попадут в новый worktree;
- если agent task зависит от этих edits, нужно сначала сделать commit или patch;
- worktree не синхронизирует dirty changes между директориями.
Worktree изолирует, но не телепортирует незакоммиченную работу.
Shared environment: чего worktree не изолирует
Worktree изолирует files и branch. Но многое остается общим.
| Resource | Risk |
|---|---|
| Local database | Agents overwrite each other's data or migrations. |
| Ports | Two dev servers try to use 3000. |
| Cache | Build/test cache becomes stale or contaminated. |
.env |
Different tasks need different flags or credentials. |
| Background services | One agent restarts service used by another. |
| Package manager cache | Usually OK, but install can change local state. |
| Browser session | UI tests may share cookies/storage. |
| Docker containers | Container names and volumes can collide. |
| Generated artifacts outside repo | Agents overwrite outputs. |
Therefore:
Worktree isolation is filesystem and branch isolation, not full environment isolation.
Для параллельных агентов нужно также планировать environment isolation.
Environment plan для worktree
Для каждого worktree полезно указать:
Port:
Database:
Env file:
Test command:
Background services:
Generated outputs:
Cleanup:
Пример:
Worktree: ../app-auth-ui
Branch: feature/auth-reset-ui
Port: 3002
Database: not needed, use mocked API
Env file: .env.local copied from template, no secrets committed
Test command: npm test -- ResetPasswordForm
Background services: none
Generated outputs: playwright screenshots in tmp/auth-ui
Cleanup: remove tmp screenshots after review
Для backend:
Worktree: ../app-auth-api
Branch: feature/auth-reset-api
Port: 3001
Database: app_auth_api_test
Env file: .env.test
Test command: npm test -- resetPassword.api
Background services: postgres test container
Generated outputs: none
Cleanup: drop app_auth_api_test after task
Если environment не изолирован, параллельность может дать странные failures.
Prompt для агента в worktree
Каждый агент должен знать, что он работает в отдельном worktree и какую task выполняет.
Prompt:
You are working in a dedicated Git worktree.
Worktree:
../app-auth-api
Branch:
feature/auth-reset-api
Task:
AUTH-012: Add reset password API endpoint.
In scope:
- backend controller/service
- API integration test
Out of scope:
- UI form
- E2E browser flow
- dependency updates
- reset token data model changes unless blocking
Rules:
- inspect git status before edits;
- keep diff scoped to this task;
- do not touch files owned by other worktrees unless required and explained;
- stop if API contract changes;
- do not commit until asked;
- report changed files and verification evidence.
Для UI worktree:
You are working in a dedicated Git worktree.
Branch:
feature/auth-reset-ui
Task:
AUTH-016: Add reset password form using the documented API contract.
Assume API contract:
POST /reset-password
Request: token, newPassword
Responses: success, TOKEN_EXPIRED, TOKEN_ALREADY_USED
Do not modify backend code.
If the contract is insufficient, stop and ask.
Такой prompt предотвращает "я поправил API заодно".
Как запускать несколько агентов
Для каждого агента:
1. Создать worktree.
2. Перейти в его directory.
3. Проверить branch/status.
4. Передать агенту task boundary.
5. Запустить agent workflow.
6. Получить diff, tests, final evidence.
7. Сделать commit или PR.
8. Интегрировать в нужном порядке.
Не нужно давать всем агентам один общий prompt "сделайте password reset". Это снова one-shot, только распределенный.
Параллельность должна следовать task graph.
Integration после параллельной работы
Параллельные worktrees не дают итоговую feature автоматически. Их изменения нужно интегрировать.
Варианты:
| Strategy | Когда подходит |
|---|---|
| Separate PRs into main | Tasks independent and can merge one by one. |
| Integration branch | Нужно собрать несколько branches перед merge в main. |
| Sequential merge order | Есть dependency order: API before UI before E2E. |
| Rebase each branch on updated main | Нужно обновить branch после merge соседних tasks. |
Для курса проще:
1. Merge/review API branch.
2. Update UI branch from main.
3. Merge/review UI branch.
4. Update E2E branch from main.
5. Run full integration tests.
Или:
1. Create integration branch from main.
2. Merge API branch.
3. Merge UI branch.
4. Merge E2E branch.
5. Resolve conflicts.
6. Run integration verification.
7. Open PR from integration branch.
Выбор зависит от команды и размера feature.
Integration branch
Integration branch полезна, когда отдельные branches должны быть проверены вместе до merge.
Пример:
git switch main
git pull
git switch -c integration/password-reset
git merge feature/auth-reset-api
git merge feature/auth-reset-ui
git merge test/auth-reset-e2e
После этого:
npm test -- auth
npm run test:e2e -- password-reset
npm run typecheck
Integration branch не должна становиться местом новой разработки. Ее задача:
- собрать готовые changes;
- resolve conflicts;
- запустить integration verification;
- подготовить PR или merge plan.
Если во время integration обнаружен bug, лучше исправить его в owning branch или создать отдельную integration-fix task.
Merge conflicts
Worktrees уменьшают смешивание diffs, но не отменяют conflicts.
Conflicts вероятны, если agents:
- меняют один и тот же файл;
- меняют рядом стоящие imports;
- меняют shared types;
- меняют dependency lockfile;
- меняют generated clients;
- меняют snapshots;
- меняют route configuration;
- меняют schema/migrations.
Conflict не всегда плохо. Он просто говорит:
Git cannot safely decide how to combine these changes.
Human or reviewer agent must inspect.
После conflict resolution обязательно:
- review resolved files;
- проверить, не потеряны ли changes одной branch;
- запустить tests обеих задач;
- запустить integration tests.
Нельзя считать conflict resolution простой mechanical operation, особенно с agent-generated code.
Conflict risk table
| Shared file/type | Risk | Mitigation |
|---|---|---|
| API types | UI and backend disagree | Freeze contract first, generate client in integration step. |
| Route config | Two features add routes | Merge manually, run route tests. |
| DB migrations | Ordering conflicts | Name migrations carefully, run migration apply test. |
| Lockfile | Dependency updates collide | Separate dependency tasks. |
| Snapshot files | Baseline overwritten | Require visual evidence. |
| Test fixtures | Agents alter shared setup | Use local fixtures or coordinate fixture owner. |
| Project config | Tooling behavior changes | Avoid config changes in parallel feature tasks. |
| Documentation index | Multiple docs tasks edit same table | Assign one docs integration task. |
Если conflict risk высокий, parallel work может не стоить coordination cost.
Когда worktree не нужен
Worktree полезен, но не обязателен для каждой task.
Не нужен, если:
- работает один агент;
- task маленькая и sequential;
- working tree clean;
- нет параллельной работы;
- нет риска смешать user changes;
- feature требует строгого sequential order;
- setup cost выше пользы.
Пример:
Write one Markdown lecture in one file.
Один обычный branch и diff вполне достаточны.
Worktree особенно полезен, когда:
- нужно запустить несколько agents;
- есть dirty worktree, который нельзя трогать;
- нужно сравнить альтернативные approaches;
- нужно держать long-running branch рядом с текущей работой;
- нужно запустить разные dev servers или tests параллельно;
- нужно изолировать spike от implementation.
Worktrees для альтернативных подходов
Иногда не нужно параллелить feature tasks, а нужно сравнить два solutions.
Пример:
Option A: enforce Plan Mode in prompt/rule layer
Option B: enforce Plan Mode in tool permission layer
Можно создать:
git worktree add -b spike/plan-mode-prompt ../app-plan-mode-prompt main
git worktree add -b spike/plan-mode-tool-gate ../app-plan-mode-tool-gate main
Каждый агент исследует один approach.
Важно:
- spike branches должны быть явно помечены;
- не merge оба approaches случайно;
- после выбора approach создать clean implementation task;
- spike output может быть design note, not production diff.
Worktrees хорошо поддерживают exploration, если вы не путаете exploration с deliverable.
Worktrees и checkpoints
Worktree и checkpoint решают разные задачи.
| Механизм | Для чего |
|---|---|
| Worktree | Изолировать рабочую директорию и branch для task/agent. |
| Commit | Сохранить reviewable change в Git history. |
| Checkpoint | Сохранить промежуточное состояние agent session/edits. |
| Stash | Временно убрать local changes. |
Worktree не заменяет commit.
Checkpoint не заменяет worktree.
Пример:
Agent works in ../app-auth-api.
Inside that worktree, agent tool may create checkpoints after each edit.
Final useful state still becomes Git commit on feature/auth-api.
Следующий урок будет как раз про checkpoints.
Cleanup после worktree
После merge или отказа от task worktree нужно убрать.
Проверка:
cd ../app-auth-api
git status --short
git branch --show-current
Если все committed/merged или changes больше не нужны:
cd ../ai-agent-development-101
git worktree remove ../app-auth-api
git worktree prune
Если worktree dirty, git worktree remove может отказать. Это хорошо: Git защищает local changes.
Не удаляйте directory вручную без понимания состояния. Сначала проверьте:
git worktree list
И решите:
- commit;
- move patch;
- discard with approval;
- keep worktree;
- remove.
Worktree safety rules
1. One worktree per task branch.
2. One agent writes in one worktree.
3. Do not let two agents write same branch.
4. Do not create worktrees inside the main repo by default.
5. Each worktree has explicit task boundary.
6. Each worktree has verification commands.
7. Shared environment must be planned.
8. Integration happens intentionally, not by copying files.
9. Cleanup only after status is understood.
10. Worktree does not replace tests, review or commits.
Эти правила простые, но сильно снижают хаос в multi-agent development.
Пример 1. Worktree plan для backend/ui/tests
Feature:
Password Reset
Base:
main
Worktree plan:
| Worktree | Branch | Agent | Task | Verification |
|---|---|---|---|---|
../app-auth-api |
feature/auth-reset-api |
Agent A | API endpoint | API integration tests |
../app-auth-ui |
feature/auth-reset-ui |
Agent B | Reset form | Component tests |
../app-auth-e2e |
test/auth-reset-e2e |
Agent C | Browser flow | E2E reset test |
Conflict risks:
| Risk | Mitigation |
|---|---|
| UI depends on API response shape | Freeze API contract in design doc. |
| E2E depends on API + UI | Write E2E after API/UI merge or use mock until integration. |
| Shared test fixtures | Assign fixture owner or keep task-local fixtures. |
| Route config changes | Merge UI branch before E2E. |
Merge order:
1. feature/auth-reset-api
2. feature/auth-reset-ui
3. test/auth-reset-e2e
4. integration verification
Пример 2. Worktree для dirty main
Ситуация:
Main worktree:
- user is editing docs
- urgent bug fix needed in auth
Status:
M docs/course-outline.md
M guide/content_plan.md
Не нужно делать stash автоматически. Можно создать отдельный worktree:
git worktree add -b fix/auth-permission ../app-fix-auth-permission main
cd ../app-fix-auth-permission
Теперь urgent fix идет рядом:
../ai-agent-development-101
user docs work
../app-fix-auth-permission
agent bug fix branch
После fix:
- review diff in bug fix worktree;
- run tests;
- commit;
- PR/merge;
- remove worktree;
- user docs work в main worktree не тронут.
Пример 3. Worktree для reviewer agent
Reviewer agent лучше запускать в clean state.
Scenario:
Implementer branch:
feature/auth-reset-api
Создать review worktree:
git worktree add ../app-review-auth-api feature/auth-reset-api
cd ../app-review-auth-api
Reviewer prompt:
Review this branch as a reviewer agent.
Inputs:
- task spec: AUTH-012
- diff against main
- relevant code/tests
Do not edit files unless explicitly asked.
Focus on:
- bugs;
- missing tests;
- scope creep;
- security issues;
- verification gaps.
Почему отдельный worktree полезен:
- reviewer не мешает implementer;
- можно запускать tests независимо;
- review идет по branch state;
- не смешиваются local edits.
Если reviewer должен предложить patch, лучше сделать отдельную branch или явно разрешить edits.
Пример 4. Worktree для AI Agent evals
Task:
AGENT-WF-01:
Plan Mode must not edit files.
Можно параллелить:
| Worktree | Task |
|---|---|
../app-agent-policy |
Implement mode guard |
../app-agent-evals |
Add workflow evals |
../app-agent-docs |
Document Plan/Act policy |
Но есть risk:
evals depend on policy names and tool trace format.
Поэтому нужен shared contract:
Mode:
plan
Forbidden tools:
- apply_patch
- file write commands
- dependency install
- migration execution
Expected output:
- implementation plan
- no claim of completion
Если contract не согласован, сначала отдельная sequential task:
Define Plan Mode tool policy contract.
Только потом worktrees.
Prompt-шаблоны для worktree orchestration
Prompt 1. Составить worktree plan
Create a Git worktree plan for this feature.
Input:
<feature/task graph>
Output:
- base branch;
- candidate parallel tasks;
- worktree path;
- branch name;
- assigned agent role;
- expected files;
- verification commands;
- dependencies;
- conflict risks;
- merge order;
- tasks that must remain sequential.
Prompt 2. Запустить агента в worktree
You are working in a dedicated Git worktree.
Worktree path:
<path>
Branch:
<branch>
Task:
<task>
Rules:
- inspect git status before edits;
- work only on this task;
- do not modify files assigned to other worktrees;
- do not change shared contracts without stopping;
- run verification for this task;
- report diff summary and evidence;
- do not commit until asked.
Prompt 3. Проверить worktree перед integration
Review this worktree before integration.
Check:
- branch name;
- git status;
- diff against base;
- whether changed files match task;
- tests/evals run;
- not-run checks;
- residual risks;
- conflict risk with other branches.
Do not merge yet.
Prompt 4. Integration review
Integrate these branches in order:
1. <branch A>
2. <branch B>
3. <branch C>
For each merge:
- inspect diff;
- resolve conflicts carefully;
- run tests relevant to both merged branches;
- stop if public contract changes unexpectedly.
After all merges:
- run integration verification;
- report conflicts, resolutions, commands/results and residual risks.
Команды в одном сценарии
Пример setup:
git switch main
git pull
git worktree add -b feature/auth-reset-api ../app-auth-api main
git worktree add -b feature/auth-reset-ui ../app-auth-ui main
git worktree add -b test/auth-reset-e2e ../app-auth-e2e main
git worktree list
Agent A:
cd ../app-auth-api
git status --short
Agent B:
cd ../app-auth-ui
git status --short
Agent C:
cd ../app-auth-e2e
git status --short
После работы:
cd ../app-auth-api
git diff --stat main...HEAD
Интеграция:
cd ../ai-agent-development-101
git switch main
git pull
git switch -c integration/password-reset
git merge feature/auth-reset-api
git merge feature/auth-reset-ui
git merge test/auth-reset-e2e
Cleanup:
git worktree remove ../app-auth-api
git worktree remove ../app-auth-ui
git worktree remove ../app-auth-e2e
git worktree prune
Команды показаны как workflow sketch. В реальном проекте merge может идти через PRs.
Review checklist для каждого worktree
Перед commit/PR из worktree:
[ ] Branch name matches task
[ ] git status понятен
[ ] Diff focused on one task
[ ] Changed files match expected scope
[ ] No unrelated refactor
[ ] No dependency/lockfile change without approval
[ ] Tests/evals run for this task
[ ] Not-run checks documented
[ ] Shared contract changes documented
[ ] Conflict risks reported
[ ] Commit message tied to task
Перед integration:
[ ] Merge order defined
[ ] All branches have clean commits
[ ] Base branch updated
[ ] API/contracts stable
[ ] Conflict-prone files identified
[ ] Tests from each task known
[ ] Integration tests planned
[ ] Rollback plan exists
Типичные ошибки
| Ошибка | Симптом | Исправление |
|---|---|---|
| Несколько агентов в одной working tree | Mixed diff, lost edits, unclear ownership | One worktree per agent/task. |
| Worktree без task boundary | Агент меняет все подряд | Передать scope, expected files, stop conditions. |
| Параллелят dependent tasks | UI ломается из-за меняющегося API | Сначала freeze contract или выполнить sequential task. |
| Один branch в нескольких местах | Confusing branch ownership | One branch per worktree. |
| Shared DB без изоляции | Tests влияют друг на друга | Separate test DB/schema/container. |
| Shared port | Dev server conflict | Назначить ports заранее. |
| Dependency update в одной ветке ломает другие | Inconsistent environment | Separate dependency task and rebase/update branches. |
| Integration без tests | Branches merge, feature не работает вместе | Run integration verification. |
| Conflict resolution вслепую | Потеря changes одной branch | Review resolved files and run both test sets. |
| Worktree удален вручную | Git metadata stale | Use git worktree remove and prune. |
| Worktree воспринимается как checkpoint | Нет reviewable commit | Commit useful result separately. |
Практика 1. Создать worktree plan
Feature:
Password Reset
Task graph:
AUTH-010: reset token repository
AUTH-012: request reset endpoint
AUTH-013: reset password endpoint
AUTH-016: reset password UI form
AUTH-020: password reset E2E flow
AUTH-021: docs for reset token states
Заполните:
| Task | Parallel-ready? | Worktree | Branch | Agent | Dependencies | Verification |
|---|---|---|---|---|---|---|
| AUTH-010 | ||||||
| AUTH-012 | ||||||
| AUTH-013 | ||||||
| AUTH-016 | ||||||
| AUTH-020 | ||||||
| AUTH-021 |
Укажите:
Base branch:
Integration strategy:
Merge order:
Conflict risks:
Environment risks:
Практика 2. Найти tasks, которые нельзя параллелить
Список tasks:
1. Change reset token DB schema.
2. Implement API using the new schema.
3. Build UI using documented API contract.
4. Add E2E test for full reset flow.
5. Update password policy rules.
6. Update docs table for reset token states.
Ответьте:
- какие tasks должны идти sequential;
- какие можно делать в worktrees;
- какой shared contract нужен до UI;
- какая task должна быть integration point;
- какие tasks лучше вынести из feature scope.
Возможный вывод:
Sequential:
1 -> 2, because API depends on schema.
4 after 2 and 3, because E2E depends on API + UI.
Parallel-ready:
3 can start after API contract is documented.
6 can start after token state semantics are agreed.
Out of scope:
5 password policy rules, unless feature explicitly includes it.
Практика 3. Написать prompt для агента в worktree
Worktree:
../app-agent-evals
Branch:
test/bugfix-agent-regression-flow
Task:
BUGAGENT-03:
Bug-fix agent must add failing regression test before fix when practical.
Напишите prompt, где будут:
- worktree path;
- branch;
- in scope;
- out of scope;
- expected files;
- verification;
- stop conditions;
- final evidence format.
Checklist: готов ли task к worktree
[ ] Task маленькая
[ ] Task имеет one change
[ ] Branch name выбран
[ ] Worktree path выбран
[ ] Base branch указан
[ ] Dependencies понятны
[ ] Shared contracts стабильны
[ ] Expected files названы
[ ] Verification commands названы
[ ] Environment risks учтены
[ ] Integration order известен
Критерии готовности
После урока студент должен уметь:
- объяснить, что такое Git worktree;
- отличить branch от worktree;
- создать worktree для новой branch;
- посмотреть список worktrees;
- удалить worktree после завершения;
- решить, какие tasks parallel-ready;
- составить worktree plan;
- дать агенту task boundary внутри worktree;
- учесть shared environment risks;
- спланировать integration branch или PR sequence;
- распознать merge conflict risks;
- объяснить, почему worktree не заменяет tests, commits и review.
Краткое резюме
Git worktree - это отдельная рабочая директория для отдельной branch, подключенная к тому же repository.
В agentic development worktrees нужны, чтобы:
- изолировать параллельных агентов;
- не смешивать diffs;
- защитить dirty user work;
- запускать independent tasks рядом;
- сравнивать alternative approaches;
- готовить clean review для каждой branch.
Главная цепочка:
Task graph
-> parallel-ready tasks
-> one worktree per task
-> one agent per worktree
-> one change per branch
-> integration verification
Worktree не заменяет task decomposition. Он работает только тогда, когда tasks уже разделены и имеют понятные boundaries.
Worktree также не изолирует everything: ports, databases, caches, .env, containers и browser sessions нужно планировать отдельно.
Вопросы для самопроверки
- Чем branch отличается от worktree?
- Почему нельзя безопасно запускать нескольких агентов в одной working tree?
- Какие признаки говорят, что task parallel-ready?
- Какие shared environment risks остаются даже при использовании worktrees?
- Когда лучше использовать integration branch?
Что дальше
В следующем уроке мы разберем checkpoints. Worktree изолирует рабочую директорию и branch, commit сохраняет reviewable change, а checkpoint помогает вернуть промежуточное состояние agent session. Важно понять, где checkpoint действительно полезен, а где он создает ложное чувство безопасности и не заменяет нормальный Git workflow.