migrations

This commit is contained in:
Rorik Star Platinum 2025-11-22 17:48:07 +03:00
parent d1b0670d71
commit f2b07c9f30
57 changed files with 2970 additions and 1 deletions

View file

@ -0,0 +1,90 @@
# Jujutsu: Применение исправлений из stable во все ветки
Да, **Jujutsu** (`jj`) отлично справляется с этим workflow и делает его **проще**, чем в Git, благодаря своей архитектуре. Вот как это работает:
## Подход Jujutsu
Jujutsu не требует «переключения веток» в классическом понимании Git, потому что использует модель **working-copy-as-commit**. Вы можете редактировать любой коммит в репозитории напрямую без `checkout`.
## Workflow в `jj`
### Шаг 1: Во время разработки feature обнаружили баг в `stable`
Не нужно делать `stash` или коммитить незавершённую работу. Просто:
```bash
# Редактируем коммит в stable напрямую
jj edit <stable-commit-id>
# ИЛИ создаем новый коммит поверх stable
jj new stable
```
### Шаг 2: Делаем исправление
Вносим необходимые изменения (багфикс, оптимизация, рефакторинг). Эти изменения получают уникальный **change ID**, который сохраняется между ветками.
### Шаг 3: Применяем фикс ко всем нужным веткам
Здесь `jj` раскрывается во всей красе. Два основных подхода:
#### Вариант A: Rebase-based propagation
```bash
# Rebase feature веток на обновлённый stable
jj rebase -b feature-branch -d stable
jj rebase -b another-feature -d stable
```
#### Вариант B: Cherry-pick стиль (дублирование + rebase)
```bash
# Дублируем change с фиксом и rebase на каждую ветку
jj duplicate <fix-change-id>
jj rebase -r <duplicated-change-id> -d feature-branch
```
### Шаг 4: Селективное применение через revsets
Для исключения deprecated веток используем мощный язык **revset** в `jj`:
```bash
# Применяем ко всем веткам кроме deprecated
jj rebase -b 'branches() & ~(branches(glob:"deprecated*") | branches("old-feature"))'
```
## Ключевые преимущества `jj` для этого workflow
- **Без загрязнения рабочей директории**: Ваше текущее состояние разработки `feature` остаётся нетронутым, пока вы работаете над фиксом в `stable`.
- **Change IDs отслеживаются между ветками**: Одно и то же логическое изменение сохраняет свою идентичность при rebase или дублировании, что упрощает отслеживание применения фикса.
- **Автоматическое разрешение конфликтов**: При rebase нескольких веток с фиксом `jj` помогает выявлять и разрешать конфликты инкрементально.
- **Нет "detached HEAD" состояний**: В отличие от Git, вы можете свободно навигировать и редактировать любой коммит без риска потерять работу.
## Практический пример
```bash
# 1. Сейчас работаем над feature
jj log
# 2. Создаём фикс на stable
jj new stable -m "Fix critical bug in validation"
# Вносим изменения
jj commit
# 3. Получаем change ID вашего фикса
FIX_ID=$(jj log -r @ --no-graph -T 'change_id')
# 4. Rebase всех активных feature веток
jj rebase -b 'branches() & ~branches(glob:"deprecated*")' -d stable
# 5. Возвращаемся к работе над feature
jj edit feature
```
## Важные моменты
- **Разрешение конфликтов**: Если ваш фикс в `stable` конфликтует с изменениями в `feature`-ветках, `jj` создаст conflict markers, которые нужно будет разрешить для каждой ветки.
- **Принцип upstream-first**: Как и в GitLab Flow, всегда исправляйте сначала в самой upstream-ветке (`stable`), затем распространяйте downstream.
- **Состояние working copy**: После операций используйте `jj status`, чтобы увидеть, к какому коммиту привязана рабочая копия, и `jj edit <branch>` для возврата к работе над `feature`.
> Да, `jj` абсолютно поддерживает этот workflow и делает его более эргономичным, чем Git, устраняя накладные расходы на переключение контекста и предоставляя мощные revset-запросы для селективных операций с ветками.

209
10-linux/00-utils/jj/jj.md Normal file
View file

@ -0,0 +1,209 @@
Вот приведённый в порядок Markdown файл:
***
# 📚 Шпаргалка по Jujutsu (jj)
## Основные концепции
**jj** — это система контроля версий, которая отличается от Git философией. Вместо веток используются **bookmarks** (закладки), вместо staging area — автоматическое отслеживание.
| Концепция | Описание |
|-----------|---------|
| `@` | Текущий рабочий коммит (working copy) |
| `@-` | Родитель текущего коммита |
| Bookmark | Закладка на коммит (аналог Git ветви) |
| DAG | Направленный ациклический граф — вся история видна одновременно |
## Базовые команды
```bash
# Инициализация
jj git init # Инициализировать jj в Git репозитории
# Просмотр истории
jj log # Показать историю
jj log --graph # С визуализацией
jj log --graph --all # Вся история со всеми ветками
jj status # Статус текущего коммита
# Создание коммитов
jj new # Создать новый коммит на основе текущего
jj new -m "description" # С описанием
jj new COMMIT_ID # Создать коммит на основе конкретного
# Редактирование
jj edit COMMIT_ID # "Включить" коммит для редактирования
jj describe -m "new message" # Изменить описание текущего коммита
jj new HEAD # Создать коммит от HEAD
```
## Работа с закладками
```bash
# Создание и удаление
jj bookmark create branch-name # Создать закладку на текущий коммит
jj bookmark create branch-name -r COMMIT_ID # На конкретный коммит
jj bookmark delete branch-name # Удалить закладку
jj bookmark list # Список всех закладок
# Перемещение закладок
jj bookmark set main -r COMMIT_ID # Переместить main на коммит
jj bookmark set main -r ready # Переместить на bookmark ready
# Отслеживание удалённых закладок
jj bookmark track main@origin # Импортировать удалённую закладку
```
## Слияние и перебазирование
```bash
# Rebase (перебазирование)
jj rebase -r @ -d main # Перебазировать текущий коммит на main
jj rebase -b ready -d main # Перебазировать ветку ready на main
# Squash (объединение коммитов)
jj squash -r @ # Объединить текущий коммит с родителем
jj squash -r COMMIT_ID # Объединить конкретный коммит с его родителем
# Abandon (удаление коммита)
jj abandon COMMIT_ID # Удалить коммит (но файлы останутся в @)
```
## Git интеграция
```bash
# Экспорт и импорт
jj git export # Синхронизировать jj с Git
jj git import # Импортировать Git ветки в jj
# Push и Pull
jj git push # Запушить все изменения
jj git push -b main # Запушить только bookmark main
jj git pull # Потянуть изменения с удалённого
# Работа с Git напрямую
git checkout main # Обычные Git команды работают!
git merge BRANCH
git push origin main
```
## Разрешение конфликтов
```bash
# При конфликтах во время rebase
jj resolve # Разрешить конфликты
jj resolve --tool=union # С объединением (берёт всё)
jj diff # Посмотреть различия
# После редактирования файлов вручную
jj resolve # Отметить конфликт разрешённым
jj squash -r @ # Переместить разрешение в основной коммит
```
## Типичные workflow'ы
### Создать и слить новую ветку в main
```bash
# Посмотреть состояние
jj log --graph
# Создать новый коммит
jj new -m "feature: add something"
# Работать над коммитом (файлы отслеживаются автоматически)
# Создать закладку
jj bookmark create feature-branch
# Перебазировать на main
jj rebase -r @ -d main
# Обновить main
jj bookmark set main -r @
# Запушить
jj git push -b main
```
### Слить ветку `ready` в `main` с приоритетом ready
```bash
# Перебазировать main на ready
jj rebase -b main -d ready
# Обновить main bookmark
jj bookmark set main -r ready
# Запушить
jj git push -b main
```
### Вернуться к старому коммиту и что-то изменить
```bash
# Посмотреть историю
jj log --graph --all
# "Включить" старый коммит для редактирования
jj edit OLD_COMMIT_ID
# Делать изменения (они автоматически добавятся в текущий коммит)
# Посмотреть что изменилось
jj diff
# Если нужно разветвить от этого коммита
jj new -m "new branch from old commit"
```
## Полезные флаги и опции
```bash
# Смотреть только свои коммиты
jj log -r "author(myemail)"
# Смотреть коммиты с конкретным текстом
jj log -r "description(disko)"
# Операции с конкретным range
jj log -r "main..@" # Коммиты от main до текущего
# Отмена последней операции
jj undo
# Помощь по команде
jj new --help
```
## Когда использовать Git вместо jj
Если что-то сложное происходит, всегда можешь вернуться к Git:
```bash
# Экспортировать текущее состояние в Git
jj git export
# Теперь используй обычные Git команды
git log --oneline
git merge origin/main
git push
```
Git интеграция в jj позволяет работать гибридно!
***
**Основные улучшения:**
- Убрал лишние пустые строки между блоками кода
- Выровнял таблицу по стандартам Markdown
- Переорганизовал структуру: основные концепции → команды → workflow'ы
- Унифицировал комментарии в блоках кода (выравнивание и стиль)
- Добавил подзаголовки (###) для workflow'ов вместо жирного текста
- Упростил финальный абзац
***
Готово к добавлению в Obsidian! 🚀