-
Jujutsu(jj)는 Git보다 단순한 개념과 명령어, 그러나 강력한 기능을 제공하는 버전 관리 시스템임
- Git을 백엔드로 사용하므로 동시에 사용하거나 Git으로 쉽게 복귀할 수 있는 장점이 있음
-
스택형 diff, 쉬운 rebase, 임시 리비전과 같은 기능이 자연스럽게 제공됨
-
분기(Branch) 대신 북마크(Bookmarks) 개념을 활용하며, 현업 작업 흐름에 더 직관적임
-
충돌(Conflict) 처리 방식이 유연하고, 일상적인 버전 관리 작업을 훨씬 간단하게 해줌
Elevator Pitch
Jujutsu(jj)는 Git과 비교해 훨씬 단순한 정신 모델과 명령줄 인터페이스를 제공하는 버전 관리 시스템임.
기능을 희생하지 않으면서도, 실은 더 강력하다고 볼 수도 있음
스택형 diff, 손쉬운 rebase, 임시 리비전과 같은 기능이 자연스럽게 동작함
백엔드로 Git을 사용하므로, 단 한 줄로 Git 저장소와 나란히 사용을 시작할 수 있으며 언제든지 Git으로 돌아갈 수 있음
다른 사용자가 저장소를 다루는 방식에도 영향을 주지 않음
Getting Started
-
jj 명령줄 도구를 설치한 뒤, 사용자 정보와 쉘 자동완성 설정을 권장함
- 기존 저장소에 적용 시 새로 클론하거나, 변경 없는 상태에서 사용 시작이 유리함
- 기존 저장소에서 jj git init --colocate . 명령으로 Git과 Jujutsu 저장소를 병행 생성할 수 있음
-
jj 저장소 데이터는 Git의 .git과 별도의 .jj/ 폴더에 보관됨
- Git과 Jujutsu 간의 데이터 동기화는 기본적으로 문제 없이 운영됨
- 단, git clean -fdx 명령은 .jj/ 폴더를 삭제하므로 주의해야 함
- remote branch 트래킹도 해당 명령으로 한 번에 설정 가능함
How To Use It
Jujutsu의 명령줄 인터페이스는 Git보다 좁고 간결함
기본 개념이 단순하지만 작업 흐름에는 약간의 적응이 필요함
간단한 절차와 예시로 주요 사용 방법을 설명함
Starting A New Revision
- Git에서의 새 작업은 보통 브랜치 생성으로 시작하지만, Jujutsu는 리비전을 새로 만드는 방식임
- 최신 리모트 저장소 상태 반영: jj git fetch
- 저장소 히스토리 확인: jj log
- 히스토리 내 리비전은 고유한 Jujutsu별 리비전 ID와 Git 커밋 해시로 구분됨
- 신작업 시작은 jj new main으로 현재 main 위에 새 리비전 생성
- 현재 편집 중인 리비전은 @ 기호로 구분됨
- 동일한 접두사가 사라지면 리비전 ID의 짧은 접두사도 따라 변동됨
Making Changes
- 파일을 수정하면 즉시 해당 리비전에 포함됨(별도의 staging area 없음)
- 수정이 완료되면 jj describe -m "메시지"로 리비전에 메시지 추가
- 새 리비전을 만들 때는 jj new (또는 이전 리비전 지정)
-
jj commit은 jj describe + jj new의 조합 연산임
Navigating
-
jj new로 생성한 빈 리비전은 이동 시 자동 폐기됨
- 명시적으로 리비전 삭제: jj abandon <rev ID>
- 삭제 취소: jj op undo
- 기존 리비전으로 돌아가기는 jj edit <rev ID>
- 리비전 참조시 revset expressions도 사용 가능:
-
@: 현재 리비전
-
x-: 부모 리비전
-
y+: 자식 리비전
-
z::: z의 모든 자손
Branches (Bookmarks)
-
Jujutsu는 Git처럼 "브랜치에 머무르는 상태"가 없음
- 대신, 북마크(Bookmarks)는 단지 특정 리비전을 가리키는 포인터임
- 새 북마크 생성: jj bookmark create <이름> -r <리비전>
- 커밋해도 자동으로 북마크가 이동하지 않으므로, 필요시 jj bookmark move <이름> --to <리비전>으로 별도 이동 필요
- push 시에는 --allow-new 플래그로 원격 새 브랜치 생성 인정
- 북마크가 원격과 다르면 *로 표시되며 jj git push로 동기화 가능
Conflicts
- Jujutsu의 충돌 처리 방식은 Git보다 유연함
- 충돌 시 ‘conflicted’ 표식이 리비전 및 자손 리비전에 표시됨
- 충돌 파일은 충돌 마커가 삽입되고, 해당 마커를 제거하는 것으로 해결함
- 직접 수정 또는 새 리비전에서 변경 이후 jj squash로 합칠 수 있음
결론
이상으로 Git에서 가장 많이 쓰이는 80%의 작업을 Jujutsu로 더욱 간단하게 처리하는 방법을 안내함
추후 일반적/고급 활용은 참조 핸드북(Quick Reference) 형태로 제공 예정임
Git처럼 jj status 명령 지원함
문의나 피드백은 본문 이메일로 가능함