Update SKILL.md to clarify the process for merging branches and managing worktrees
- Revised instructions for merging branches into `main`, emphasizing the importance of removing worktrees before merging. - Added detailed steps for acquiring a merge lock and checking the main branch status prior to merging. - Clarified the conditions under which orphaned branches and worktrees are cleaned up. - Enhanced the final report requirements to include the status of the branch and worktree after completion.
This commit is contained in:
@@ -107,35 +107,91 @@ git worktree add <путь-в-scratchpad>/wt-phase-25 phase/25-golden-fixtures
|
||||
Не смог закрыть пункт — оставь ⬜ и напиши в отчёте, что именно не вышло и почему. Полработы с
|
||||
честной пометкой лучше, чем ✅ с дырой: следующее ревью её всё равно найдёт, только дороже.
|
||||
|
||||
## Кто убирает ветку
|
||||
## Слить в main и убрать ветку
|
||||
|
||||
Ты — нет. Ветка это твой результат: пока её не слили, удалять нечего.
|
||||
Фаза не считается сданной, пока лежит на ветке. Доводишь до `main` сам, тем же запуском.
|
||||
|
||||
Порядок такой:
|
||||
Сливать можно **только в основном дереве**: `main` уже занят им, и во второй worktree его не
|
||||
взять — git прямо откажет. А раз дерево одно на всех агентов, слияния надо выстроить в очередь.
|
||||
|
||||
1. Ты убираешь **worktree** — сразу, как закончил: `git worktree remove --force <путь>`. Пока
|
||||
worktree держит ветку, её нельзя ни слить нормально, ни удалить.
|
||||
2. Пользователь сливает ветку и удаляет её: `git branch -d phase/25-golden-fixtures`. С `-d`, а не
|
||||
`-D`: git откажется, если что-то не слито, и это правильная защита.
|
||||
3. Ветку забыли удалить — её уберёт следующий запуск скилла, но **только при двух условиях сразу**:
|
||||
фаза стоит ✅ в `README.md` **и** ветка слита в `main`.
|
||||
**1. Убери свой worktree.** Пока он держит ветку, слияние и удаление невозможны.
|
||||
|
||||
```bash
|
||||
git worktree remove --force <путь-в-scratchpad>/wt-phase-25
|
||||
```
|
||||
|
||||
**2. Возьми замок слияния** — той же уловкой, что и заявку на фазу:
|
||||
|
||||
```bash
|
||||
git branch merge/lock
|
||||
```
|
||||
|
||||
Упало «already exists» — сливает другой агент. Подожди и повтори; не лезь в дерево, пока замок
|
||||
чужой. Замок снимается `git branch -D merge/lock` **на всех путях**, включая неудачные: забытый
|
||||
замок остановит остальных.
|
||||
|
||||
**3. Проверь основное дерево, прежде чем трогать.** Оно должно быть на `main` и чистым:
|
||||
|
||||
```bash
|
||||
git -C <корень> status --porcelain
|
||||
```
|
||||
|
||||
Непусто — там работает человек или соседний агент. **Ничего не сливай**, сними замок и скажи об
|
||||
этом в отчёте. Чужие незакоммиченные правки дороже твоей ветки.
|
||||
|
||||
**4. Слей явным коммитом слияния:**
|
||||
|
||||
```bash
|
||||
git -C <корень> merge --no-ff phase/25-golden-fixtures
|
||||
```
|
||||
|
||||
`--no-ff` — чтобы фаза осталась видимой в истории одним куском, а не растворилась в линии.
|
||||
|
||||
**5. Конфликты разрешай только те, что понимаешь.** Почти всегда это строка статуса в
|
||||
`docs/phases/README.md` — там обе стороны правы, надо оставить обе. Конфликт в коде, смысл
|
||||
которого тебе неясен, — `git merge --abort`, снять замок, оставить ветку и написать в отчёте, с
|
||||
чем именно она не сходится.
|
||||
|
||||
**6. Перепрогони тесты на `main` после слияния.** Две зелёные ветки в сумме бывают красными:
|
||||
каждая правила своё, а вместе получилось не то. Это единственный способ поймать такое.
|
||||
|
||||
Красно — откати слияние и оставь ветку жить:
|
||||
|
||||
```bash
|
||||
git -C <корень> reset --hard ORIG_HEAD
|
||||
```
|
||||
|
||||
**7. Зелено — удали ветку и сними замок:**
|
||||
|
||||
```bash
|
||||
git -C <корень> branch -d phase/25-golden-fixtures
|
||||
git branch -D merge/lock
|
||||
```
|
||||
|
||||
`-d`, а не `-D`: git откажется удалять неслитое, и это последняя защита от потери работы.
|
||||
|
||||
**Не пушь.** Удалёнка есть, но отправка — решение пользователя; делай только если попросили прямо.
|
||||
|
||||
**Осиротевшее.** Ветку когда-то забыли удалить — уберёт следующий запуск, но **только при двух
|
||||
условиях сразу**: фаза стоит ✅ в `README.md` **и** ветка слита в `main`.
|
||||
|
||||
```bash
|
||||
git branch --merged main --list "phase/*" --format="%(refname:short)"
|
||||
```
|
||||
|
||||
Оба условия обязательны, и вот почему: только что созданная ветка ещё не имеет коммитов, а значит
|
||||
равна `main` и в этот список попадает. Удалить её по одной «слитости» — снести чужую только что
|
||||
равна `main` и в этот список попадает. Удалять по одной «слитости» — снести чужую только что
|
||||
взятую фазу. Статус ✅ и есть то, что отличает доделанное от начатого.
|
||||
|
||||
Осиротевшие worktree (агент умер, каталог остался) подчищаются `git worktree prune` — это
|
||||
безопасно, записи о несуществующих каталогах и так мусор.
|
||||
Каталоги умерших агентов подчищаются `git worktree prune` — записи о несуществующих worktree и так
|
||||
мусор.
|
||||
|
||||
## Границы
|
||||
|
||||
- **Только своя фаза.** Заметил проблему в соседней — строкой в отчёт, не в диф. Реализация,
|
||||
которая походя переписала полпроекта, невозможна к просмотру глазами.
|
||||
- **Не сливай ветку.** Слияние и порядок веток — решение пользователя, у него их несколько.
|
||||
- **Сливаешь только свою ветку** и только по порядку из «Слить в main и убрать ветку». Чужие ветки
|
||||
не сливаешь, даже если они выглядят готовыми.
|
||||
- **Не переставляй чужие статусы** в `README.md` и не трогай чужие 🔄.
|
||||
- **Не меняй молча** версию протокола, форму сейва и публичное поведение API — даже когда это
|
||||
очевидно правильно. Если фаза этого требует, так и написано в её задачах.
|
||||
@@ -179,7 +235,8 @@ git branch --merged main --list "phase/*" --format="%(refname:short)"
|
||||
- какие тесты добавлены, списком по одной строке;
|
||||
- чем подтверждено: что прогнал и с каким результатом, числа замеров, если были;
|
||||
- что осталось незакрытым и почему;
|
||||
- что замечено за границами фазы.
|
||||
- что замечено за границами фазы;
|
||||
- слита ли ветка в `main` и удалена ли — а если нет, то что помешало.
|
||||
|
||||
Ветку не сливаешь и не удаляешь — она и есть результат. Worktree за собой убираешь, иначе ветку
|
||||
не получится ни слить, ни удалить.
|
||||
Итог запуска — фаза в `main`, ветка удалена, worktree убран, замок снят. Всё, что осталось от
|
||||
работы, — это коммиты и отчёт.
|
||||
|
||||
Reference in New Issue
Block a user