Jujutsu (jj) เป็นระบบ Version Control System (VCS) สมัยใหม่ที่ถูกออกแบบมาเพื่อแก้ปัญหาความซับซ้อนของ Git โดยให้ประสบการณ์การทำงานที่ปลอดภัย ปรับแต่งง่าย และมีประสิทธิภาพสูงกว่า แม้ว่าเบื้องหลัง jj จะสามารถทำงานร่วมกับ Git Repository (GitHub, GitLab, Bitbucket) ได้อย่างไร้รอยต่อ แต่การทำงานประจำวันของคุณสามารถทำผ่านคำสั่งของ jj ได้ทั้งหมด 100% โดยไม่ต้องพิมพ์คำสั่ง git หรือเปิดโปรแกรม Git GUI อีกเลย
ทำไม Jujutsu (jj) ถึงน่าสนใจ?
- Auto-Working Copy Commit: ทุกการแก้ไขไฟล์จะถูกบันทึกเป็น Draft Commit ให้อัตโนมัติ ไม่จำเป็นต้องคอยรัน
git addหรือกังวลว่าโค้ดที่ยังไม่เขียน commit message จะหาย - First-class Conflict Handling: เมื่อเกิด Merge Conflict ตัว
jjจะบันทึกสถานะ conflict ลงใน commit นั้นได้เลย โดยไม่ต้องหยุดกระบวนการ rebase หรือ merge คุณสามารถสลับไปทำ feature อื่นก่อน แล้วค่อยกลับมาแก้ conflict ทีหลังได้ - ระบบ Undo ที่แท้จริง (
jj undo): มี Operation Log บันทึกทุกการกระทำของคำสั่งjjช่วยให้คุณย้อนเวลากลับไปสถานะก่อนหน้าได้เกือบทุกกรณี หมดกังวลเรื่องทำ repo พัง - ไม่มี Staging Area: ตัดความซับซ้อนของ Staging Area ออกไป โดยเน้นการจัดการผ่าน Commit (Revision) โดยตรง
1. การเริ่มต้นและตั้งค่า Repository (Initialization & Config)
คุณสามารถเริ่มใช้ jj กับโปรเจกต์ใหม่ หรือใช้ครอบบน Git Repository เดิมที่มีอยู่แล้วได้ทันที
- สร้าง Repository ใหม่ด้วย
jj:
jj git init
- ใช้
jjร่วมกับ Git Repo เดิมที่มีอยู่แล้ว (.gitโฟลเดอร์เดิม):
jj git init --colocated
- Clone จาก Remote Server (GitHub/GitLab):
jj git clone <URL> [DIRECTORY]
- การตั้งค่าผู้ใช้งาน (Global Config):
jj config set --user user.name "Your Name"
jj config set --user user.email "[email protected]"
- ดูการตั้งค่าทั้งหมด:
jj config list
2. ขั้นตอนการทำงานพื้นฐาน (Basic Workflow)
การทำงานใน jj จะเน้นการสลับไปยัง Change (Revision) ต่างๆ และใส่ข้อมูล Description เมื่อพร้อม
[root] ---> [Commit A] ---> [Commit B] ---> [ @ (Working Copy)]
การตรวจสอบสถานะและประวัติ
- ดูประวัติ Commit ทั้งหมด (แสดงเป็น Graph):
jj log
- ดูสถานะไฟล์ที่มีการเปลี่ยนแปลงใน Working Copy ปัจจุบัน:
jj status
# หรือคำสั่งย่อ
jj st
- ดูรายละเอียดสิ่งที่ปรับเปลี่ยนในโค้ด (Diff):
jj diff
การบันทึกงานและการสร้าง Change ใหม่
ใน jj จุดที่คุณกำลังยืนทำงานอยู่เรียกว่าสัญลักษณ์ @ (Working Copy)
- ใส่ข้อความ Description ให้กับ Change ปัจจุบัน:
jj describe -m "feat: add authentication API"
- แตกงานชิ้นใหม่ต่อจากปัจจุบัน (เซฟงานเก่าแล้วเริ่มแผ่นงานใหม่):
jj new
- สร้าง Change ใหม่ต่อจาก Branch หลัก (เช่น
main):
jj new main -m "fix: resolve navigation bug"
3. การจัดการ Commit และการแก้ไขประวัติ (Revision Operations)
jj ช่วยให้การแก้ไข ตัดต่อ หรือย้าย Commit ในอดีตกลายเป็นเรื่องง่ายและปลอดภัย
- กลับไปแก้ไข Commit ในอดีต:
jj edit <CHANGE_ID>
- รวมงานปัจจุบันเข้ากับ Commit ก่อนหน้า (Squash):
jj squash
(หรือเลือกเฉพาะบางไฟล์/บางบรรทัดด้วยjj squash -i)
- แยก Commit ปัจจุบันออกเป็น 2 Commit:
jj split
- คัดลอก Commit มารวมในงานปัจจุบัน (คล้าย Cherry-pick):
jj duplicate <CHANGE_ID>
- ละทิ้ง/ลบ Commit นั้นทิ้ง (Abandon):
jj abandon [CHANGE_ID]
(หากไม่ระบุ ID จะเป็นการทิ้ง Change ปัจจุบันที่กำลังทำอยู่)
4. การจัดระเบียบและการย้าย Commit (Rebasing)
คุณสามารถย้าย Commit หรือกลุ่มของ Commit ไปต่อท้ายตำแหน่งอื่นได้อย่างรวดเร็ว
- ย้าย Change ปัจจุบันไปต่อท้าย Destination:
jj rebase -d <TARGET_CHANGE_ID>
- ย้ายเฉพาะ Revision ที่ระบุ:
jj rebase -r <CHANGE_ID> -d <TARGET_CHANGE_ID>
- ย้ายทั้ง Branch (Revision นั้นพร้อมตัวลูกทั้งหมด):
jj rebase -s <START_CHANGE_ID> -d main
5. การจัดการ Bookmarks (แนวคิดเดียวกับ Branch ใน Git)
ใน jj คุณไม่ต้องสลับ Branch เพื่อเปลี่ยนบริบทการทำงาน Bookmark มีไว้สำหรับการตั้งชื่ออ้างอิงและใช้สื่อสารกับ Remote Server
- ดูรายการ Bookmark ทั้งหมด:
jj bookmark list
- สร้าง Bookmark ที่ Change ปัจจุบัน:
jj bookmark create feature-login
- ย้าย Bookmark ไปยัง Change อื่น:
jj bookmark move feature-login --to @
- ลบ Bookmark:
jj bookmark delete feature-login
- ติดตาม Branch จาก Remote:
jj bookmark track feature-login@origin
6. การทำงานกับ Remote Server (Push & Pull)
- ดึงข้อมูลอัปเดตล่าสุดจาก Server:
jj git fetch
- ส่งงานขึ้น Server (Push Bookmark):
jj git push --bookmark feature-login
- Push Bookmark ทั้งหมดที่มีการเปลี่ยนแปลง:
jj git push --all
- ดูรายการ Remote Server:
jj git remote list
7. ระบบการย้อนเวลาและ Safety Nets (Undo & Operation Log)
หากทำคำสั่งผิดพลาด ไม่ต้องกังวลเพราะ jj บันทึกทุกคำสั่งไว้ใน Operation Log
- ย้อนกลับคำสั่งล่าสุดทันที:
jj undo
- ดูประวัติคำสั่ง Operation ทั้งหมดที่เคยรัน:
jj op log
- ย้อนกลับระบบไปยังสถานะตาม Operation ID ที่ระบุ:
jj op undo <OPERATION_ID>
8. การกรองข้อมูลประวัติขั้นสูงด้วย Revsets
คุณสามารถกรองคำสั่ง jj log เพื่อดูเฉพาะข้อมูลที่ต้องการได้ด้วยไวยากรณ์ Revsets
- ดูเฉพาะ Change ปัจจุบันและ Parent:
jj log -r "@ | @-"
- ดู Change ทั้งหมดที่เราสร้างแต่ยังไม่ได้ Push ขึ้น Remote:
jj log -r "mine() ~ remote_bookmarks()"
- ค้นหา Commit ที่มีคำเฉพาะใน Description:
jj log -r "description(fix)"
ตารางเปรียบเทียบคำสั่ง: Git vs Jujutsu
| รูปแบบการทำงาน | คำสั่ง Git | คำสั่ง Jujutsu (jj) |
|---|---|---|
| เช็คสถานะ | git status | jj status |
| ดูประวัติ | git log --graph --oneline | jj log |
| บันทึกงานใหม่ | git add .git commit -m "msg" | jj describe -m "msg"jj new |
| สลับไปทำงานอื่น | git checkout -b branch-name | jj new main |
| ย้อนคำสั่งผิด | git reflog + git reset --hard | jj undo |
| รวม Commit | git rebase -i HEAD~N (Squash) | jj squash |
| อัปเดตโค้ดจาก Server | git fetch + git rebase | jj git fetch + jj rebase -d main |
| ส่งงานขึ้น Server | git push origin branch-name | jj git push --bookmark name |
สรุปสัญลักษณ์สำคัญใน Jujutsu
@: Working Copy หรือจุดที่คุณกำลังเปิดทำงานอยู่ในปัจจุบัน@-: Parent Revision (อันก่อนหน้าปัจจุบัน 1 Step)@+: Child Revision (อันถัดไปจากปัจจุบัน)root(): จุดเริ่มต้นแรกสุดของ Repository
ด้วยโครงสร้างคำสั่งทั้งหมดนี้ คุณสามารถใช้ Jujutsu (jj) ในการพัฒนาซอฟต์แวร์ได้อย่างเต็มรูปแบบ โดยได้รับทั้งความรวดเร็ว ความปลอดภัยในการจัดการโค้ด และไม่ต้องกังวลเรื่องข้อผิดพลาดจากการใช้คำสั่ง Git แบบเดิมอีกต่อไป
อ่านเพิ่มเติม