migrations
This commit is contained in:
parent
d1b0670d71
commit
f2b07c9f30
57 changed files with 2970 additions and 1 deletions
90
10-linux/00-utils/jj/Untitled.md
Normal file
90
10-linux/00-utils/jj/Untitled.md
Normal 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
209
10-linux/00-utils/jj/jj.md
Normal 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! 🚀
|
||||
Loading…
Add table
Add a link
Reference in a new issue