มาเรียนรู้ Git แบบง่ายๆกันเถอะ

นี่ก็ปี 2017 แล้วนะ ยังไม่ใช้ Git อีกหรอ?

มาพูดถึง Version Control Systems (VCS) กันก่อน

4 Developer กับ 4 Feature ระดับเทพ
รวมโค้ดของนาย A และ B เข้าด้วยกันก่อน ส่วนนาย C กับ D นั่งรอยาวๆไปนะ

Git ทำงานยังไง?

https://git-scm.com/images/branching-illustration@2x.png
ให้นึกภาพแบบนี้ก่อน

Git ออกแบบมาให้ทำงานกระจายแบบไม่มีศูนย์กลาง ทุกเครื่องทำงานเป็น VCS ด้วยตัวเองได้

แต่ละเครื่องทำงานเป็น VCS อยู่แล้ว
สามารถใช้ Server หลายตัวทำเป็น VCS ได้เหมือนกันนะ

Git จะ Sync ข้อมูลเมื่อเราสั่งเท่านั้น

ใครไวกว่าก็สบายไป
ต้องดึงโค้ดมารวมกับโค้ดของตัวเองให้เรียบร้อยก่อน ถึงจะ Sync ขึ้น Remote ได้

การเรียกใช้งาน Git

สายโหดก็จัดแบบ Command Line กันไป
ขี้เกียจพิมพ์ก็ใช้ Git GUI อย่าง SourceTree เอา
Android Studio ก็มี
Xcode ก็มา

Server สำหรับให้บริการ Git (Version Control Repository Hosting Service)

GitHub บ้านหลังแรกสำหรับผู้ใช้ Git ทุกๆคน

คำต่างๆที่จะต้องรู้จักเมื่อใช้งาน Git (ชุดที่ 1)

Repository

Clone

Commit

เขียนโค้ดเสร็จชุดหนึ่งก็ทำการ Commit เก็บไว้ เขียนชุดต่อไปก็ Commit เก็บไว้อีก ทำเช่นนี้ไปเรื่อยๆ
แต่ละ Commit จะจำไว้ว่าไฟล์ไหนมีการแก้ไขอะไรบ้าง — ภาพจากใน SourceTree

Unstaged และ Staged

แก้ไขโค้ด (ไฟล์จะอยู่ใน Unstaged อัตโนมัติ) > เลือกไฟล์ที่ต้องการเข้า Staged > Commit

Push

Push : ส่ง Commit จาก Client ขึ้นไปเก็บไว้ที่ Remote ด้วย

Pull

Pull : ดึง Commit ใหม่ๆจาก Remote มาเก็บไว้ใน Client ด้วย

Fetch

Fetch : อยากรู้ว่ามี Commit ใหม่ๆบน Remote มั้ย แต่ไม่ต้องดึงข้อมูล

Merge Commit

นาย A เพิ่ม method2 ต่อท้าย method1 ส่วนนาย B ลบ method1 ออก แล้วเพิ่ม method3 กับ method4 เข้าไป
นาย B ทำการ Push ข้อมูลขึ้น Remote
“Push ก่อนได้เปรียบ” นาย B ไม่ได้กล่าวไว้
โค้ดของนาย A และ B แก้ที่บรรทัดเดียวกัน แต่โค้ดไม่เหมือนกัน
// โค้ดเดิม
void main() {
method1();
}
// โค้ดที่นาย A แก้ไข
void main() {
method2();
method1();
}
// โค้ดที่นาย B แก้ไข
void main() {
method1();
method3();
}
void main() {
method2(); // โค้ดของนาย A
method1();
method3(); // โค้ดของนาย B
}

Conflict

Conflict กันแน่นอน~
void main() {
<<<<<<< HEAD
method1();
method2();
=======
method3();
method4();
>>>>>>> 322d39a003e4d9...
}
void main() {
method2();
method3();
method4();
}

สรุปวัฏจักรของ Git ในชุดแรก

เขียนโค้ดไปจนถึงเมื่อไรถึงจะต้อง Commit?

ต้อง Push เมื่อไร?

คำต่างๆที่จะต้องรู้จักเมื่อใช้งาน Git (ชุดที่ 2)

Branch

แต่ละ Commit จะเรียงต่อกันเป็น Node จนกลายเป็นเส้นยาวๆ
โค้ดไม่ได้เกี่ยวข้องกัน แต่ต้องมาอยู่บน Branch เดียวกัน
แยก Branch เสร็จแล้ว ก็ตัวใครตัวมันละ

Merge Branch

เมื่อรวมโค้ดของทั้งสองเข้าด้วยกัน ความมันส์ก็เกิดขึ้น (บั๊กกระจุยสิครับ)

Stash และ Unstash

อะไร อะไร ก็นาย A กับนาย B ตลอด
เก็บโค้ดที่เขียนยังไม่เสร็จลงใน Stash ไว้ชั่วคราวก่อน
พอกลับมาก็ Unstash ของเก่ามาเขียนต่อ

Git Flow

develop มีตัวเดียว แต่ feature จะแยกเป็น Sub Branch โดยใช้ชื่อตาม Feature นั้นๆ
Merge Branch แบบนี้ ใน Git Flow จะเรียกว่า Finish Branch
เย้ ในที่สุดวันนี้ก็มาถึง T^T
เอาโค้ดจากใน master ไปขึ้น Production ได้แล้ว เย้!
แก้บั๊กแบบด่วนจี๋
Git Flow ใน SourceTree ใช้โคตรง่ายอ่ะ บอกเลย

Tag

หาได้ไม่ยากว่าเวอร์ชัน 1.0.7 อยู่ที่ Commit ไหน เพราะว่าใส่ Tag ไว้แล้ว
เห็นแบบนี้ก็รู้ได้ทันทีว่า Release ล่าสุดของ React คือเวอร์ชัน 15.6.1

Fork

Pull Request

สรุป

https://www.pexels.com/photo/beverage-black-coffee-business-chart-33972/

บทความเกี่ยวกับ Git ที่แนะนำให้อ่านต่อ

Lovely android developer who enjoys learning in android technology, habitual article writer about Android development for Android community in Thailand.

Lovely android developer who enjoys learning in android technology, habitual article writer about Android development for Android community in Thailand.