본문으로 건너뛰기

jj 파트 1: 차세대 버전 관리 시스템의 이해와 시작하기

<code>jj</code> part 1: what is it

작성자
발행일
2025년 09월 28일

핵심 요약

  • 1 Jujutsu(jj)는 모든 작업과 상태 변화를 커밋으로 기록하여 스테이징 영역이 필요 없고 완벽한 실행 취소 기능을 제공하는 혁신적인 버전 관리 도구입니다.
  • 2 Git 저장소와 호환되는 jj는 충돌이 발생해도 리베이스 작업을 멈추지 않고 커밋 내부에 충돌 상태를 보존하여 개발자가 원하는 시점에 해결할 수 있게 합니다.
  • 3 변경 사항이 수정되거나 이동되어도 유지되는 Change ID와 강력한 쿼리 언어인 Revsets을 통해 복잡한 브랜치 관리와 코드 변경 추적을 획기적으로 단순화합니다.

도입

이 글은 기존 Git의 복잡한 워크플로우를 개선하기 위해 등장한 새로운 버전 관리 시스템인 jj(Jujutsu)의 개념과 기초 사용법을 소개합니다. 저자인 Andre Arko는 방대한 양의 정보를 한 번에 전달하는 대신, 독자들이 점진적으로 jj를 익힐 수 있도록 시리즈물로 기획하였습니다. jj는 Git 저장소와 함께 사용할 수 있는 높은 호환성을 갖추고 있으며, Git의 고질적인 문제점인 스테이징 영역의 불편함과 난해한 충돌 해결 과정을 근본적으로 해결하려는 시도를 보여줍니다.

1. jj 시작하기: Git 사용자를 위한 빠른 전환

jj(Jujutsu)는 기존 Git 저장소와의 강력한 호환성을 자랑하는 차세대 버전 관리 시스템입니다. jj git init --colocate 명령어를 사용하면 기존 Git 저장소 내에 jj 데이터를 공존시켜 두 도구를 동시에 사용할 수 있으며, jj git clone을 통해 원격 저장소를 손쉽게 복제할 수 있습니다. 가장 혁신적인 변화는 별도의 add 명령어가 필요 없다는 점입니다. 모든 파일 수정 사항은 백그라운드에서 자동으로 감지되어 스테이징되므로, 개발자는 오직 코드 로직의 변경과 커밋 메시지 작성에만 집중할 수 있는 환경을 제공합니다.

2. 모든 것이 커밋인 모델 (Everything is a Commit)

jj의 핵심 철학은 “모든 상태 변화는 커밋이다”라는 점입니다. 단순히 파일의 변화뿐만 아니라, 사용자가 실행하는 모든 명령어가 시스템의 상태를 변화시키는 하나의 커밋으로 기록됩니다. 이러한 모델은 다음과 같은 강력한 이점을 제공합니다. * 스테이징 영역의 제거: Git의 index와 같은 중간 단계가 없습니다. 파일을 수정하면 즉시 현재 작업 중인 커밋의 일부가 되며, 이는 개발 프로세스를 단순화합니다. * 완벽한 실행 취소 (Undo)와 작업 로그: jj는 모든 작업 내역을 op log(operation log)에 저장합니다. 복잡한 리베이스 과정에서 실수가 발생하더라도 jj undo 명령 한 번으로 이전의 모든 상태를 완벽하게 복구할 수 있어, 실험적인 코드 조작에 대한 심리적 장벽을 낮춰줍니다. * 커밋된 충돌 (Committed Conflicts): Git에서는 충돌이 발생하면 해결될 때까지 다른 작업을 수행하기 어렵습니다. 반면 jj는 충돌 마커를 포함한 상태 그대로를 커밋으로 저장합니다. 따라서 충돌을 즉시 해결하지 않고도 다른 브랜치로 이동하거나 나중에 한꺼번에 해결하는 유연한 워크플로우가 가능해집니다.

3. Change ID와 Revsets: 유연한 변경 관리와 쿼리

jj는 개별 커밋의 고유 해시 외에도 ‘Change ID’라는 개념을 도입했습니다. 특정 기능을 구현하는 ‘변경 사항’ 그 자체에 ID를 부여함으로써, 해당 커밋이 수정(amend)되거나 리베이스되어 해시가 바뀌더라도 동일한 논리적 단위를 계속 추적할 수 있게 합니다. 이는 여러 개의 PR을 동시에 관리하거나, 하나의 커밋을 여러 브랜치로 쪼개는 복잡한 작업을 수행할 때 매우 강력한 도구가 됩니다. 또한, revsets라는 전용 쿼리 언어를 통해 작성자, 메시지 패턴, 부모/자식 관계 등 다양한 조건을 조합하여 특정 변경 사항을 정교하게 필터링하고 선택할 수 있어 대규모 프로젝트 관리의 효율성을 극대화합니다.

4. 주요 명령어 및 실무 워크플로우

  • jj commit: 현재의 변경 사항을 확정하고 새로운 작업 단위를 생성합니다.
  • jj bookmark set [NAME]: Git의 브랜치와 유사하게 원격 저장소에 푸시할 지점을 명시적으로 지정합니다.
  • jj git push / fetch: 원격 저장소와의 동기화를 수행하며, jj 내부의 상태를 Git 호환 형식으로 변환하여 전송합니다.
  • jj new [NAME]: 기존 작업을 유지하면서 새로운 독립적인 변경 작업을 시작할 때 사용합니다.
  • jj bookmark track [NAME@REMOTE]: 원격 브랜치를 로컬에서 추적하도록 설정하여 협업 효율을 높입니다.

결론

jj는 Git의 강력한 기능을 계승하면서도, 사용자 경험을 저해하던 스테이징 영역과 충돌 해결 프로세스를 현대적으로 재정의했습니다. 모든 상태를 커밋으로 관리하고 Change ID를 통해 변경의 의도를 추적하는 방식은 복잡한 프로젝트를 관리하는 개발자들에게 새로운 대안을 제시합니다. 비록 초기 학습 곡선이 존재할 수 있으나, jj가 제공하는 강력한 Undo 기능과 유연한 충돌 관리 기능은 버전 관리의 생산성을 한 단계 높여줄 것으로 기대됩니다.

댓글0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

0/1000
정중하고 건설적인 댓글을 작성해 주세요.