Remote + GitHub: push/pull
Remote คืออะไร origin คืออะไร push กับ pull แลกเปลี่ยน commit ระหว่าง local กับ GitHub ยังไง
ทุก lesson ก่อนหน้านี้ เราเล่นกับ Git บนเครื่องเดียว commit, branch, merge, rebase เกิดขึ้นที่ local ทั้งหมด แต่โลกจริงงาน software ทำกันเป็นทีม ต้องแชร์ code กับเพื่อน และนั่นคือเหตุผลที่ต้องมี remote
Remote คืออะไร
Remote คือ “git repo อีกชุดหนึ่งที่อยู่ที่อื่น” ที่อื่นในที่นี้หมายถึง server (computer ที่รัน 24/7 ให้คนอื่นต่อผ่าน internet) คนละเครื่องกับคุณ ส่วนใหญ่คือ GitHub หรือ GitLab, Bitbucket
repo บนเครื่องคุณสามารถ “เชื่อม” กับ remote ได้ 1 หรือหลายตัว remote แต่ละตัวมีชื่อ convention ชื่อแรกจะใช้ origin เสมอ (สำหรับ GitHub repo ที่ clone มาหรือเป็นหลัก)
เริ่มต้นที่ git clone
ก่อนจะ push/pull อะไรได้ คุณต้องมี repo อยู่บนเครื่องก่อน วิธีที่พบบ่อยที่สุดคือ git clone คือการดาวน์โหลด repo จาก GitHub มาที่เครื่องของคุณ
$ git clone https://github.com/user/repo.gitคำสั่งนี้จะทำ 4 อย่างให้โดยอัตโนมัติ:
- สร้าง folder ใหม่ชื่อเดียวกับ repo
- ดาวน์โหลด commit ทุกก้อนของ repo นั้น (ประวัติครบ ไม่ใช่แค่ไฟล์)
- ตั้ง remote ชื่อ
originให้ทันที ไม่ต้องพิมพ์git remote addเอง - Checkout branch หลัก (มักเป็น main) เปิดไฟล์ให้พร้อมทำงาน
Push กับ Pull
คำสั่งที่ใช้แลกเปลี่ยน commit ระหว่าง local กับ remote คือ push และ pull
- push = ส่ง commit จาก local ขึ้น remote (upload)
- pull = ดึง commit จาก remote ลง local (download + merge)
ลองเล่นดู
ด้านล่างมี 2 repo แยกกันคือ Local (บนเครื่องคุณ) และ Remote (GitHub) เริ่มต้นตรงกัน 2 commit ลองทำสถานการณ์ต่างๆ
- กด “commit ที่ local” เพื่อทำ commit ใหม่บนเครื่อง → local จะล้ำหน้า ต้อง push
- กด “เพื่อน push” เพื่อจำลองว่าเพื่อนส่ง commit ขึ้น GitHub → remote จะล้ำหน้า ต้อง pull
- สังเกตสถานะด้านล่างว่า “sync” / “local ล้ำหน้า” / “remote ล้ำหน้า”
a3f8c21initial commite91b7d4เพิ่ม READMEtip
a3f8c21initial commite91b7d4เพิ่ม READMEtip
Workflow ทั่วไปของ developer
git pullก่อนเริ่มงาน ดึงของใหม่จากทีมมาก่อน- ทำงาน commit ไปเรื่อยๆ บน local
git pullอีกครั้งก่อน push เผื่อเพื่อนคนอื่น push ไปแล้วระหว่างที่ทำgit pushส่งขึ้น- repeat
Local main vs remote main
ใน Git จริงๆ แล้วเวลาคุณ clone repo มา จะมี branch 2 ตัวที่ Git track
main- branch บนเครื่องคุณ (local)origin/main- branch บน remote (read-only copy ที่ cache ไว้)
เวลาคุณ git fetch Git จะอัปเดต origin/main ให้ตรงกับ GitHub แต่ main ของคุณยังไม่ขยับ ต้อง git merge origin/main แยกต่างหาก (หรือใช้ git pull ที่รวม fetch + merge ในคำสั่งเดียว)
สรุป
- Remote = git repo ที่อยู่ที่อื่น ปกติใช้ชื่อ
origin - push = upload commit จาก local ไปที่ remote
- pull = download commit จาก remote ลงมา local
- ควร pull ก่อน push เสมอ เพื่อไม่ให้ reject
- Local มี
mainของตัวเอง, remote มีorigin/mainคนละตัวแต่ sync กันได้
lesson ถัดไปเราจะเจาะเรื่องที่ทุกคนกลัวที่สุดคือ merge conflict ตอนที่ 2 คนแก้ไฟล์เดียวกันคนละแบบ ให้เห็นว่ามันไม่น่ากลัวจริงๆ และ resolve เองได้ทุกครั้ง