ข้อความผิดพลาด 「Your local changes to the following files will be overwritten by merge」 เกิดขึ้นในกลไกควบคุมเวอร์ชัน Git ข้อผิดพลาดนี้เกิดขึ้น หากคุณ แก้ไขไฟล์ซึ่งก็มีการเปลี่ยนแปลงใน remote repository ด้วย
ข้อความผิดพลาดนี้จะ ไม่เกิดขึ้น หากไม่มีไฟล์ที่ยังไม่ commit (uncommitted files) ซึ่งมีการเปลี่ยนแปลงใน remote repository เมื่อเจอข้อความนี้ ควร ปรึกษาสมาชิกทีมอื่นๆ และขอความคิดเห็น ไม่ว่าจะอยาก merge การเปลี่ยนแปลงในเครื่อง หรือเก็บเวอร์ชันใน repository ควรให้ทุกคนอยู่บน หน้าเดียวกัน (same page)
Repositories คืออะไร? Push และ Pull ใน Git คืออะไร?
Repository เป็นที่จัดเก็บโค้ด ที่ถูกแก้ไขและดึงมาโดยสมาชิกทีมผ่าน GitHub version control mechanism 『Pull』 หมายถึง ดึงเวอร์ชันล่าสุดของ repository มาที่ local storage/IDE (Integrated Development Environment) เช่น PyCharm เป็นต้น
หลัง Pull คุณแก้ไขโค้ดหรือเพิ่มฟีเจอร์ เสร็จแล้ว 『Push』 โค้ดขึ้น repository เพื่อบันทึกการเปลี่ยนแปลงและเพิ่มฟีเจอร์ โค้ดจะเข้าถึงได้โดยคนอื่นด้วย
หากเพิ่งเริ่มใช้ GitHub version control แนะนำให้เรียนรู้พื้นฐานทั้งหมดก่อน บทความนี้สมมติว่าคุณมีความรู้พื้นฐานและเข้าใจทุกอย่างแล้ว
วิธีแก้ 『Your local changes to the following files will be overwritten by merge』
การแก้ไขข้อผิดพลาดนี้ ขึ้นอยู่กับ สิ่งที่คุณต้องการทำ คุณสามารถ ทิ้งการเปลี่ยนแปลงในเครื่อง (discard local changes) และ pull จาก repository หรือ เก็บการเปลี่ยนแปลงในเครื่องไว้ใน stash แล้ว pull เวอร์ชันจาก repository ทุกอย่างขึ้นอยู่กับความชอบ
เราแนะนำให้ ปรึกษาสมาชิกทีม และแน่ใจว่าทุกคนอยู่บนหน้าเดียวกัน ก่อนดำเนินการต่อ หาก commit ผิดหรือ push เวอร์ชันผิด อาจส่งผลต่อทีมทั้งหมด
วิธีที่ 1: บังคับ Pull ทับการเปลี่ยนแปลงในเครื่อง (Forcing a pull to overwrite local changes)
หาก ไม่สนใจการเปลี่ยนแปลงในเครื่อง และต้องการโค้ดจาก repository ให้ บังคับ pull จะทับการเปลี่ยนแปลงในเครื่องทั้งหมด ปรากฏสำเนาของเวอร์ชันใน repository
รันคำสั่งใน IDE:
git reset --hard git pull
คำสั่งนี้จะ ทำลายการเปลี่ยนแปลงในเครื่องทันที ให้แน่ใจว่ารู้ว่ากำลังทำอะไร และไม่ต้องการการเปลี่ยนแปลงในเครื่อง
วิธีที่ 2: เก็บทั้งสองฝ่าย (Keeping both changes - local and from repo)
หากต้องการเก็บทั้งสองฝ่าย (การเปลี่ยนแปลงในเครื่อง และใน repository) ให้ add และ commit การเปลี่ยนแปลงของคุณ เมื่อ pull จะเกิด merge conflict แน่นอน ที่นี่ใช้ tools ใน IDE (เช่น Difftool และ mergetool) เปรียบเทียบโค้ด 2 ชุด และตัดสินใจเก็บ/ลบการเปลี่ยนแปลง ไม่มีการสูญเสียจนกว่าจะลบด้วยตนเอง
git add $the_file_under_error git commit git pull
เมื่อเกิด merge conflict ใช้ conflict resolving tools ตรวจสอบทีละบรรทัด
วิธีที่ 3: เก็บทั้งสองฝ่าย แต่ไม่ Commit (Keeping both changes BUT not committing)
สถานการณ์นี้เกิดบ่อย นักพัฒนาไม่พร้อม commit เพราะมีโค้ดเสียบางส่วน กำลัง debug ที่นี่ เราสามารถ stash การเปลี่ยนแปลงไว้ปลอดภัย pull เวอร์ชันจาก repository แล้ว unstash โค้ดของเรา
git stash save --keep-index
หรือ
git stash git pull git stash pop
หากมี conflict หลัง pop stash ให้แก้ไขในวิธีปกติ สามารถใช้คำสั่ง:
git stash apply
แทน pop หากยังไม่พร้อมเสีย stashed code จาก conflict
หาก merge ไม่น่าเชื่อถือ ลอง rebase Rebasing คือกระบวนการย้ายหรือรวม sequence of commits ไปยัง base commit ใหม่ ในกรณี rebase ให้เปลี่ยนโค้ดเป็น:
git stash git pull --rebase origin master git stash pop
วิธีที่ 4: เปลี่ยนแปลงเฉพาะ『ส่วนเฉพาะ』ของโค้ด (Make changes to 'specific' parts of your code)
หากต้องการเปลี่ยนแปลงเฉพาะส่วนของโค้ด ไม่ใช่แทนที่ทั้งหมด ให้ commit ทุกอย่างที่ไม่ต้องการทับ แล้วทำตามวิธีที่ 3 ใช้คำสั่งสำหรับการเปลี่ยนแปลงที่ต้องการทับจากเวอร์ชันใน repository:
git checkout path/to/file/to/revert
หรือ
git checkout HEAD^ path/to/file/to/revert
ยังต้องแน่ใจว่าไฟล์ไม่ได้ staged ผ่าน:
git reset HEAD path/to/file/to/revert
จากนั้นดำเนินการ pull:
git pull
จะพยายามดึงเวอร์ชันจาก repository