ป้ายกำกับ: abort

Jujutsu (jj): ต่างจาก GIT อย่างไรJujutsu (jj): ต่างจาก GIT อย่างไร

การทำงานของ 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)
    end

4 แนวคิดหลักในการทำงานของ Jujutsu

  1. 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 ตลอดเวลา
  2. Operation Log (Undo ได้ทุกอย่าง)
    • jj บันทึกทุกคำสั่งที่คุณรันลงใน Operation Log (jj op log) ไม่ว่าจะเป็นการ rebase, edit, split หรือ merge
    • หากทำอะไรผิดพลาด สามารถย้อนเวลากลับด้วย jj undo หรือสั่ง jj op restore <operation-id> เพื่อดึง state ก่อนหน้านั้นกลับมาได้ทันที
    • แตกต่างจาก git reflog ที่ซับซ้อนและครอบคลุมไม่ครบทุกการกระทำ
  3. First-class Conflicts (เก็บ Conflict ไว้ใน Commit ได้)
    • เมื่อเกิด Merge หรือ Rebase Conflict ใน Git กระบวนการจะหยุด (abort/pause) และบังคับให้คุณแก้ Conflict ทันที แต่ใน jj:
    • Conflict จะถูกบันทึกเป็น State อยู่ ข้างใน Commit นั้นเลย
    • คุณสามารถสลับไปทำงานส่วนอื่นก่อน แล้วค่อยกลับมาแก้ Conflict เมื่อพร้อม
    • สามารถ Push หรือแชร์ Commit ที่ติด Conflict ไปให้คนอื่นช่วยแก้ได้
  4. 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 WorkflowJujutsu (jj) Workflow
เริ่มเขียนโค้ดใหม่git checkout -b feat -> เขียนโค้ดjj new -> เขียนโค้ดทันที
บันทึกงานgit add . -> git commit -m "msg"jj describe -m "msg" (เนื้อหาอัปเดตให้อัตโนมัติ)
สลับไปทำ Hotfixgit stash -> git checkout mainjj new main (สลับได้ทันที ไม่ต้อง stash)
ย้อนคำสั่งล่าสุดgit reset --hard HEAD~1 (เสี่ยงโค้ดหาย)jj undo (ปลอดภัย 100%)

อ่านเพิ่มเติม