คุณเคยเจอสถานการณ์แบบนี้ไหม? กำลังพัฒนารีเจอร์ใหม่ที่ซับซ้อน แต่จู่ๆ ก็มี Bug ด่วนเข้ามาที่ต้องแก้ไขทันที
เพื่อสลับสาขา (Branch) คุณต้องจำใจใช้ git stash เพื่อซ่อนโค้ดที่ทำค้างไว้ หลังจากแก้ Bug เสร็จและสลับกลับมา คุณต้องคอยระวังเมื่อใช้ git stash pop ซึ่งบางครั้งอาจต้องเจอกับฝันร้ายของการขัดแย้งของโค้ด (Conflict)
ในความเป็นจริง Git มีเครื่องมือทรงพลังที่ช่วยแก้ปัญหานี้มานานแล้ว นั่นคือ Git Worktree
บอกลาการสลับสาขาและการ Stash ที่วุ่นวาย แล้วเริ่มต้นการพัฒนาแบบ Multi-thread ด้วย Worktree
บทความนี้จะพาคุณไปทำความเข้าใจกลไกหลักและการใช้งานจริงในทางปฏิบัติ
Git Worktree แตกต่างจาก Git Branch อย่างไร?
เพื่อทำความเข้าใจ Git Worktree ให้เราเริ่มจากทำความเข้าใจความแตกต่างระหว่างมันกับ Git Branch ก่อน
เราสามารถเปรียบเทียบการควบคุมเวอร์ชันเหมือนการอ่านหนังสือ:
Commitคือ เวอร์ชันของหนังสือBranchคือ ที่คั่นหนังสือในหน้าเฉพาะWorktreeคือ โต๊ะทำงานที่คุณกางหนังสือออก
ในวิธีการแบบดั้งเดิม เรามีโต๊ะทำงานเพียงตัวเดียว เมื่อใดก็ตามที่ต้องการสลับที่คั่นหนังสือ เราต้องเก็บเอกสารทั้งหมดที่กำลังแก้ไขอยู่บนโต๊ะหรือซ่อนไว้ในเก๊ะ (ซึ่งก็คือ git stash)
แต่ Git Worktree ช่วยให้คุณมี โต๊ะทำงานที่เป็นอิสระ หลายตัวพร้อมกัน
| รายการเปรียบเทียบ | Git Branch | Git Worktree |
|---|---|---|
| แนวคิด Workspace | แชร์ไดเรกทอรีทำงานทางกายภาพเดียว | มีไดเรกทอรีทำงานทางกายภาพที่เป็นอิสระหลายแห่ง |
| ต้นทุนการสลับ | ต้องทำการ Commit, Stash หรือพักการเปลี่ยนแปลง | ไม่ต้อง Stash เพียงแค่เปลี่ยนไดเรกทอรีก็สลับได้ทันที |
| ความปลอดภัยและการแยกส่วน | ไฟล์ที่ยังไม่ได้ Commit อาจเกิดข้อขัดแย้งหรือค้างอยู่ | ไดเรกทอรีถูกแยกออกอย่างสมบูรณ์ ไม่รบกวนซึ่งกันและกัน |
| ประวัติการทำงาน | แชร์ประวัติ Git Commit และ Branch ร่วมกัน | แชร์ประวัติ Git Commit และ Branch ร่วมกัน |
Branch ปัจจุบัน, Staging Area และไฟล์ที่ยังไม่ได้ Commit ของแต่ละ Worktree จะแยกออกจากกันโดยสิ้นเชิง แต่พวกมันจะ แชร์ประวัติ Commit และบันทึก Branch ทั้งหมดร่วมกัน
Branch คือที่คั่นหนังสือเวอร์ชัน ส่วน Worktree คือโต๊ะทำงานจริง
ด้วยวิธีนี้ เมื่อคุณต้องการสลับงาน คุณเพียงแค่เปิดไดเรกทอรีโฟลเดอร์อื่น โดยไม่ต้องแตะต้องสถานะการพัฒนาในปัจจุบันเลย
เริ่มต้นใช้งาน Git Worktree อย่างไร?
เมื่อนำ Git Worktree มาใช้ในโปรเจกต์จริง การวางแผนไดเรกทอรีที่ดีจะช่วยให้การพัฒนาราบรื่นยิ่งขึ้น
ขอแนะนำให้รักษาไดเรกทอรีโปรเจกต์ที่ git clone มาแต่แรกให้เป็นสำนักงานใหญ่ main ที่สะอาด และวางไดเรกทอรี Worktree ที่สร้างขึ้นใหม่ไว้ภายนอกโปรเจกต์ (เช่น ../my-app-worktrees) เพื่อป้องกันข้อผิดพลาดจากการที่เครื่องมือพัฒนาสแกนโฟลเดอร์แบบวนซ้ำ
ขั้นตอนคำสั่งที่ใช้บ่อยมีดังนี้:
| ขั้นตอน | คำสั่ง |
|---|---|
| 1. สร้าง Worktree ใหม่พร้อมสร้าง Branch ใหม่ | git worktree add ../my-app-worktrees/feature-login -b feature-login |
| 2. ดูรายการ Worktree ทั้งหมดในปัจจุบัน | git worktree list |
Git Worktree เหมาะเป็นอย่างยิ่งสำหรับการจัดการงานพัฒนาของ AI Agent
คุณสามารถมอบไดเรกทอรี Worktree ที่เป็นอิสระให้กับ AI Agent เพื่อแก้ไขและทดสอบได้อย่างเต็มที่ ในขณะที่นักพัฒนาที่เป็นมนุษย์สามารถทำการตรวจสอบโค้ด (Review) และทดสอบในอีก Worktree หนึ่งได้
มอบ Worktree ที่เป็นอิสระให้ AI Agent เพื่อให้การพัฒนาด้วย AI และการตรวจสอบโดยมนุษย์ดำเนินไปพร้อมกันได้
ทั้งสองทำงานในไดเรกทอรีทางกายภาพของตนเอง ซึ่งปลอดภัยและชัดเจน
รวมโค้ดและทำความสะอาดอย่างปลอดภัยหลังจากพัฒนาเสร็จได้อย่างไร?
หลังจากที่คุณพัฒนางานใน Worktree ที่เป็นอิสระเสร็จสิ้นแล้ว จะรวมผลงานและทำความสะอาดอย่างไร?
โปรดจำแนวคิดสำคัญไว้: ตัวไดเรกทอรี Worktree เองไม่จำเป็นต้องรวม สิ่งที่ต้องรวมจริงๆ คือ Branch
คุณเพียงแค่กลับไปที่ไดเรกทอรีโต๊ะทำงาน main และรันคำสั่ง git merge กับ Branch ฟีเจอร์ที่เกี่ยวข้องเพื่อเสร็จสิ้นการรวมโค้ด
สำหรับการทำความสะอาด โปรดทำตามขั้นตอนมาตรฐาน 2 ขั้นตอน:
| ขั้นตอน | คำสั่ง |
|---|---|
| 1. ลบไดเรกทอรีทางกายภาพของ Worktree | git worktree remove ../my-app-worktrees/feature-login |
| 2. ลบ Branch ฟีเจอร์ที่เสร็จสมบูรณ์แล้ว | git branch -d feature-login |
ลบไดเรกทอรี Worktree ก่อน แล้วจึงลบ Branch
โปรดใช้คำสั่ง git worktree remove ในการทำความสะอาดเสมอ อย่าลบโฟลเดอร์ด้วยตนเองในตัวจัดการไฟล์
กับดักที่พบบ่อยเมื่อใช้ Git Worktree มีอะไรบ้าง?
แม้ว่า Git Worktree จะสะดวกมาก แต่มีกับดักบางอย่างที่ต้องระวังเป็นพิเศษ
กับดักที่ 1: การเปลี่ยนแปลงที่ยังไม่ได้ Commit จะสูญหาย
แม้ว่าการลบ Worktree จะไม่ลบ Branch แต่หากคุณยังมีการเปลี่ยนแปลงที่ไม่ได้ commit ในไดเรกทอรีนั้น การลบไดเรกทอรี Worktree แบบบังคับจะทำให้การเปลี่ยนแปลงเหล่านั้นสูญหายไปทันที
กับดักที่ 2: ความขัดแย้งจากการยึดครอง Branch
กลไกการป้องกันของ Git ไม่อนุญาตให้ Checkout Branch เดียวกันใน Worktree สองแห่งพร้อมกัน หากคุณพยายามสลับไปยัง Branch ที่ถูกใช้งานอยู่แล้วใน Worktree ที่สอง Git จะบล็อกและแสดงข้อความแสดงข้อผิดพลาดทันที
การลบ Worktree แบบบังคับจะทำให้สูญเสียการเปลี่ยนแปลงที่ยังไม่ได้ Commit
เพียงแค่เข้าใจคุณลักษณะและหลักการเหล่านี้ คุณก็จะสามารถหลีกเลี่ยงข้อผิดพลาดได้
บทสรุป
ด้วย Git Worktree เราสามารถบอกลาการสลับสาขาที่วุ่นวายและกระบวนการ git stash ได้อย่างสิ้นเชิง และบรรลุการพัฒนาแบบ Multi-thread ที่แท้จริง
ครั้งต่อไปที่คุณต้องแก้ Bug ด่วน, พัฒนาหลายฟีเจอร์พร้อมกัน หรือมอบหมายงานเขียนโค้ดให้ AI Agent ลองเปิดโต๊ะทำงานใหม่ดูนะครับ!