Featured image of post ทำไมต้อง git stash ทุกครั้งที่สลับสาขา? Git Worktree คืออะไร? Git Worktree ต่างจาก Git Branch อย่างไร? วิธีใช้ Git Worktree สร้างกระบวนการพัฒนา Multi-thread ประสิทธิภาพสูง

ทำไมต้อง git stash ทุกครั้งที่สลับสาขา? Git Worktree คืออะไร? Git Worktree ต่างจาก Git Branch อย่างไร? วิธีใช้ Git Worktree สร้างกระบวนการพัฒนา Multi-thread ประสิทธิภาพสูง

กำลังพัฒนาฟีเจอร์ใหม่แต่เจอ Bug ด่วน? เลิกซ่อนโค้ดด้วย git stash ได้แล้ว! แนะนำแนวคิดหลักของ Git Worktree, ความแตกต่างจาก Git Branch, การวางโครงสร้างไดเรกทอรี และแนวทางปฏิบัติที่ดีที่สุดร่วมกับ AI Agent

คุณเคยเจอสถานการณ์แบบนี้ไหม? กำลังพัฒนารีเจอร์ใหม่ที่ซับซ้อน แต่จู่ๆ ก็มี 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 ลองเปิดโต๊ะทำงานใหม่ดูนะครับ!

Reference

All rights reserved,未經允許不得隨意轉載
ถูกสร้างด้วย Hugo
ธีม Stack ออกแบบโดย Jimmy