บทเรียน Git ของ Ry
คู่มือที่ครอบคลุมเกี่ยวกับระบบควบคุมเวอร์ชัน Git ตั้งแต่การใช้งานพื้นฐาน เช่น การเตรียมงานและการบันทึกการเปลี่ยนแปลง ไปจนถึงหัวข้อขั้นสูง เช่น การรีเบสแบบโต้ตอบ การทำงานร่วมกันผ่านระยะไกล และการทำงานภายในของฐานข้อมูลวัตถุใน Git
ภาพรวมคอร์สเรียน
📚 สรุปเนื้อหา
คู่มือที่ครอบคลุมเกี่ยวกับระบบควบคุมเวอร์ชัน Git ตั้งแต่การใช้งานพื้นฐาน เช่น การจัดเตรียมไฟล์และการบันทึกเปลี่ยนแปลง ไปจนถึงหัวข้อขั้นสูง เช่น การรวมงานแบบโต้ตอบ (interactive rebasing) การทำงานร่วมกันผ่านเครือข่าย และโครงสร้างพื้นฐานภายในของฐานข้อมูลวัตถุใน Git
เชี่ยวชาญระบบควบคุมเวอร์ชันที่ได้รับความนิยมที่สุดในโลก ตั้งแต่คำสั่งพื้นฐานไปจนถึงแก่นแท้ของระบบ
ผู้เขียน: ไรอัน ฮอดสัน
ขอบคุณ: ไม่มีการกล่าวถึงอย่างเป็นทางการในส่วนนำ
🎯 เป้าหมายการเรียนรู้
- เปรียบเทียบและแยกแยะระบบควบคุมเวอร์ชันแบบท้องถิ่น (Local) แบบศูนย์กลาง (Centralized) และแบบกระจาย (Distributed)
- ระบุแรงจูงใจทางประวัติศาสตร์ที่นำไปสู่การสร้าง Git สำหรับโปรเจกต์เคอร์เนลลินุกซ์
- ดำเนินการตั้งค่าเบื้องต้นของ Git รวมถึงการตรวจสอบการติดตั้ง สร้างโครงการเริ่มต้น และติดตามไฟล์
- สร้างเรพโอซิทอรี Git และระบุบทบาทของไดเรกทอรี
.git - กำหนดค่าการตั้งค่าผู้ใช้ทั่วไป และติดตามไฟล์โปรเจกต์โดยใช้พื้นที่เตรียม (staging area)
- ดำเนินการบันทึก (commit) เพื่อสร้างภาพรวมสถานะโปรเจกต์ และตรวจสอบประวัติการเปลี่ยนแปลงในเรพโอซิทอรี
- ย้ายไปยังการเปลี่ยนแปลงในอดีตเฉพาะเจาะจงโดยใช้รหัส (ID) และกลับมาสู่สถานะปัจจุบันของโปรเจกต์
- สร้างและจัดการแท็กที่มีคำอธิบายเพื่อระบุเวอร์ชันที่เสถียร
- ใช้
git revertเพื่อย้อนการเปลี่ยนแปลงที่บันทึกแล้ว โดยคงประวัติให้โปร่งใส - ระบุ สร้าง และสลับระหว่างสาขา (branch) โดยใช้ไลน์อินเตอร์เฟซของ Git
🔹 บทเรียนที่ 1: ประวัติและหลักการพื้นฐานของการควบคุมเวอร์ชัน
ภาพรวม: บทเรียนนี้ติดตามการพัฒนาของระบบควบคุมเวอร์ชันตั้งแต่การจัดการไฟล์ด้วยมือ ไปจนถึงระบบที่ซับซ้อนแบบกระจายศูนย์กลาง รายละเอียดความแตกต่างทางสถาปัตยกรรมระหว่างระบบควบคุมเวอร์ชันแบบท้องถิ่น แบบศูนย์กลาง และแบบกระจาย (VCS) และอธิบายบริบททางประวัติศาสตร์ที่นำไปสู่การสร้าง Git โดยเฉพาะสำหรับเคอร์เนลลินุกซ์ นักเรียนจะได้เรียนรู้ขั้นตอนพื้นฐานในการติดตั้ง Git และเริ่มต้นสร้างเรพโอซิทอรีครั้งแรก
ผลลัพธ์การเรียนรู้:
- เปรียบเทียบและแยกแยะระบบควบคุมเวอร์ชันแบบท้องถิ่น แบบศูนย์กลาง และแบบกระจาย
- ระบุแรงจูงใจทางประวัติศาสตร์ที่นำไปสู่การสร้าง Git สำหรับเคอร์เนลลินุกซ์
- ดำเนินการตั้งค่าเบื้องต้นของ Git รวมถึงการตรวจสอบการติดตั้ง สร้างเรพโอซิทอรี และติดตามไฟล์
🔹 บทเรียนที่ 2: ทักษะพื้นฐาน: การจัดเตรียมและบันทึก
ภาพรวม: บทเรียนนี้ครอบคลุมวงจรการทำงานพื้นฐานของเรพโอซิทอรี Git ตั้งแต่โฟลเดอร์โปรเจกต์ปกติ ไปจนถึงสภาพแวดล้อมที่มีการควบคุมเวอร์ชัน นักเรียนจะได้เรียนรู้การเริ่มต้นเรพโอซิทอรี การตั้งค่าตัวตนผู้ใช้ การติดตามไฟล์ใหม่ และการจัดการกระบวนการเปลี่ยนแปลงจากพื้นที่เตรียม (staging area) ไปสู่ประวัติการบันทึกที่คงที่
ผลลัพธ์การเรียนรู้:
- สร้างเรพโอซิทอรี Git และระบุบทบาทของไดเรกทอรี
.git - ตั้งค่าผู้ใช้ทั่วไป และติดตามไฟล์โปรเจกต์โดยใช้พื้นที่เตรียม (staging area)
- ดำเนินการบันทึกเพื่อสร้างภาพรวมสถานะโปรเจกต์ และตรวจสอบประวัติการเปลี่ยนแปลงในเรพโอซิทอรี
🔹 บทเรียนที่ 3: การยกเลิกการเปลี่ยนแปลงและการสำรวจประวัติ
ภาพรวม: บทเรียนนี้ครอบคลุมเทคนิคพื้นฐานของ Git สำหรับการเดินทางย้อนเวลาภายในเรพโอซิทอรี ซึ่งช่วยให้นักพัฒนาสามารถตรวจสอบสถานะในอดีต ตั้งจุดสำคัญ และย้อนกลับข้อผิดพลาดอย่างปลอดภัย ผู้เรียนจะได้เชี่ยวชาญความสามารถในการดูรุ่นเก่าโดยไม่ทำให้เกิดการเปลี่ยนแปลงถาวร ใช้แท็กที่มีคำอธิบายเพื่อติดป้ายเวอร์ชันที่ออกใหม่ และแยกแยะระหว่างการย้อนการเปลี่ยนแปลงที่บันทึกไว้ กับการล้างงานทดลองที่ยังไม่บันทึก
ผลลัพธ์การเรียนรู้:
- ย้ายไปยังการเปลี่ยนแปลงเฉพาะในอดีตโดยใช้รหัส (ID) และกลับมาสู่สถานะปัจจุบันของโปรเจกต์
- สร้างและจัดการแท็กที่มีคำอธิบายเพื่อระบุเวอร์ชันที่เสถียร
- ใช้
git revertเพื่อย้อนการเปลี่ยนแปลงที่บันทึกแล้ว โดยคงประวัติให้โปร่งใส
🔹 บทเรียนที่ 4: การสร้างสาขาและรวมงานพื้นฐาน
ภาพรวม: บทเรียนนี้ครอบคลุมวงจรการทำงานพื้นฐานของสาขาใน Git ตั้งแต่แนวคิดว่าสาขาเป็นเส้นทางพัฒนาที่แยกจากกัน ไปจนถึงการปฏิบัติจริง นักเรียนจะได้เรียนรู้การสร้าง นำทาง และแสดงภาพรวมของประวัติที่แยกออก (forked history) พร้อมการรวมงานผ่านการรวมแบบ "Fast-forward" และ "3-way merge" และการลบสาขาชั่วคราวหลังเสร็จสิ้น
ผลลัพธ์การเรียนรู้:
- ระบุ สร้าง และสลับระหว่างสาขาโดยใช้ไลน์อินเตอร์เฟซของ Git
- อ่านแผนภาพประวัติการเปลี่ยนแปลงที่แยกออก เพื่อเข้าใจความสัมพันธ์ระหว่าง
masterกับสาขาฟีเจอร์ - ดำเนินการและแยกแยะระหว่าง "การรวมแบบ Fast-forward" และ "การรวมแบบ 3 ทาง"
🔹 บทเรียนที่ 5: การสร้างสาขาขั้นสูงและการแก้ไขข้อขัดแย้ง
ภาพรวม: บทเรียนนี้สำรวจการดำเนินการขั้นสูงใน Git ที่จำเป็นเมื่อประวัติโปรเจกต์แยกทางกัน ครอบคลุมกลไกทางทฤษฎีของการรวมแบบ 3 ทาง ใช้แฟลก -a เพื่อทำให้การบันทึกมีประสิทธิภาพมากขึ้น และจัดการสาขาฟีเจอร์ที่ใช้งานนาน นักเรียนจะได้เรียนรู้การจัดการปฏิสัมพันธ์ระหว่างสาขาที่ซับซ้อน การแก้ไขข้อขัดแย้งการรวมงานด้วยตนเอง และรักษาความสะอาดของเรพโอซิทอรีผ่านการลบสาขาที่ไม่จำเป็น
ผลลัพธ์การเรียนรู้:
- อธิบายความแตกต่างทางโครงสร้างระหว่างการรวมแบบ Fast-forward และการรวมแบบ 3 ทาง
- ใช้แฟลก
-aเพื่อรวมการจัดเตรียมและบันทึกไฟล์ที่ติดตามไว้ในครั้งเดียว - ระบุและแก้ไขข้อขัดแย้งการรวมโดยตีความเครื่องหมายข้อขัดแย้งของ Git
🔹 บทเรียนที่ 6: การรวมงานเพื่อประวัติโปรเจกต์ที่เรียบง่าย
ภาพรวม: บทเรียนนี้ครอบคลุมเทคนิคการคงประวัติโปรเจกต์ให้เรียบง่ายและเป็นลำดับตรง โดยย้ายและรวมงานบันทึกเข้าด้วยกัน ผู้เรียนจะได้เชี่ยวชาญการเปลี่ยนจากสาขาที่แยกกันไปสู่ลำดับเวลาเดียวกัน โดยใช้การรวมแบบมาตรฐาน การรวมแบบโต้ตอบ (squashing) และความสามารถในการแก้ไขงานบันทึกเฉพาะจุดในกระบวนการนี้ สิ้นสุดบทเรียนนี้ นักเรียนจะเข้าใจวิธีกำจัดงานรวมที่ไม่จำเป็น และนำเสนอรายการบันทึกที่เป็นมืออาชีพและกระชับ
ผลลัพธ์การเรียนรู้:
- เปลี่ยนจุดเริ่มต้นของสาขาฟีเจอร์ไปยังปลายของสาขาอื่น เพื่อเปิดโอกาสให้รวมแบบ Fast-forward
- ใช้การรวมแบบโต้ตอบเพื่อรวมงานบันทึกจำนวนน้อยหลายครั้งให้กลายเป็นแค่หนึ่งภาพรวมที่มีความหมาย
- แก้ไขงานบันทึกเดิมในระหว่างการรวมโดยใช้ฟังก์ชัน
editและ--amend
🔹 บทเรียนที่ 7: การแก้ไขประวัติและความปลอดภัยจาก Reflog
ภาพรวม: บทเรียนนี้สำรวจเทคนิคขั้นสูงของ Git สำหรับการคงประวัติโปรเจกต์ให้สะอาดและมืออาชีพ ผู้เรียนจะได้เชี่ยวชาญการใช้ "Interactive Rebase" เพื่อแก้ไขงานบันทึกในอดีต เรียนรู้กระบวนการทำงานที่แม่นยำในการแยกงานบันทึกทั่วไปออกเป็นงานเล็กๆ ที่มีความหมาย และใช้ "Reflog" เป็นเครื่องมือป้องกันที่ทรงพลังเพื่อฟื้นฟูข้อมูลที่ดูเหมือนหายไป
ผลลัพธ์การเรียนรู้:
- ดำเนินการรวมแบบโต้ตอบเพื่อแก้ไข ปรับเปลี่ยน หรือแยกงานบันทึกในอดีต
- แยกงานบันทึกทั่วไปหนึ่งงานออกเป็นงานที่เป็นอิสระและมีความหมายหลายงาน โดยใช้
git reset --mixed - ใช้ Reflog ของ Git เพื่อค้นหาและฟื้นฟูงานบันทึกที่ "ลอยตัว" (dangling commits) ที่ไม่ได้เชื่อมโยงกับสาขาใดๆ อีกต่อไป
🔹 บทเรียนที่ 8: การทำงานร่วมกันผ่านการส่งและดึงข้อมูล
ภาพรวม: บทเรียนนี้สำรวจแนวทางพื้นฐานสำหรับการทำงานร่วมกันหลายผู้ใช้ใน Git คุณจะได้เรียนรู้วิธีสร้างสำเนาเรพโอซิทอรีที่เป็นอิสระ ตั้งค่าตัวตนท้องถิ่นเพื่อจำลองผู้ใช้คนละคน และตั้งค่าการเชื่อมต่อ "ระยะไกล" เพื่อแลกเปลี่ยนโค้ด บทเรียนนี้เน้นกลไกการดึงข้อมูล (fetch) และการส่งข้อมูล (push) ระหว่างเรพโอซิทอรีเพื่อประสานงานการพัฒนา
ผลลัพธ์การเรียนรู้:
- สำเนาและตั้งค่า: สำเนาเรพโอซิทอรีได้สำเร็จ และตั้งค่าการตั้งค่าระดับท้องถิ่น
- ประสานงานระยะไกล: เพิ่มชื่อตำแหน่งระยะไกล และใช้
fetchและmergeเพื่อนำข้อมูลจากนักพัฒนาคนอื่นมาใช้ - จัดการสถานะระยะไกล: นำทางสาขาที่อยู่ไกล และเข้าใจสถานะ "HEAD แยกตัว" เมื่อตรวจสอบโค้ดที่ไม่ใช่ท้องถิ่น
🔹 บทเรียนที่ 9: โมเดลเรพโอซิทอรีศูนย์กลางที่แบ่งปันกันได้
ภาพรวม: บทเรียนนี้ครอบคลุมการเปลี่ยนจากแนวทางการแชร์เรพโอซิทอรีแบบเพียร-ทู-เพียร ไปสู่แนวทางแบบศูนย์กลาง นักเรียนจะได้เรียนรู้วิธีสร้างเรพโอซิทอรี "เปล่า" (bare repository) เพื่อใช้เป็นศูนย์กลางสื่อสาร ปรับเปลี่ยนการเชื่อมต่อระยะไกลเพื่อใช้ในสภาพแวดล้อมทีม และจัดการการประสานงานการเปลี่ยนแปลง (การส่งและดึง) ระหว่างนักพัฒนาหลายคนเพื่อรักษาประวัติโปรเจกต์ให้สม่ำเสมอ
ผลลัพธ์การเรียนรู้:
- สร้างและตั้งค่าเรพโอซิทอรีเปล่าเพื่อใช้เป็นเซิร์ฟเวอร์ศูนย์กลาง
- จัดการการเชื่อมต่อระยะไกลเพื่อเปลี่ยนแนวทางการใช้งานท้องถิ่นไปยังศูนย์กลาง
- ดำเนินการแนวทางมาตรฐานในการอัปเดตเนื้อหาที่แบ่งปัน และแก้ไขประวัติที่แยกกันโดยใช้
fetch,rebase, และmerge
🔹 บทเรียนที่ 10: โมเดลผู้รวมงานแบบกระจาย
ภาพรวม: บทเรียนนี้สำรวจการเปลี่ยนจากระบบควบคุมเวอร์ชันแบบศูนย์กลาง ไปสู่โมเดลผู้รวมงานแบบกระจาย โดยใช้ Bitbucket เป็นผู้ให้บริการโฮสต์ ผู้เรียนจะเริ่มจากการตั้งค่าเรพโอซิทอรีสาธารณะ ไปจนถึงการจัดการแนวทางที่ซับซ้อน ซึ่งผู้ "ผู้รวมงาน" (Integrator) จะตรวจสอบและรวมการเปลี่ยนแปลงจากเรพโอซิทอรีสาธารณะของนักพัฒนาคนอื่นๆ เข้าสู่เวอร์ชัน официัลของโปรเจกต์
ผลลัพธ์การเรียนรู้:
- ตั้งค่าบัญชี Bitbucket และสร้างเรพโอซิทอรีสาธารณะเพื่อการทำงานร่วมกันแบบกระจาย
- ดำเนินการ "กระบวนการทำงานของผู้รวมงาน" โดยจัดการเรพโอซิทอรีหลายแห่งเพื่อดึง ตรวจสอบ และรวมการเปลี่ยนแปลงจากภายนอก
- รักษาความสอดคล้องระหว่างสภาพแวดล้อมส่วนตัวกับเรพโอซิทอรีที่เปิดเผยต่อสาธารณะในทีมพัฒนา
🔹 บทเรียนที่ 11: การสื่อสารและแนวทางแบบพัช (Patch)
ภาพรวม: บทเรียนนี้ครอบคลุมวงจรการทำงานของพัช (patch) ใน Git ซึ่งเป็นวิธีการแบ่งปันงานบันทึกเฉพาะเจาะจงระหว่างนักพัฒนา โดยไม่จำเป็นต้องมีสิทธิ์เข้าถึงเรพโอซิทอรีศูนย์กลาง นักเรียนจะได้เรียนรู้วิธีสร้างไฟล์พัชจากงานบันทึกในท้องถิ่น แจกจ่ายผ่านอีเมล และรวมพัชที่ได้รับเข้าสู่สาขาหลักของโปรเจกต์
ผลลัพธ์การเรียนรู้:
- สร้างไฟล์พัชเฉพาะเจาะจงจากงานบันทึกหรือสาขาโดยใช้
git format-patch - นำไฟล์พัชภายนอกมาใช้ในเรพโอซิทอรีท้องถิ่นโดยใช้คำสั่ง
git amและการรีไดเรกต์อินพุต - ดำเนินการกระบวนการรวมงานทั้งหมด รวมถึงการทดสอบพัชบนสาขาชั่วคราว และรวมเข้าสู่สาขาหลัก (
master)
🔹 บทเรียนที่ 12: เครื่องมือเสริมของ Git, ฮุก และการเปรียบเทียบขั้นสูง
ภาพรวม: บทเรียนนี้ครอบคลุมคำสั่งเครื่องมือสำคัญของ Git และเทคนิคการปรับแต่งสำหรับการจัดการเรพโอซิทอรีขั้นสูง นักเรียนจะได้เรียนรู้วิธีส่งออกและแบ่งปันเรพโอซิทอรีผ่านการจัดเก็บ (archiving) และการบรรจุ (bundling) รักษาสภาพแวดล้อมที่สะอาดโดยใช้ .gitignore และ stash สร้างสคริปต์อัตโนมัติผ่านระบบฮุกของ Git และปรับปรุงประสบการณ์การใช้ไลน์อินเตอร์เฟซด้วยการเปรียบเทียบขั้นสูงและการตั้งชื่อสั้น (aliases) ที่กำหนดเอง
ผลลัพธ์การเรียนรู้:
- แยกแยะและดำเนินการส่งออกเรพโอซิทอรีโดยใช้การจัดเก็บ (ไม่มีประวัติ) และการบรรจุ (มีประวัติครบ)
- ตั้งค่ารูปแบบการยกเว้นไฟล์ และจัดการงานที่ยังไม่เสร็จ
- ใช้สคริปต์อัตโนมัติในระบบฮุกภายในของ Git และทำให้กระบวนการทำงานราบรื่นด้วยชื่อสั้น (alias) ที่กำหนดเอง
🔹 บทเรียนที่ 13: โครงสร้างพื้นฐานของ Git: ฐานข้อมูลวัตถุภายใน
ภาพรวม: บทเรียนนี้ล้ำลึกไปใต้คำสั่งที่ใช้งานง่ายของ Git ("porcelain") เพื่อสำรวจ "plumbing" หรือฐานข้อมูลวัตถุระดับล่าง คุณจะได้เรียนรู้ว่า Git ใช้วัตถุประเภท 4 ชนิด (Blobs, Trees, Commits, Tags) และรหัสตรวจสอบ SHA-1 เพื่อบันทึกประวัติโปรเจกต์ หลังจบบทเรียนนี้ คุณจะเข้าใจวิธีการจัดการดัชนีและฐานข้อมูลวัตถุอย่างมืออาชีพ เพื่อสร้างงานบันทึกโดยไม่ต้องใช้ส่วนติดต่อระดับสูง
ผลลัพธ์การเรียนรู้:
- นิยามและแยกแยะวัตถุประเภท 4 ชนิดของ Git: Blobs, Trees, Commits, และ Tags
- อธิบายบทบาทของ
HEADและการอ้างอิงสาขาในการชี้ไปยังวัตถุงานบันทึกเฉพาะ - สาธิตกระบวนการ "plumbing": จัดเตรียมไฟล์ด้วยตนเอง เขียนโครงสร้างต้นไม้ (tree) และสร้างวัตถุงานบันทึก