Jujutsu (jj) - Git 호환 버전 관리 치트시트
Jujutsu (jj)는 Git 호환되는 현대적 버전 관리 시스템입니다. Git 저장소를 백엔드로 사용하므로 기존 저장소에서 채택할 수 있고 Git을 사용하는 팀원과 상호 운용할 수 있습니다. 모델은 다르며 많은 사람에게 더 간단합니다: 작업 복사본은 그 자체로 커밋입니다 (별도의 스테이징 영역 없음), 충돌은 첫 번째 클래스 객체로서 나중에 커밋하고 해결할 수 있으며, 모든 작업은 실행 취소할 수 있는 작업 로그에 기록됩니다. 기본적으로 Git 의미의 브랜치가 없으며, 안정적인 변경 ID로 식별되는 변경 사항으로 작업합니다.
설치
| 플랫폼 | 명령어 |
|---|
| Cargo | cargo install --locked jj-cli |
| macOS (Homebrew) | brew install jj |
| Arch Linux | sudo pacman -S jujutsu |
| Nix | nix profile install nixpkgs#jujutsu |
| Windows (Scoop) | scoop install jujutsu |
| 확인 | jj --version |
설정
| 명령어 | 설명 |
|---|
jj config set --user user.name "Your Name" | 이름 설정 |
jj config set --user user.email "you@example.com" | 이메일 설정 |
jj git init --colocate | 기존 Git 저장소에서 jj 초기화 (.git 유지) |
jj git clone <url> | jj로 Git 저장소 클론 |
jj git init | 새로운 jj 저장소 생성 (네이티브 백엔드) |
핵심 개념
| 용어 | 의미 |
|---|
| Change | 안정적인 변경 ID를 가진 논리적 변경 (재작성 시에도 유지) |
| Commit | 스냅샷, 작업 복사본은 항상 커밋입니다 (@) |
@ | 현재 작업 복사본 커밋 |
| Revset | 커밋을 선택하기 위한 쿼리 언어 |
| Operation log | 저장소 작업의 이력, 각각 취소 가능 |
| Bookmark | 명명된 포인터 (푸시 시 Git 브랜치로 매핑) |
일상적인 워크플로우
| 명령어 | 설명 |
|---|
jj status | 작업 복사본 변경 사항 표시 |
jj log | 커밋 그래프 표시 |
jj diff | 작업 복사본 커밋 비교 |
jj describe -m "msg" | 현재 커밋의 메시지 설정/교체 |
jj new | 현재 커밋 위에 새 변경 시작 |
jj new <rev> | 특정 커밋 위에 새 변경 시작 |
jj edit <rev> | 기존 커밋을 작업 복사본으로 변경 |
jj commit -m "msg" | @를 설명하고 새 변경 시작 (Git 스타일) |
이력 이동 및 편집
| 명령어 | 설명 |
|---|
jj squash | @의 변경 사항을 부모에 이동 |
jj squash -i | 상호 대화형으로 squash할 항목 선택 |
jj split | 현재 커밋을 두 개로 분할 |
jj rebase -d <dest> | 변경 사항을 대상으로 rebase |
jj abandon <rev> | 커밋 드롭 |
jj duplicate <rev> | 다른 곳에 커밋 복사 |
킬러 기능: 실행 취소
| 명령어 | 설명 |
|---|
jj op log | 수행한 모든 작업 나열 |
jj undo | 마지막 작업 취소 |
jj op restore <id> | 저장소를 이전 작업 상태로 복원 |
모든 명령어가 작업이므로 rebase와 abandon을 포함한 거의 모든 것을 취소할 수 있습니다.
북마크 및 Git 상호 운용성
| 명령어 | 설명 |
|---|
jj bookmark create main -r @ | 북마크 생성 (≈ Git 브랜치) |
jj bookmark set main -r @ | 북마크를 커밋으로 이동 |
jj git fetch | Git 원격에서 페치 |
jj git push | Git 원격에 북마크 푸시 |
jj git push -c @ | 현재 변경 사항에서 원격 브랜치 생성 |
Revsets (커밋 선택)
| Revset | 선택 대상 |
|---|
@ | 작업 복사본 커밋 |
@- | 작업 복사본의 부모 |
main | 북마크가 가리키는 커밋 |
mine() | 당신의 커밋 |
ancestors(@) | @의 모든 선조 |
jj log -r "description(glob:'fix*')" | 메시지가 일치하는 커밋 |
일반적인 워크플로우
# 기존 Git 저장소에서 jj 채택, Git 원격과 함께 계속 작업
jj git init --colocate
jj log
# 스테이징 없이 변경 사항 만들기 - 파일을 편집한 후 설명 추가
# (파일은 자동으로 @로 스냅샷됨)
jj describe -m "Add feature"
jj new # 다음 변경 시작
# 아, 마지막 작업 취소 (rebase도 포함)
jj undo
# 현재 변경 사항을 검토용 브랜치로 푸시
jj bookmark create feature -r @
jj git push -c @
jj vs Git
| 측면 | Jujutsu (jj) | Git |
|---|
| 스테이징 영역 | 없음 (작업 복사본이 커밋) | Index/staging |
| 충돌 | 첫 번째 클래스, 커밋 가능 | 진행하기 전에 해결해야 함 |
| 취소 | 작업 로그를 통한 보편적 | Reflog (부분적) |
| 브랜치 | 북마크 (선택적) | 브랜치 (중심) |
| 백엔드 | Git 호환 | Git |
리소스