ตั้งใจจะเปิดหาบทความที่สอนการดู diff ของ git merge เพราะปกติไม่เคยอธิบาย เป็นคำพูดให้คนอื่นฟังเข้าใจได้เลย มีแต่ต้องทำให้ดู แล้วก็เพิ่งรู้ว่ามีแบบที่เข้าใจได้ง่ายกว่า เรียกว่า diff3 ให้ใช้มาตั้งหลายปีแล้ว

คำสั่งในการใช้เปลี่ยนรูปแบบ

ลองทำตามได้เลย ยังไม่ต้องรู้เรื่องก็ได้ เพราะมั่นใจว่าไม่เสียใจแน่นอน

git config --global merge.conflictstyle diff3

# หรือถ้าไม่แน่ใจก็ลองแค่ directory เดียวก่อน
git config merge.conflictstyle diff3

ที่มา: stackoverflow.com/questions/27417656

ตัวอย่างของ diff จากการแก้ code

ของเดิม

func CalculateTotal(a, b int) int {
    return a + b
}

อันที่เราแก้ (HEAD, Current Change)

func CalculateTotal(a, b int) int {
    return a + b + 10
}

อันที่คนอื่นแก้มาแล้วเรากำลังจะ merge เข้า (Incoming Change)

func CalculateTotal(a, b int) int {
    return a + b - 5
}

ได้ออกมาแบบนี้ตอน conflict

func CalculateTotal(a, b int) int {
<<<<<<< HEAD
    return a + b + 10
=======
    return a + b - 5
>>>>>>> branch-name
}

หลายๆครั้งเวลาเจอแบบนี้ในลักษณะที่ conflict กันหลายบรรทัด จะค่อนข้างสับสนพอสมควรว่าควรจะเลือกอันไหนดี

ถ้าใช้ diff3 จะได้ conflict แบบนี้แทน:

func CalculateTotal(a, b int) int {
<<<<<<< HEAD
    return a + b + 10
||||||| base
    return a + b
=======
    return a + b - 5
>>>>>>> branch-name
}

สังเกตได้ว่าแทนที่จะมีแค่สองสถานะให้เรางงว่าจะเลือกอันไหนดี diff3 จะเพิ่มสถานะ base เข้ามาด้วยเพื่อให้เห็นว่าจุดตั้งต้นก่อนที่จะ conflict มันคืออะไรมาก่อน เพื่อช่วยเพิ่มข้อมูลตัดสินใจว่าควรจะเลือกอันไหนดี