hyperion/10-linux/00-utils/jj/jj.md
2025-11-22 17:48:07 +03:00

7.7 KiB
Raw Blame History

Вот приведённый в порядок Markdown файл:


📚 Шпаргалка по Jujutsu (jj)

Основные концепции

jj — это система контроля версий, которая отличается от Git философией. Вместо веток используются bookmarks (закладки), вместо staging area — автоматическое отслеживание.

Концепция Описание
@ Текущий рабочий коммит (working copy)
@- Родитель текущего коммита
Bookmark Закладка на коммит (аналог Git ветви)
DAG Направленный ациклический граф — вся история видна одновременно

Базовые команды

# Инициализация
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

Работа с закладками

# Создание и удаление
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               # Импортировать удалённую закладку

Слияние и перебазирование

# 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 интеграция

# Экспорт и импорт
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

Разрешение конфликтов

# При конфликтах во время rebase
jj resolve                     # Разрешить конфликты
jj resolve --tool=union        # С объединением (берёт всё)
jj diff                        # Посмотреть различия

# После редактирования файлов вручную
jj resolve                     # Отметить конфликт разрешённым
jj squash -r @                 # Переместить разрешение в основной коммит

Типичные workflow'ы

Создать и слить новую ветку в main

# Посмотреть состояние
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

# Перебазировать main на ready
jj rebase -b main -d ready

# Обновить main bookmark
jj bookmark set main -r ready

# Запушить
jj git push -b main

Вернуться к старому коммиту и что-то изменить

# Посмотреть историю
jj log --graph --all

# "Включить" старый коммит для редактирования
jj edit OLD_COMMIT_ID

# Делать изменения (они автоматически добавятся в текущий коммит)

# Посмотреть что изменилось
jj diff

# Если нужно разветвить от этого коммита
jj new -m "new branch from old commit"

Полезные флаги и опции

# Смотреть только свои коммиты
jj log -r "author(myemail)"

# Смотреть коммиты с конкретным текстом
jj log -r "description(disko)"

# Операции с конкретным range
jj log -r "main..@"            # Коммиты от main до текущего

# Отмена последней операции
jj undo

# Помощь по команде
jj new --help

Когда использовать Git вместо jj

Если что-то сложное происходит, всегда можешь вернуться к Git:

# Экспортировать текущее состояние в Git
jj git export

# Теперь используй обычные Git команды
git log --oneline
git merge origin/main
git push

Git интеграция в jj позволяет работать гибридно!


Основные улучшения:

  • Убрал лишние пустые строки между блоками кода
  • Выровнял таблицу по стандартам Markdown
  • Переорганизовал структуру: основные концепции → команды → workflow'ы
  • Унифицировал комментарии в блоках кода (выравнивание и стиль)
  • Добавил подзаголовки (###) для workflow'ов вместо жирного текста
  • Упростил финальный абзац

Готово к добавлению в Obsidian! 🚀