การทำงานของ Jujutsu (jj) มีสถาปัตยกรรมและแนวคิดหลักที่แตกต่างจาก Git อย่างชัดเจน โดยเปลี่ยนจากการจัดการ State ด้วย Index และ Head มาเป็นระบบ Working Copy ที่เป็น Commit เสมอ ร่วมกับ Operation Log ครับ
flowchart TD
subgraph Git
direction TB
G1(main) --> G2(commit A)
G2 --> G3(commit B)
end
subgraph Jujutsu
direction TB
J1(change A) --> J2(change B\n\depends on A\)
end
subgraph JujutsuChangeGraph
direction TB
C1(( )) --> C2[refactor database\n layer]
C1 --> C3[add caching]
C3 --> C4[fix bug in parser]
C4 --> C5(main)
end4 แนวคิดหลักในการทำงานของ Jujutsu
- Working Copy is a Commit
ใน Git คุณจะมีพื้นที่ Staging Area (Index) และ Uncommitted Changes แยกจาก History แต่ในjjทุกการพิมพ์หรือแก้ไฟล์ในเครื่องจะถูกมองเป็น Commit ปัจจุบัน (Working Copy Commit) ทันที- คุณไม่ต้องสั่ง
git addหรือgit commitระหว่างพิมพ์โค้ด - เมื่อคุณต้องการเริ่มงานใหม่ คุณแค่สั่ง
jj newเพื่อแตก Commit ถัดไป - โค้ดที่คุณพิมพ์ค้างไว้จะไม่มีทางหายเพราะถูก snapshot ไว้ใน History ตลอดเวลา
- คุณไม่ต้องสั่ง
- Operation Log (Undo ได้ทุกอย่าง)
jjบันทึกทุกคำสั่งที่คุณรันลงใน Operation Log (jj op log) ไม่ว่าจะเป็นการ rebase, edit, split หรือ merge- หากทำอะไรผิดพลาด สามารถย้อนเวลากลับด้วย
jj undoหรือสั่งjj op restore <operation-id>เพื่อดึง state ก่อนหน้านั้นกลับมาได้ทันที - แตกต่างจาก
git reflogที่ซับซ้อนและครอบคลุมไม่ครบทุกการกระทำ
- First-class Conflicts (เก็บ Conflict ไว้ใน Commit ได้)
- เมื่อเกิด Merge หรือ Rebase Conflict ใน Git กระบวนการจะหยุด (abort/pause) และบังคับให้คุณแก้ Conflict ทันที แต่ใน
jj: - Conflict จะถูกบันทึกเป็น State อยู่ ข้างใน Commit นั้นเลย
- คุณสามารถสลับไปทำงานส่วนอื่นก่อน แล้วค่อยกลับมาแก้ Conflict เมื่อพร้อม
- สามารถ Push หรือแชร์ Commit ที่ติด Conflict ไปให้คนอื่นช่วยแก้ได้
- เมื่อเกิด Merge หรือ Rebase Conflict ใน Git กระบวนการจะหยุด (abort/pause) และบังคับให้คุณแก้ Conflict ทันที แต่ใน
- Working Copy & Change ID Architecture
jjแยกความหมายของ Commit ออกเป็น 2 ส่วน:- Change ID: Identifier ของตัว “งาน” (คงที่แม้จะมีการ Rebase หรือ Edit)
- Commit ID: Hash ของเนื้อหา (เปลี่ยนทุกครั้งที่มีการแก้ไข เหมือน Git Commit Hash)
การแยกนี้ทำให้การ Rebase หรือ Amend ประวัติโค้ดมีความเสถียร ไม่หลุด Tracking และใช้งานง่ายกว่าการอ้างอิงด้วย SHA-1 แบบเดิม
เปรียบเทียบ Workflow การใช้งาน
| การกระทำ | Git Workflow | Jujutsu (jj) Workflow |
| เริ่มเขียนโค้ดใหม่ | git checkout -b feat -> เขียนโค้ด | jj new -> เขียนโค้ดทันที |
| บันทึกงาน | git add . -> git commit -m "msg" | jj describe -m "msg" (เนื้อหาอัปเดตให้อัตโนมัติ) |
| สลับไปทำ Hotfix | git stash -> git checkout main | jj new main (สลับได้ทันที ไม่ต้อง stash) |
| ย้อนคำสั่งล่าสุด | git reset --hard HEAD~1 (เสี่ยงโค้ดหาย) | jj undo (ปลอดภัย 100%) |
อ่านเพิ่มเติม