# Merge commit

&#x20;         ในส่วนของ merge commit นั้นจะเป็นยกตัวอย่างกรณีจริงที่มักเกิดขึ้นเมื่อมีคนกลุ่มหนึ่งลงมือทำโค้ดร่วมกัน

&#x20;         โดยสมมติว่านาย A กับนาย B เขียนโค้ดด้วยกันอยู่ และทั้งคู่ก็เขียนโค้ดที่อยู่ในไฟล์เดียวกัน ดังรูปตัวอย่าง

![นาย A เพิ่ม method2 ต่อท้าย method1 ส่วนนาย B ลบ method1 ออก แล้วเพิ่ม method3 กับ method4 เข้าไป](https://lh5.googleusercontent.com/F9CAo7FWtYAbl-EC_rPvtkSRxZOAvPbYLxkafe9yRTPDfJdq4-PRl1vxcg59paP_kUzHVvTKcBnSzoNtzoSCy1BMYHASzjOD38TxTX6IpKPJiZjZ_gDxmWM3TthVlAbYDk_aAsSH)

&#x20;         นาย B เขียนโค้ดเสร็จแล้ว ก็เลย commit ไฟล์ที่ตัวเองเขียนเสร็จแล้ว push ขึ้น Remote repository

![นาย B ทำการ Push ข้อมูลขึ้น Remote repository ก่อนนาย A](https://lh4.googleusercontent.com/qNeBVSuKahmIiS3xhGjWm4fxjgNUNLH3X6tKSS-d3wcn8zy-Hoitm_xvAEunBSBbytU6Gvp425gRoTQ0Dh5h-KW0iWx46A_SPqm4nC2DQKlAZQA3xd1QjS6BUlq9QlGxGw9lLMMd)

&#x20;         ส่วนนาย A ที่เขียนโค้ดเสร็จทีหลังและเตรียมจะ push ขึ้น Remote repository กลับพบว่านาย B ได้ push ขึ้นไปก่อนหน้านั้นแล้ว ทำให้เขา push ตามขึ้นไปในทันทีไม่ได้

![“Push ก่อนได้เปรียบ” นาย B ไม่ได้กล่าวไว้](https://lh4.googleusercontent.com/H6B8Z2WnwKidqaPbIwLhIDVaPCDL8h3dcewdN2z2LP4zkvgfGgfe8HAa-ut3waguXUz7Yfy78R2KRylc9c0AdJu6XHog2h_7SXFwUobQmo8T9ORj37gtpqpFtv9KyDhHygr_sTFS)

&#x20;         ดังนั้น สิ่งที่นาย A ต้องทำก่อนที่จะ push ของตัวเองขึ้นไปได้ ก็คือ**จะต้อง pull จาก Remote repository ลงมาใหม่ก่อนเพื่ออัปเดต commit ที่นาย B ได้ push ขึ้นไป** ซึ่งเราเรียกขั้นตอนนี้ว่า **merge commit** นั่นเอง

![Merge Commit : เมื่อมีคนอื่นชิง Push ก่อนหน้าแล้วเราต้อง Pull มาใหม่เพื่ออัปเดตของตัวเองก่อนส่งตามหลัง](https://lh6.googleusercontent.com/CbbX5JPNIey_J_Xwvn2eBz_IjMbP4sDVXaGjI90EF1mBm2KkOALEHYZyIw_ICKbrGntvbHF272s06SWTxOzToVZ8tAr8a8Y73TzRDh4AUR8cOlFyXQKsH27HAlCOx_AEcjUyeoW1)

&#x20;         จากตัวอย่าง จะเห็นว่าโค้ดของนาย A และ B แก้ที่บรรทัดเดียวกัน แต่โค้ดออกมาไม่เหมือนกัน ในจุดนี้ก็จะเป็นผลต่อเนื่องไปสู่อีกหนึ่งปัญหาพื้นฐานที่ Developer ควรรู้นั่นเอง (ซึ่งส่วนนี้จะมีการอธิบายในหัวข้อ conflict ต่อไป)

&#x20;         นอกจากนี้ยังพบในกรณีที่โค้ดสามารถ merge ได้ปกติ เช่น

```java
//code เดิม
void main() {
    method1();
}

//code ที่นาย A แก้ไข
void main() {
    method2();
    method1();
}

//code ที่นาย B แก้ไข
void main() {
    method3();
    method1();
}
```

&#x20;         เมื่อ merge เข้าด้วยกัน จะได้ผลลัพธ์ออกมาเป็นแบบนี้

```java
void main() {
    method2();  // code ของนาย A
    method1();
    method3();  // code ของนาย B
}
```

&#x20;         ซึ่งถือเป็นหนึ่งในกรณีที่โค้ดสามารถ merge รวมกันได้โดยไม่มีปัญหาอะไร และเมื่อ merge เสร็จแล้วก็จะกลายเป็น commit ตัวหนึ่งที่ให้เราเก็บไว้และ push ขึ้น Remote repository
