SW Engineering•2026.02.05
git stash를 깜빡해서 체크아웃을 못 하겠네"
"git rebase 하다가 충돌(Conflict)의 폭풍이..."
"git reset --hard로 작업 내용이 날아갔어..."# Git: 3가지 상태를 관리해야 함git add -p # 워킹 트리 → 스테이징git commit # 스테이징 → 커밋git reset HEAD # 스테이징 해제git checkout -- . # 워킹 트리의 변경 사항 파기git reset의 각 플래그(--soft, --mixed, --hard)의 차이를 정확하게 설명할 수 있는 사람이 얼마나 될까요? 스테이징 영역은 Git의 학습 비용을 대폭 높이는 주범입니다.$ git checkout feature-brancherror: Your local changes to the following files would be overwritten by checkout: src/main.rsPlease commit your changes or stash them before you switch branches.# 아차... 실수했다...git reset --hard HEAD~3# 되돌리고 싶어... 근데 reflog가 뭐지?git reflog # ???reflog라는 이해하기 어려운 메커니즘에 의존하고 있어, 초보자에게는 진입 장벽이 너무 높습니다.# jj: 파일을 편집하기만 하면 됨. add는 불필요vim src/main.rs# 변경 사항은 자동으로 현재 커밋에 반영됨jj diff # 현재 변경 사항 확인jj describe -m "기능 A 구현" # 커밋 메시지 설정jj new # 새로운 빈 커밋을 생성하고 다음 작업으로 이동git add의 굴레에서 해방됩니다.# jj: 언제든지 자유롭게 커밋 사이를 이동jj edit <revision> # 임의의 커밋으로 이동. stash 불필요!git stash는 영원히 필요 없게 됩니다.# jj: 충돌이 발생해도 작업을 계속할 수 있음jj rebase -r @- -d main# 충돌이 발생해도 그대로 커밋됨# 나중에 해결하면 OKjj resolve # 원하는 타이밍에 해결jj undo # 직전 조작 취소jj op log # 조작 이력 확인jj op restore <op-id> # 임의의 시점으로 복원git reset --hard로 날려버린 작업도 jj라면 한 번에 되돌릴 수 있습니다.# 어떤 커밋을 수정하면, 그 아래의 커밋도 자동으로 따라옴jj edit <이전 커밋># 수정을 가함jj new # 새로운 작업으로 복귀# → 자손 커밋은 자동으로 리베이스되어 있음!rebase의 고행이 사라집니다.하고 싶은 일 | Git | jj |
|---|---|---|
리포지토리 초기화 | git init | jj git init |
클론 | git clone <url> | jj git clone <url> |
상태 확인 | git status | jj st |
차이 확인 | git diff HEAD | jj diff |
커밋 | git add -A && git commit | jj commit |
메시지 변경 | git commit --amend --only | jj describe |
로그 표시 | git log --oneline --graph | jj log |
브랜치 생성 | git checkout -b <name> | jj bookmark create <name> |
스태시 | git stash | jj new @- (개념 자체가 불필요) |
스쿼시 | git commit --amend -a | jj squash |
리베이스 | git rebase <target> | jj rebase -d <target> |
변경 사항 파기 | git reset --hard | jj abandon |
blame | git blame <file> | jj file annotate <file> |
실행 취소 | ❌ (reflog로 고군분투) | jj undo |
페치 | git fetch | jj git fetch |
푸시 | git push | jj git push |
brew install jjcargo binstall --strategies crate-meta-data jj-clicargo install --git https://github.com/jj-vcs/jj.git --locked --bin jj jj-climise install jujutsu@latest# 사용자 이름과 이메일 설정 (필수)jj config set --user user.name "Your Name"jj config set --user user.email "[email protected]"cd your-git-repojj git init --colocate.git 디렉토리는 그대로 남으며, jj가 자동으로 동기화를 유지합니다.# 1. 새로운 커밋을 생성하고 작업 시작jj new -m "사용자 인증 기능 추가"# 2. 파일 편집 (add 불필요, 자동 추적)vim src/auth.rsvim src/routes.rs# 3. 변경 사항 확인jj diffjj st# 4. 다음 작업으로 (현재 커밋은 그대로 확정)jj new -m "테스트 추가"# 5. 로그로 확인jj log# 1. 로그에서 수정하고 싶은 커밋 찾기jj log# 2. 해당 커밋 편집 (stash 불필요!)jj edit <change-id># 3. 파일 수정vim src/auth.rs# 4. 최신 커밋으로 복귀jj new# → 사이의 커밋들은 자동으로 리베이스됨# 너무 큰 커밋을 분할jj split# → TUI가 열리고, 파일이나 헝크(hunk)를 선택해서 분할 가능# 북마크(= Git 브랜치) 생성jj bookmark create feature-auth -r @-# 푸시jj git push# 내 커밋만 표시jj log -r "author(email:[email protected])"# main에서 분기된 커밋 표시jj log -r "main..@"# 머지 커밋 제외jj log -r "~merges()"# 체크아웃하지 않고 임의의 커밋을 squashjj squash -r <revision># 체크아웃하지 않고 임의의 커밋을 rebasejj rebase -r <revision> -d <destination>jj 사용을 중단하기만 하면 됩니다.관점 | Git | jj |
|---|---|---|
스테이징 영역 | 있음 (복잡) | 없음 (심플) |
워킹 카피 | 더티 상태 있음 | 항상 커밋 |
충돌 | 즉시 해결 필요 | 나중으로 미룰 수 있음 |
undo | reflog (어려움) | jj undo (쉬움) |
리베이스 | 수동 | 자동 |
Git 호환성 | - | 완전 호환 |
jj git init --colocate를 시도해 보세요. Git에서는 맛볼 수 없었던 쾌적함이 기다리고 있습니다.아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!