คุณไม่สามารถดึงโค้ดจากที่เก็บแบบรีโมตได้ หากมีข้อขัดแย้งระหว่างการเปลี่ยนแปลงที่ไม่ได้คอมมิตที่คุณทำบนเครื่องโลคัลและเนื้อหาของที่เก็บรีโมต ซึ่งจะช่วยปกป้องคุณจากการเขียนทับโค้ดที่คุณต้องการเก็บไว้
ในคู่มือนี้ เราจะพูดถึงข้อผิดพลาด "การเปลี่ยนแปลงในเครื่องของคุณในไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน" และสาเหตุที่ทำให้เกิดข้อผิดพลาด เราจะอธิบายในตัวอย่างเพื่อให้คุณได้เรียนรู้วิธีแก้ไขข้อผิดพลาดนี้
การเปลี่ยนแปลงในเครื่องของคุณกับไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน
เวอร์ชันโลคัลของที่เก็บของคุณมักจะแตกต่างจากที่เก็บแบบรีโมต นี่เป็นคุณสมบัติหลักของ Git:คุณสามารถทำการเปลี่ยนแปลงในเครื่องโดยไม่ต้องกดไปที่ที่เก็บระยะไกลจนกว่าคุณจะพร้อม
เมื่อคุณดึงโค้ดจากที่เก็บระยะไกล Git จะดึงเนื้อหาของที่เก็บนั้นและบันทึกลงในเครื่องท้องถิ่นของคุณ สิ่งนี้สามารถเกิดขึ้นได้ก็ต่อเมื่อคุณคอมมิตการเปลี่ยนแปลงทั้งหมดกับไฟล์ที่คุณต้องการบันทึก
หากคุณพยายามดึงโค้ดโดยไม่ทำการเปลี่ยนแปลงในครั้งแรก คุณอาจเห็นข้อผิดพลาด "การเปลี่ยนแปลงในเครื่องของคุณในไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน" สิ่งนี้จะเกิดขึ้นก็ต่อเมื่อคุณได้แก้ไขไฟล์ที่มีการเปลี่ยนแปลงในเวอร์ชันระยะไกลของที่เก็บด้วย
ตัวอย่างสถานการณ์
มาแก้ไขที่เก็บ Git ที่เรียกว่า ck-git กัน ขั้นแรก ให้โคลนสำเนาของที่เก็บนี้:
git clone https://github.com/career-karma-tutorials/ck-git
ตอนนี้เรามีสำเนาของที่เก็บในเครื่องของเราแล้ว ที่เก็บนี้มีไฟล์เดียว:README.md เนื้อหาคือ:
# ck-git
เราจะไปที่ GitHub และแก้ไขไฟล์นี้บนเซิร์ฟเวอร์ ไฟล์ของเราตอนนี้มีเนื้อหา:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
# Career Karma Git
ที่เก็บเวอร์ชันภายในเครื่องของเราตอนนี้แตกต่างจากสาขาหลักต้นทางบนเวอร์ชันระยะไกลของที่เก็บ
เวอร์ชันของเรามีโค้ดที่อยู่ในที่เก็บระยะไกลเมื่อเราดึงโค้ด ที่เก็บระยะไกลมีการเปลี่ยนแปลงที่เราได้ทำกับ README.md
ตอนนี้ สมมติว่าเราเปลี่ยน README.md บนเครื่องของเรา:
# CK Git
เราได้เปลี่ยนไฟล์ของเรา ตอนนี้ เรามาลองดึงการเปลี่ยนแปลงที่เราทำกับที่เก็บระยะไกลของเรากัน เพื่อให้เราสามารถบันทึกลงในเครื่องท้องถิ่นของเรา:
git pull
คำสั่งนี้ส่งคืนข้อผิดพลาด:
... Updating a30b784..ec281fc error: Your local changes to the following files would be overwritten by merge: README.md Please commit your changes or stash them before you merge. Aborting
เราได้ย่อการตอบสนองของคำสั่งนี้ให้สั้นลง ข้อความที่เราควรเน้นคือ “การเปลี่ยนแปลงในเครื่องของคุณกับไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน”
การแก้ปัญหา
ขณะนี้มีไฟล์ของเราสองชุด:ชุดหนึ่งอยู่ในเครื่องของเรา และอีกชุดหนึ่งอยู่ในที่เก็บระยะไกลของเรา เมื่อเราดึงโค้ดจากที่เก็บระยะไกล Git ไม่แน่ใจว่าไฟล์เวอร์ชันใดควรเหลืออยู่
เพื่อแก้ไขข้อผิดพลาดนี้ เราสามารถซ่อนโค้ดของเราหรือคอมมิตโค้ดของเราก็ได้
ในการคอมมิตโค้ดของเรา เราสามารถเพิ่มไฟล์ README.md ในการคอมมิต และสร้างคอมมิตที่มีไฟล์นั้นได้:
git add README.md git commit -m "docs: Update README.md"
สิ่งนี้จะเพิ่มการเปลี่ยนแปลงที่เราทำกับ README.md บนเครื่องท้องถิ่นของเราไปยังประวัติการคอมมิตของโปรเจ็กต์ของเรา Git จะได้รู้ว่าเราต้องการเก็บการเปลี่ยนแปลงเหล่านี้ไว้
วิธีที่สองคือการซ่อนการเปลี่ยนแปลงของเรา ซึ่งช่วยให้เราบันทึกการเปลี่ยนแปลงไว้ดูภายหลังได้ เราสามารถซ่อนรหัสของเราโดยใช้คำสั่ง git stash:
git stash
คำสั่งนี้จะบันทึกการเปลี่ยนแปลงของเราไว้ในที่ซ่อน (รหัสของเรา "ซ่อนไว้" ไว้ใช้ภายหลัง) ตอนนี้เราได้ซ่อนโค้ดของเราแล้ว เราสามารถดึงโค้ดจากที่เก็บระยะไกลได้อย่างปลอดภัย:
git stash pop
สามารถดูโค้ดใน Git stash ได้ด้วยการรันคำสั่ง git stash pop ซึ่งจะทำให้เราเห็นการเปลี่ยนแปลงที่เราได้ทำกับไฟล์ซึ่งเราไม่ได้กระทำกับที่เก็บของเรา ซึ่งหมายความว่าหากเราตัดสินใจว่าต้องการคอมมิตการเปลี่ยนแปลงกับไฟล์ในภายหลัง เราก็สามารถทำได้
บทสรุป
ข้อผิดพลาด "การเปลี่ยนแปลงในเครื่องของคุณกับไฟล์ต่อไปนี้จะถูกเขียนทับโดยการผสาน" เกิดขึ้นเมื่อคุณพยายามดึงที่เก็บระยะไกลไปยังเครื่องในพื้นที่ของคุณซึ่งมีเนื้อหาขัดแย้งกับเนื้อหาของเวอร์ชันท้องถิ่นของที่เก็บ
ในการแก้ไขข้อผิดพลาดนี้ ให้ซ่อนการเปลี่ยนแปลงของคุณไว้ในภายหลังหรือยอมรับการเปลี่ยนแปลงของคุณ ตอนนี้คุณมีความรู้ที่จำเป็นในการแก้ไขข้อผิดพลาดนี้อย่างผู้เชี่ยวชาญแล้ว!