ซีรีส์ เขียนโปรแกรมพื้นฐาน · ตอนที่ 3 จาก 7
Git คืออะไร: จุดเซฟเกมของคนที่ให้ AI แก้โค้ด
16 ต.ค. 2569 · อ่าน 12 นาที
ให้ AI แก้โค้ดแล้วส่วนที่เคยใช้ได้กลับพัง จะรู้ได้อย่างไรว่า AI แก้อะไรไป และจะย้อนกลับอย่างไร บทความนี้อธิบาย Git โดยเทียบกับการเซฟเกม พาดูตัวอย่างที่รันจริงตั้งแต่การเซฟ การดูว่า AI แก้บรรทัดไหน จนถึงการย้อนกลับ พร้อม 5 กติกาก่อนให้ AI แก้โค้ด

สมมติคุณให้ AI เพิ่มฟีเจอร์เล็กๆ หนึ่งอย่าง AI บอกว่า "เสร็จแล้ว" แต่พอลองใช้ ส่วนที่เคยใช้ได้กลับพัง และคุณไม่รู้ว่า AI ไปแก้ไฟล์ไหนบ้าง
คนเล่นเกมรู้ว่าก่อนสู้บอสต้องเซฟไว้ ถ้าแพ้ก็โหลดเซฟกลับมาได้ Git คือระบบเซฟแบบนั้นสำหรับไฟล์งาน และยิ่งสำคัญเมื่อให้ AI แก้โค้ดแทนเรา
บทความนี้เป็นตอนที่ 3 ของซีรีส์ "เขียนโปรแกรมพื้นฐาน" สำหรับคนที่ให้ AI เขียนโค้ด และอยากตรวจงานของ AI เป็น ตอนนี้จะลองเซฟงาน ดูว่า AI แก้อะไร แล้วย้อนกลับ ด้วยตัวอย่างที่เรารันจริง
ข้อมูล ณ ตุลาคม 2569 จากหนังสือ Pro Git (คู่มือบนเว็บทางการของ Git) เอกสารของ GitHub และของ Claude Code
Git คืออะไร
Pro Git อธิบายว่าระบบควบคุมเวอร์ชัน (version control) บันทึกการเปลี่ยนแปลงของไฟล์ไว้ตามเวลา เพื่อให้เรียกเวอร์ชันไหนกลับมาก็ได้ ทุกครั้งที่เซฟ Git จะเหมือนถ่ายรูปไฟล์ทั้งโปรเจกต์ ณ ตอนนั้นเก็บไว้
ตารางนี้เทียบคำของ Git กับการเซฟเกม
| ในเกม | ใน Git | ใช้ทำอะไร |
|---|---|---|
| ช่องเซฟทั้งหมดของเกม | repository (repo) | ที่เก็บประวัติทั้งหมดของโปรเจกต์ |
| กดเซฟ | commit | บันทึกสภาพไฟล์ทั้งหมด ณ ตอนนี้ |
| ชื่อของเซฟ | commit message | โน้ตสั้นๆ ว่าเซฟนี้แก้อะไร |
| เทียบกับเซฟล่าสุด | diff | ดูทีละบรรทัดว่าอะไรเปลี่ยน |
| โหลดเซฟ | restore หรือ revert | ย้อนกลับไปสภาพที่เคยเซฟ |
Git ต่างจากเกมอยู่ข้อเดียวที่ต้องจำ คือ งานที่ยังไม่ได้ commit จะไม่มีเซฟ Pro Git เขียนว่าของที่ commit แล้วแทบจะกู้คืนได้เสมอ แต่ของที่หายไปโดยไม่เคย commit "น่าจะไม่ได้เห็นอีกเลย"
ทำไม Git สำคัญขึ้นเมื่อให้ AI แก้โค้ด
AI แก้ได้หลายไฟล์ในรอบเดียว บางไฟล์เราไม่ได้สั่งให้แก้ และคำสรุปท้ายงานของ AI อาจไม่ครบ Git ตอบ 2 คำถามที่ต้องรู้ทุกครั้ง คือ แก้ไฟล์ไหน (git status) และ แก้บรรทัดไหน (git diff ซึ่ง Pro Git บอกว่าแสดงบรรทัดที่ถูกเพิ่มและถูกลบแบบตรงตัว)
ทีมที่ใช้ AI เขียนโค้ดอย่างจริงจังก็นับจำนวนครั้งที่ต้องย้อนงาน เช่น Cockroach Labs บริษัทฐานข้อมูล เล่าเมื่อ 9 ตุลาคม 2569 ว่าให้ AI เขียนโค้ดมา 5 เดือน บริษัทรายงานเองว่าต้องย้อนงาน (revert) รวม 7 ครั้ง และตั้งเพดานว่างานแต่ละชิ้นต้องไม่เกิน 1,000 บรรทัด เพื่อให้ผู้ตรวจ "จำทั้งหมดไว้ในหัวได้"
เรามองว่าหลักคิดนี้ใช้ได้กับทุกคน คือ งานที่ย้อนได้และเล็กพอจะอ่านจบ ทำให้เรากล้าให้ AI ทำ
ลองของจริง: ให้ "AI" แก้ เจอว่าพัง แล้วย้อนกลับ
โปรเจกต์ตัวอย่าง my-shop มี 2 ไฟล์ คือ price.js ที่คิดยอดรวมบวก VAT 7% และ settings.json ที่เก็บชื่อร้านและสกุลเงิน เรารันทุกคำสั่งจริงเมื่อ 16 ตุลาคม 2569 ส่วนที่บอกว่า "AI แก้" เราแก้ไฟล์เองเพื่อเลียนแบบความผิดพลาด 2 แบบ ไม่ได้ให้ AI ตัวจริงแก้
1. เซฟก่อนสั่งงาน
ตอนนี้โปรแกรมคิดสินค้า 100 บาท 3 ชิ้นได้ 321 บาท ซึ่งถูกต้อง จึงเซฟไว้ด้วยคำสั่งนี้
$ git add . $ git commit -m "ราคารวม VAT ใช้งานได้" [main (root-commit) 1b6bc47] ราคารวม VAT ใช้งานได้ 2 files changed, 12 insertions(+) create mode 100644 price.js create mode 100644 settings.json
1b6bc47 คือรหัสของเซฟนี้ ถ้าคุณลองเอง รหัสที่ได้จะต่างจากนี้
ก่อนใช้ git add . กับโปรเจกต์จริง ให้ดู git status ก่อนว่าไม่มีไฟล์ความลับอย่าง .env ติดเข้าไปด้วย (เหตุผลอยู่ในกติกาข้อ 4 ข้างล่าง)
2. สั่ง AI เพิ่มส่วนลด แล้วลองรัน
สมมติสั่งว่า "เพิ่มส่วนลด 10% เมื่อซื้อ 10 ชิ้นขึ้นไป" แล้วรันกับออเดอร์เดิม 3 ชิ้น ซึ่งไม่ได้ส่วนลด ยอดจึงไม่ควรเปลี่ยน ผลที่ได้คือ
$ node price.js ยอดรวม: 510.00
ยอดกลายเป็น 510.00 แทนที่จะเป็น 321.00 เหมือนเดิม แปลว่ามีบางอย่างผิด
3. ถาม Git ว่าแก้ไฟล์ไหน
ถาม Git ว่าไฟล์ไหนถูกแก้ ได้ผลดังนี้
$ git status --short M price.js M settings.json
M แปลว่าไฟล์ถูกแก้ เราสั่งแค่เรื่องส่วนลด แต่ settings.json ก็ถูกแก้ด้วย นี่คือสัญญาณแรกที่ต้องถามว่าทำไม
4. ดูทีละบรรทัดด้วย diff
ใช้ git diff ดูว่าแต่ละไฟล์เปลี่ยนไปอย่างไร ได้ผลดังนี้
$ git diff
diff --git a/price.js b/price.js
index a5e3e7f..ce89eca 100644
--- a/price.js
+++ b/price.js
@@ -1,8 +1,10 @@
-// คิดราคารวม VAT 7%
-const VAT = 0.07;
+// คิดราคารวม VAT 7% + ส่วนลด 10% เมื่อซื้อ 10 ชิ้นขึ้นไป
+const VAT = 0.7;
function total(price, qty) {
- return (price * qty * (1 + VAT)).toFixed(2);
+ let sum = price * qty;
+ if (qty >= 10) sum = sum * 0.9;
+ return (sum * (1 + VAT)).toFixed(2);
}
console.log("ยอดรวม:", total(100, 3));
diff --git a/settings.json b/settings.json
index ef58c91..a8cfd90 100644
--- a/settings.json
+++ b/settings.json
@@ -1,4 +1,4 @@
{
"shopName": "ร้านตัวอย่าง",
- "currency": "THB"
+ "currency": "USD"
}ผลลัพธ์ดูยาว แต่อ่านแค่นี้ก็พอ บรรทัด diff --git คือหัวของแต่ละไฟล์ บรรทัดที่ขึ้นต้นด้วย - คือของเดิมที่ถูกลบ บรรทัดที่ขึ้นต้นด้วย + คือของใหม่ที่ใส่แทน ส่วนบรรทัดที่ไม่มีเครื่องหมายคือส่วนที่ไม่ได้แก้
diff นี้แสดงความผิดพลาดทั้ง 2 จุด คือ VAT ถูกเปลี่ยนจาก 0.07 เป็น 0.7 ทั้งที่หมายเหตุยังเขียนว่า 7% และ สกุลเงินถูกเปลี่ยนจาก THB เป็น USD ซึ่งเราไม่ได้สั่ง ถ้าอ่านแค่คำสรุปว่า "เพิ่มส่วนลดแล้ว" จะไม่เห็นทั้ง 2 จุดนี้
5. ย้อนกลับไปเซฟล่าสุด
ใช้ git restore . ย้อนกลับ แล้วรันใหม่ ได้ผลดังนี้
$ git restore . $ node price.js ยอดรวม: 321.00
ยอดกลับมาเป็น 321.00 เพราะ git restore . เอาทุกไฟล์กลับไปเหมือนตอน commit ล่าสุด
⚠️ คำสั่งนี้ทิ้งงานที่ยังไม่ได้ commit แบบถาวร ใช้เมื่อแน่ใจว่าไม่ต้องการงานนั้นแล้ว ถ้ามีส่วนที่ดีอยู่บ้าง ให้ย้อนเฉพาะไฟล์ (วิธีอยู่ข้างล่าง) หรือ commit ส่วนที่ดีไว้ก่อน
ถ้า AI แก้ถูกบางไฟล์และผิดบางไฟล์ ไม่ต้องทิ้งทั้งหมด ให้ย้อนเฉพาะไฟล์ที่ไม่ได้สั่ง เช่น git restore settings.json แล้ว commit ไฟล์ที่ดีด้วยชื่อที่บอกว่าทำอะไร เราลองอีกรอบแบบนี้ (แก้ถูกบางไฟล์) แล้วดูประวัติเซฟ ได้ผลดังนี้
$ git log --oneline 943d4fc เพิ่มส่วนลด 10% เมื่อซื้อ 10 ชิ้นขึ้นไป 1b6bc47 ราคารวม VAT ใช้งานได้
รายการนี้มีเซฟ 2 จุด เซฟล่าสุดอยู่บนสุด และแต่ละเซฟมีชื่อที่บอกว่าทำอะไร
5 กติกา ก่อนให้ AI แก้โค้ด
- commit ก่อนสั่งงานใหญ่ทุกครั้ง เหมือนเซฟก่อนเข้าห้องบอส ถ้าผลไม่ดีก็ย้อนได้ทันที
- commit เล็ก ตั้งชื่อชัด เซฟละ 1 เรื่อง ตั้งชื่อแบบ "เพิ่มส่วนลด 10% เมื่อซื้อ 10 ชิ้นขึ้นไป" ไม่ใช่แค่ "แก้" ไม่ต้องกลัวเปลืองพื้นที่ มีคนทดลองให้ดูว่าแก้ไฟล์เล็กน้อยแล้ว commit ใช้พื้นที่เพิ่มแค่หลักกิโลไบต์ (ผลจากการทดลองของเขาเอง)
- อ่าน diff ก่อนรับงาน ไม่ใช่อ่านแค่คำสรุป ดู 3 จุด คือไฟล์ที่ไม่ได้สั่งให้แก้ ตัวเลขหรือค่าตั้งต้นที่เปลี่ยน และบรรทัดที่ถูกลบ ซึ่งเห็นยากกว่าบรรทัดที่เพิ่ม
- ห้าม commit ความลับ เช่น รหัสผ่าน คีย์ของบริการ (API key) และไฟล์
.envเพราะ Git จำทุกเซฟ - ปุ่มย้อนของเครื่องมือ AI ใช้ได้ แต่ใช้แทน Git ไม่ได้ Claude Code มีจุดย้อนกลับ (checkpoint) ที่ย้อนได้ด้วย
/rewindแต่เอกสารทางการบอกว่า checkpoint ไม่ย้อนไฟล์ที่ถูกแก้ผ่านคำสั่งในหน้าต่างพิมพ์คำสั่ง (terminal) และไม่ได้มาแทน Git อ่านเพิ่มได้ที่ 15 คำสั่งของ Claude Code ที่คุณต้องรู้
ทำไมการลบความลับทีหลังจึงไม่พอ
เราลอง commit ไฟล์ .env ที่มีคีย์ปลอม แล้วลบไฟล์นั้นใน commit ถัดไป ผลคือไฟล์หายจากโฟลเดอร์ แต่ยังเปิดอ่านคีย์จากเซฟเก่าได้ครบ
วิธีป้องกันคือเขียนชื่อไฟล์ไว้ในไฟล์ .gitignore แล้ว Git จะไม่เอาไฟล์นั้นเข้าเซฟ (เราลองแล้ว) แต่เอกสารของ Git บอกว่าวิธีนี้ใช้ไม่ได้กับไฟล์ที่เคย commit ไปแล้ว ถ้าเผลอหลุดไปแล้ว GitHub แนะนำให้ถือว่าความลับนั้นรั่ว แม้จะหลุดแค่วินาทีเดียว แล้วยกเลิกคีย์ทันทีและสร้างใหม่
คำสั่งสำเร็จรูปให้ AI ทำตามกติกา
ถ้าใช้เครื่องมือ AI ที่รันคำสั่งในโปรเจกต์ได้ วางข้อความนี้ก่อนสั่งงาน
ก่อนเริ่มแก้: ถ้ามีไฟล์ที่ยังไม่ได้ commit ให้บอกฉันก่อน อย่าเพิ่งแก้ หลังแก้เสร็จ: แสดงผล git status --short และ git diff --stat แล้วสรุปเป็นภาษาไทยทีละไฟล์ว่าแก้อะไร เพราะอะไร ถ้ามีไฟล์ที่ฉันไม่ได้สั่งให้แก้ ให้แยกบอกไว้ต่างหาก ห้าม commit ไฟล์ .env หรือไฟล์ที่มีรหัสผ่านหรือคีย์ ห้ามใช้คำสั่งที่ทิ้งงานที่ยังไม่ได้ commit โดยไม่ถามฉันก่อน
git diff --stat คือ diff ฉบับย่อ ที่บอกว่าไฟล์ไหนเปลี่ยนกี่บรรทัด คำสรุปของ AI ยังเป็นแค่คำสรุป สิ่งที่ต้องเชื่อคือ diff
Git กับ GitHub ไม่ใช่อย่างเดียวกัน
Git คือโปรแกรมในเครื่องของเรา Pro Git บอกว่าคำสั่งเกือบทั้งหมดใช้แค่ไฟล์ในเครื่อง ไม่ต่ออินเทอร์เน็ตก็ commit ได้ ส่วน GitHub คือเว็บที่เก็บ repo ของ Git ไว้บนคลาวด์ และมีเครื่องมือเพิ่มให้ทำงานเป็นทีม ตามที่เอกสารของ GitHub อธิบาย
ถ้าเทียบกับเกม Git คือเซฟในเครื่อง ส่วน GitHub คือคลาวด์เซฟ การส่งเซฟขึ้นไปเรียกว่า push Pro Git บอกว่าของที่ commit แล้วหายยากมาก ยิ่งถ้า push ไปเก็บไว้อีกที่เป็นประจำ
ระวังว่า repo ที่ตั้งเป็นสาธารณะ ใครก็ดูประวัติได้ทั้งหมด รวมถึงเซฟเก่าที่เผลอมีความลับติดไป กติกาข้อ 4 จึงยิ่งสำคัญเมื่อเอางานขึ้น GitHub
สำหรับคนใช้ terminal: สรุปคำสั่งทั้งหมดในบทความ
ถ้าไม่ได้ใช้ terminal ข้ามหัวข้อนี้ได้ เพราะโปรแกรมแก้โค้ดหลายตัวมีปุ่มกดให้
| คำสั่ง | ใช้ทำอะไร |
|---|---|
git init | เริ่มใช้ Git ในโฟลเดอร์นี้ (ครั้งเดียว) |
git add . แล้ว git commit -m "ชื่อเซฟ" | เซฟทุกไฟล์ที่เปลี่ยน พร้อมชื่อ |
git status --short | ไฟล์ไหนถูกแก้ |
git diff · git diff --stat | แก้บรรทัดไหน · ฉบับย่อ |
git restore ชื่อไฟล์ · git restore . | ทิ้งการแก้ที่ยังไม่ commit ของไฟล์นั้น · ทุกไฟล์ |
git log --oneline | รายการเซฟทั้งหมด |
git revert HEAD | ย้อนเซฟล่าสุด โดยสร้างเซฟใหม่ที่หักล้างกัน ประวัติเดิมยังอยู่ |
ครั้งแรกที่ใช้ Git ต้องตั้งชื่อและอีเมลก่อน เพราะ Pro Git บอกว่าทุก commit บันทึกข้อมูลนี้ไว้ ใช้คำสั่งนี้
git config --global user.name "ชื่อของคุณ" git config --global user.email "อีเมลของคุณ"
เปลี่ยนข้อความในเครื่องหมายคำพูดเป็นชื่อและอีเมลของคุณ
⚠️ git restore ทิ้งงานที่ยังไม่ commit แบบถาวร Pro Git เรียกคำสั่งนี้ว่าคำสั่งอันตราย ใช้เมื่อแน่ใจว่าไม่ต้องการงานนั้นจริงๆ ถ้า commit ไปแล้วอยากย้อน ให้ใช้ git revert ซึ่งไม่ลบประวัติ
สิ่งที่ Git ทำไม่ได้
- Git ไม่รู้ว่าโค้ดถูกหรือผิด บอกได้แค่ว่าอะไรเปลี่ยน ในตัวอย่างนี้เรารู้ว่าโค้ดพังเพราะลองรันแล้วเทียบกับยอดที่รู้อยู่แล้ว
- Git ช่วยงานที่ไม่เคย commit ไม่ได้ ถ้าไม่เคยเซฟ ก็ไม่มีอะไรให้ย้อน
- ตัวอย่างนี้รันกับ Git 2.50.1 บน macOS ถ้าคุณใช้รุ่นอื่น ให้ดูที่ชื่อไฟล์และบรรทัดที่เปลี่ยนเป็นหลัก
สรุป
commit คือการเซฟพร้อมตั้งชื่อ diff บอกว่าแก้บรรทัดไหน ส่วน restore และ revert คือการโหลดเซฟ ก่อนให้ AI แก้งานใหญ่ให้เซฟก่อน หลัง AI แก้เสร็จให้อ่าน diff เอง และอย่าให้ความลับเข้าไปอยู่ในเซฟ
ถ้ายังไม่เคยให้ AI สร้างแอป เริ่มได้ที่ Vibe coding: บอก AI ว่าอยากได้แอปอะไร แล้วตรวจให้เป็น ส่วนตอนถัดไปในซีรีส์ เราจะอ่าน SQL แค่ 4 คำ เพื่อตรวจตัวเลขที่ AI ดึงมาจากฐานข้อมูล
อาทิตย์ละสกิล เดี๋ยวก็เก่ง