การทำงานของ Jujutsu (jj) มีสถาปัตยกรรมและแนวคิดหลักที่แตกต่างจาก Git อย่างชัดเจน โดยเปลี่ยนจากการจัดการ State ด้วย Index และ Head มาเป็นระบบ Working Copy ที่เป็น Commit เสมอ ร่วมกับ Operation Log ครับ
Plain Text
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)
end
4 แนวคิดหลักในการทำงานของ 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%) |
อ่านเพิ่มเติม