`jj st`를 사용해 저장소의 현재 상태를 확인하고, pager, 작업 복사본 변경 사항, 커밋과 change ID의 차이를 이해합니다.
jj st로 현재 상태 보기 - Steve의 Jujutsu 튜토리얼 1. [**1.1.** `jj`는 무엇이며 왜 신경 써야 할까요?](https://steveklabnik.github.io/jujutsu-tutorial/introduction/what-is-jj-and-why-should-i-care.html)
1. [**2.1.** `jj` 설치 방법](https://steveklabnik.github.io/jujutsu-tutorial/hello-world/how-to-install.html)
2. 2.2. jj git init으로 저장소 만들기
3. 2.3. jj st로 현재 상태 보기
4. 2.4. jj describe를 사용해 커밋을 사람이 읽기 쉬운 방식으로 설명하기
5. 2.5. jj new를 사용해 새로운 변경 사항 만들기
6. 2.6. jj log로 저장소 내용 보기
7. 2.7. 요약과 몇 가지 생각
1. [**3.1.** Squash 워크플로](https://steveklabnik.github.io/jujutsu-tutorial/real-world-workflows/the-squash-workflow.html)
1. [**4.1.** 이름 없는 브랜치가 무엇인지, 그리고 사용하는 방법](https://steveklabnik.github.io/jujutsu-tutorial/branching-merging-and-conflicts/anonymous-branches.html)
2. 4.2. revset으로 우리의 변경 사항이 어디에 있는지 파악하기 3. 4.3. 이름 없는 브랜치 병합하기 4. 4.4. 충돌 다루기
1. [**5.1.** `jj`에서 이름 있는 브랜치 사용하기](https://steveklabnik.github.io/jujutsu-tutorial/sharing-code/named-branches.html)
2. 5.2. 원격 저장소 사용하기, 예: GitHub
3. 5.3. pull request 피드백에 대응하기
4. 5.4. upstream에서 trunk 업데이트하기
5. 5.5. jj와 Gerrit 함께 사용하기
1. [**6.1.** 모든 브랜치에서 동시에 작업하기](https://steveklabnik.github.io/jujutsu-tutorial/advanced/simultaneous-edits.html)
2. 6.2. Stacked PRs 3. 6.3. Workspaces 4. 6.4. Colocated Repositories
7. 문제 해결하기
1. **7.1.** 실수 되돌리기
2. 7.2. 변경 사항 되돌리기 3. 7.3. 작업 로그 4. 7.4. obslog
8. 사용 경험 사용자화하기
1. **8.1.** `jj` 설정하기
jj st로 현재 상태 보기jj st로 저장소의 상태를 볼 수 있습니다. 이제 실행해 봅시다:
$ jj st

이것은 jj의 "pager"로, 명령의 출력을 보여 주고, 아주 길어졌을 때 스크롤할 수 있게 해 주는 프로그램입니다. 콘솔로 돌아가려면 q를 누르면 됩니다.
jj st --no-pager를 사용하면 pager를 쓰지 않도록 요청할 수 있습니다. 또는 pager가 싫고 꺼 버리고 싶다면, 다음과 같이 설정할 수 있습니다.
$ jj config set --user ui.paginate never
이 책에서는 이 설정이 되어 있다고 가정하고 예제를 보여 드리겠습니다. 스크린샷을 다루는 것보다 텍스트를 다루는 편이 더 쉽기 때문입니다. 어느 쪽을 선호하든 결국 화면에 나타나는 정보는 같습니다. 그러니 이제 실제로 jj st의 출력에 대해 이야기해 봅시다.
$ jj st --no-pager
Working copy changes:
A .gitignore
A Cargo.lock
A Cargo.toml
A src\main.rs
Working copy : qzmzpxyl bc915fcd (no description set)
Parent commit: zzzzzzzz 00000000 (empty) (no description set)
여기에는 이야기할 것이 놀랄 만큼 많습니다! 하나씩 살펴봅시다.
Working copy changes:
A .gitignore
A Cargo.lock
A Cargo.toml
A src\main.rs
이것이 우리가 가장 먼저 이야기해야 할 부분입니다. git과 달리 jj에는 index가 없습니다. 잠깐, 탭을 닫지는 마세요! 핵심은 이렇습니다. jj는 여러분이 원하는 내용만 정확히 담긴, 정성스럽고 아름다운 커밋을 만들 수 있는 동일한 능력을 제공합니다. 하지만 그것을 위해 index가 필요하지는 않습니다.
이것은 jj에서 반복해서 보게 되는 주제입니다. 더 적은 도구를 제공하지만, 그 도구들은 결국 git의 대응 도구와 동등하거나 심지어 더 강력한 힘을 가집니다. 도구가 더 적기 때문에 배워야 할 것도 더 적습니다. 저는 "git CLI는 너무 복잡하고 git은 배우기 너무 어렵다"라고 말하는 부류의 사람은 아니지만, 그런 생각을 하는 사람이 소수가 아니라는 점은 인정합니다. 하지만 이렇게 다시 생각해 봅시다. 더 강력하면서도 더 쉽게 만들 수 있다면요? 저는 대환영입니다!
나중에 index의 힘을 어떻게 재현할 수 있는지 살펴볼 것입니다. 지금은 jj 명령을 실행할 때마다 작업 복사본(디스크에 있는 파일들)을 검사하고 스냅샷을 만든다는 점만 알면 됩니다. 그래서 여기서는 몇 개의 새 파일을 Added했다는 것을 알아챈 것입니다. 또한 Modified 파일과 Deleted 파일도 보게 될 것입니다.
Working copy : qzmzpxyl bc915fcd (no description set)
Parent commit: zzzzzzzz 00000000 (empty) (no description set)
이제 막 만든 새로운 저장소는 두 개의 변경 사항 이 있음을 보여 줍니다. 두 번째 줄의 텍스트에는 "commit"라고 적혀 있다는 점을 보셨을 텐데, 음... 맞습니다. jj에는 여기서 몇 가지 다른 개념이 있습니다. 첫 번째는 commit입니다. 우리의 두 commit은 bc915fcd와 00000000이라는 식별자를 가집니다. 하지만 "change"라는 개념도 있는데, jj에서는 commit이 시간이 지나면서 발전할 수 있다는 뜻입니다. 그래도 그 변경 사항을 가리킬 안정적인 식별자가 필요하므로 "change ID"가 있고, 그것이 qzmzpxyl와 zzzzzzzz입니다. 정말 멋진 점 하나는 이들이 서로 겹치지 않는 식별자 집합을 사용한다는 것입니다. qzmzpxyl는 절대로 commit ID가 될 수 없고 반드시 change ID이며, bc914fcd는 절대로 change ID가 될 수 없고 반드시 commit ID입니다. 이것은 놀랄 만큼 편리합니다.
어쨌든 commit과 change, 그리고 둘이 어떻게 다른지에 대해서는 곧 더 자세히 이야기하겠습니다. 하지만 먼저 여기 있는 나머지 세부 사항을 이야기해야 합니다. 첫 번째는 각 저장소에는 항상 zzzzzzzz 00000000 변경 사항이 하나 있고, 그것은 언제나 비어 있다는 점입니다. 이것을 "root commit"이라고 하며 전체 저장소의 기반이 됩니다. 이것이 비어 있기 때문에, jj는 그 위에 두 번째 변경 사항을 만들었고, 여기서는 qzmzpxyl이며 작업 복사본의 내용을 추적하고 있습니다. 이것은 비어 있지 않으므로, 루트 변경 사항에 붙어 있는 (empty) 같은 표시는 이 줄에는 없습니다.
마지막으로, 우리의 두 변경 사항 모두 (no description set)라고 되어 있는데, 아직 설명을 붙이지 않았기 때문입니다! 설명에 대해서는 다음 섹션에서 이야기하겠습니다.