Git Fundamentals
git config
เขียนคำสั่ง git config --global user.name และ user.email เพื่อตั้งค่าตัวตนผู้เขียน commit ให้ใช้ได้กับทุก repository บนเครื่อง แยกออกจากขอบเขต local ที่จำกัดแค่ repo เดียว
1) โจทย์: commit ครั้งแรกบนเครื่องใหม่ Git ไม่ยอมให้บันทึกจนกว่าจะรู้ว่าคุณเป็นใคร
หลังติดตั้ง Git เสร็จและยืนยันด้วย git --version แล้ว ลองสั่ง commit ครั้งแรกบนเครื่องใหม่ดู Git จะไม่ยอมบันทึก snapshot ให้ทันที แต่จะหยุดพร้อม error ประมาณนี้: ``` *** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. ``` เหตุผลคือทุก snapshot ที่ Git บันทึกต้องมีข้อมูลกำกับว่า "ใครเป็นคนบันทึก" เสมอ (ตามแนวคิด who/what/when ที่เรียนไปในบท Version Control concept) — ถ้า Git ยังไม่รู้ว่าคุณคือใคร มันจะปฏิเสธไม่ยอมสร้าง commit ให้ จนกว่าจะตั้งค่าตัวตนก่อน
2) Anatomy: git config --global user.name / user.email และขอบเขต global vs local
คำสั่งที่ใช้ตั้งค่าตัวตนคือ git config โดยมีสองค่าหลักที่ต้องตั้ง: user.name (ชื่อที่จะแสดงเป็นผู้เขียน commit) และ user.email (อีเมลที่ผูกกับชื่อนั้น) — แฟล็ก --global เป็นตัวกำหนดขอบเขตว่าค่านี้ใช้ได้กว้างแค่ไหน: - --global เขียนค่าไว้ที่ไฟล์ ~/.gitconfig ซึ่งเป็นค่าเริ่มต้นของทุก repository บนเครื่องนี้ ตั้งครั้งเดียวใช้ได้ตลอด - ไม่ใส่ --global (local scope) จะเขียนค่าไว้ที่ .git/config ของ repository ปัจจุบันเท่านั้น ใช้ได้เฉพาะ repo นั้น และจะทับค่า global ไว้เฉพาะที่นี่
ตั้งค่าตัวตนแบบ global
ตั้งอีเมลแบบ global
ตรวจสอบค่าที่ตั้งไว้
3) Contrast: ลืม --global เทียบกับใส่ --global
ความผิดพลาดที่พบบ่อยคือลืมใส่ --global ตอนตั้งค่าตัวตนครั้งแรก คิดว่าตั้งครั้งเดียวจะใช้ได้ทุก repository แต่จริง ๆ แล้วค่านั้นถูกจำกัดไว้แค่ repo เดียว
ลืม --global เทียบกับใส่ --global
ถ้าลืม --global คำสั่งจะตั้งค่าเฉพาะ repository ปัจจุบันเท่านั้น (local scope) พอย้ายไป repo อื่นที่ไม่เคยตั้งไว้ ผู้เขียน commit จะขาดหรือผิดคน
ไม่มี --global แปลว่าค่านี้ถูกเขียนไว้ที่ .git/config ของ project-a เท่านั้น พอย้ายไป project-b ที่ไม่เคยตั้งไว้ Git จึงไม่รู้ว่าใครเป็นผู้เขียนอีกครั้ง
--global เขียนค่าไว้ที่ ~/.gitconfig ซึ่งเป็นค่าเริ่มต้นของทุก repository บนเครื่องนี้ ไม่ต้องตั้งซ้ำทุกครั้งที่เข้า repo ใหม่
4) ฝึกใช้งาน git config
ทำตามคำสั่งทีละบรรทัดแล้วสังเกตผลลัพธ์ของแต่ละคำสั่ง
งานที่ต้องทำ
- สังเกตว่า git commit ครั้งแรกก่อนตั้งค่าตัวตนจะถูก Git ปฏิเสธด้วยข้อความ Please tell me who you are
- สังเกตว่าหลังตั้งค่าด้วย --global แล้ว commit ในทุก repository จะมีผู้เขียนแสดงถูกต้องโดยไม่ต้องตั้งซ้ำ
ตัวอย่างและข้อมูลประกอบ
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด
เขียนคำสั่งเองให้ครบตามเป้าหมาย
งานที่ต้องทำ
- ทำนายผลลัพธ์ก่อนดูเฉลย: คำสั่งใดที่ใช้ตรวจสอบว่าตั้งค่า global สำเร็จหรือยัง โดยไม่ต้องเปิดไฟล์ ~/.gitconfig เอง
- ตั้งค่า user.name เป็น "Somchai Devtest" และ user.email เป็น "somchai@example.com" แบบ global ให้ใช้ได้กับทุก repository บนเครื่องนี้ แล้วตรวจสอบว่าตั้งค่าสำเร็จ
ตัวอย่างและข้อมูลประกอบ
เป้าหมาย: ตั้งค่าตัวตนแบบ global เป็นชื่อ "Somchai Devtest" อีเมล "somchai@example.com" แล้วตรวจสอบด้วยคำสั่งเดียวว่าตั้งค่าทั้งสองค่าสำเร็จแล้ว
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด
5) Checkpoint & Next Steps
ทดสอบความเข้าใจ: git config
ตอบคำถามเพื่อเช็กความเข้าใจการตั้งค่าตัวตนด้วย git config
แฟล็กใดทำให้ git config ตั้งค่าที่ใช้ได้กับทุก repository บนเครื่อง?
ถ้าลืมใส่ --global ตอนตั้งค่า user.name ในคำสั่ง git config จะเกิดอะไรขึ้น?
ค่าสองอย่างที่ต้องตั้งก่อน commit ครั้งแรกบนเครื่องใหม่คือ user.name และ user.____
ตอบเป็นคำเดียวตามที่ใช้ในคำสั่ง git config
- Git ปฏิเสธการ commit จนกว่าจะรู้ว่าใครเป็นผู้เขียน ผ่านการตั้งค่า user.name และ user.email
- --global เขียนค่าไว้ที่ ~/.gitconfig ใช้ได้ทุก repository บนเครื่อง ไม่ต้องตั้งซ้ำ
- ลืม --global ทำให้ค่าถูกจำกัดไว้แค่ repository เดียว (local scope) เท่านั้น
- ก้าวต่อไป: บทถัดไปคือ git init ซึ่งเป็นคำสั่งแรกในหมวด Basic Commands ที่สร้าง repository จริง หลังจากตั้งค่าตัวตนใน git config เรียบร้อยแล้ว