최근 vim.kr 주최로 진행된 Jujutsu(jj) 실습 워크숍이 개발자들 사이에서 큰 관심을 모았습니다. 약 3시간 반 동안 진행된 이 워크숍은 기존 Git의 복잡한 부분을 개선하고 개발 생산성을 높이는 차세대 분산 버전 관리 시스템(DVCS)인 jj의 핵심 개념과 활용법을 깊이 있게 다뤘습니다. 특히 Git 내부 모델을 이해하는 것부터 시작해 jj의 독특한 데이터 모델, 기본 명령, 고급 워크플로우, 그리고 탈중앙 Git 포지인 Tangled(탱글드)와의 연동까지 폭넓게 다루며, 개발자들이 jj를 실제 프로젝트에 적용할 수 있도록 실질적인 가이드를 제공했습니다.
워크숍은 크게 세 부분으로 구성되었습니다. 첫 번째 세션에서는 Git의 객체 모델(blob, tree, commit, tag, ref, 인덱스)을 먼저 살펴본 후, jj가 이를 어떻게 다르게 다루는지 비교했습니다. jj는 Git과 달리 인덱스(index)와 스태시(stash) 개념이 없으며, 워킹 카피(working copy) 자체가 하나의 커밋(commit)으로 간주되어 명령 실행 시 자동으로 스냅샷(snapshot)됩니다. 또한, 내용이 바뀌어 커밋 ID가 달라져도 변경 ID(change ID)는 유지되어 동일한 변경을 지속적으로 추적할 수 있는 점이 특징입니다. 브랜치(branch) 대신 북마크(bookmark) 개념을 사용하며, 기존 Git 저장소 위에서 동작하므로 기존 프로젝트에 쉽게 적용할 수 있습니다. 두 번째 세션에서는 `jj evolog`로 변경 이력을 확인하고 `jj undo`, `op log`, `op restore`로 저장소 전체 작업을 되돌리는 등 강력한 히스토리 조작 기능을 소개했습니다. 특히 충돌(conflict)이 발생해도 리베이스(rebase)가 멈추지 않고 충돌 상태를 커밋에 기록해두었다가 나중에 해결할 수 있는 '충돌 일급 객체' 개념은 개발자들에게 큰 호응을 얻었습니다. 마지막 세션에서는 AT 프로토콜(AT Protocol) 기반의 탈중앙 Git 포지인 Tangled를 소개하고, jj를 이용해 GitHub(깃허브)와 Tangled에 북마크를 동기화하며 PR(Pull Request) 갱신 시 `force push`가 자연스러운 jj 흐름과 `interdiff`로 PR 리비전 간 차이를 리뷰하는 방식을 시연했습니다.
이번 Jujutsu 워크숍은 기존 Git의 복잡성과 불편함에 지쳐있던 개발자들에게 새로운 대안을 제시했다는 점에서 큰 의미를 가집니다. 특히 인덱스, 스태시와 같은 중간 단계를 없애고 워킹 카피를 커밋으로 직접 관리하는 방식은 개발 워크플로우를 간소화하고 직관적으로 만듭니다. 변경 ID와 커밋 ID의 분리는 리베이스나 스쿼시(squash) 같은 히스토리 재작성 작업 시에도 변경의 연속성을 유지할 수 있게 하여, Git의 강력한 기능은 그대로 활용하면서도 사용성을 크게 개선했습니다. 이러한 특징들은 특히 여러 변경 사항을 동시에 다루거나, 빈번한 리베이스를 통해 깔끔한 커밋 히스토리를 유지하려는 개발팀에 매우 유용할 것입니다. 또한, 탈중앙 Git 포지와의 연동 가능성은 향후 분산 개발 환경에서의 협업 방식에 새로운 가능성을 열어줄 것으로 기대됩니다.