PlusMagi's Blog By Pitt Phunsanit GIT Jujutsu (jj): VCS ยุคใหม่สำหรับนักพัฒนา โดยไม่ต้องแตะ Git Command หรือ Git GUI

Jujutsu (jj): VCS ยุคใหม่สำหรับนักพัฒนา โดยไม่ต้องแตะ Git Command หรือ Git GUI

Jujutsu (jj) เป็นระบบ Version Control System (VCS) สมัยใหม่ที่ถูกออกแบบมาเพื่อแก้ปัญหาความซับซ้อนของ Git โดยให้ประสบการณ์การทำงานที่ปลอดภัย ปรับแต่งง่าย และมีประสิทธิภาพสูงกว่า แม้ว่าเบื้องหลัง jj จะสามารถทำงานร่วมกับ Git Repository (GitHub, GitLab, Bitbucket) ได้อย่างไร้รอยต่อ แต่การทำงานประจำวันของคุณสามารถทำผ่านคำสั่งของ jj ได้ทั้งหมด 100% โดยไม่ต้องพิมพ์คำสั่ง git หรือเปิดโปรแกรม Git GUI อีกเลย


ทำไม Jujutsu (jj) ถึงน่าสนใจ?

  1. Auto-Working Copy Commit: ทุกการแก้ไขไฟล์จะถูกบันทึกเป็น Draft Commit ให้อัตโนมัติ ไม่จำเป็นต้องคอยรัน git add หรือกังวลว่าโค้ดที่ยังไม่เขียน commit message จะหาย
  2. First-class Conflict Handling: เมื่อเกิด Merge Conflict ตัว jj จะบันทึกสถานะ conflict ลงใน commit นั้นได้เลย โดยไม่ต้องหยุดกระบวนการ rebase หรือ merge คุณสามารถสลับไปทำ feature อื่นก่อน แล้วค่อยกลับมาแก้ conflict ทีหลังได้
  3. ระบบ Undo ที่แท้จริง (jj undo): มี Operation Log บันทึกทุกการกระทำของคำสั่ง jj ช่วยให้คุณย้อนเวลากลับไปสถานะก่อนหน้าได้เกือบทุกกรณี หมดกังวลเรื่องทำ repo พัง
  4. ไม่มี 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 statusjj status
ดูประวัติgit log --graph --onelinejj log
บันทึกงานใหม่git add .
git commit -m "msg"
jj describe -m "msg"
jj new
สลับไปทำงานอื่นgit checkout -b branch-namejj new main
ย้อนคำสั่งผิดgit reflog + git reset --hardjj undo
รวม Commitgit rebase -i HEAD~N (Squash)jj squash
อัปเดตโค้ดจาก Servergit fetch + git rebasejj git fetch + jj rebase -d main
ส่งงานขึ้น Servergit push origin branch-namejj git push --bookmark name

สรุปสัญลักษณ์สำคัญใน Jujutsu

  • @ : Working Copy หรือจุดที่คุณกำลังเปิดทำงานอยู่ในปัจจุบัน
  • @- : Parent Revision (อันก่อนหน้าปัจจุบัน 1 Step)
  • @+ : Child Revision (อันถัดไปจากปัจจุบัน)
  • root() : จุดเริ่มต้นแรกสุดของ Repository

ด้วยโครงสร้างคำสั่งทั้งหมดนี้ คุณสามารถใช้ Jujutsu (jj) ในการพัฒนาซอฟต์แวร์ได้อย่างเต็มรูปแบบ โดยได้รับทั้งความรวดเร็ว ความปลอดภัยในการจัดการโค้ด และไม่ต้องกังวลเรื่องข้อผิดพลาดจากการใช้คำสั่ง Git แบบเดิมอีกต่อไป


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