Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

Git Force Pull: บังคับดึงข้อมูลจาก Remote Repository

Git จะป้องกันไม่ให้ pull ไฟล์มาที่เครื่อง Local หากมีการเปลี่ยนแปลงที่ยังไม่บันทึก (unsaved) หรือไฟล์ที่ยังไม่ได้ track (untracked) ซึ่งจะถูกเขียนทับโดยการ merge คุณสามารถใช้วิธี Force Pull เพื่อบังคับให้ Git ดึงการเปลี่ยนแปลงที่ต้องการมาที่เครื่อง Local

ในคู่มือนี้ เราจะอธิบายพร้อมตัวอย่างวิธี Force Pull เนื้อหาของ Git Repository จะพูดถึงคำสั่ง git pull และ fetch รวมถึงการใช้ reset option เพื่อ force pull

Pulling คืออะไร?

การดำเนินการ Git Pull จะดาวน์โหลด metadata และไฟล์ทั้งหมดจาก Remote Repository และอัปเดต Local Repository ตามข้อมูลที่ดึงมา

Pulling เป็นวิธีที่ใช้ทำให้ไฟล์ Local อยู่ในสภาพเดียวกับ Remote Repository คุณจะต้อง pull repository หากต้องการดาวน์โหลดการเปลี่ยนแปลงที่ผู้อื่นทำบน Remote Repository การ Pull ไม่ได้เกิดขึ้นโดยอัตโนมัติ

Pull ไม่สามารถทำได้เมื่อมี untracked files ที่จะถูกเขียนทับ หมายถึงคุณมีไฟล์บน Local Branch ที่ยังไม่ได้ add เข้า Git Repository และจะถูกแทนที่หาก pull เกิดขึ้น

คุณไม่สามารถ pull repository ได้หากมี unsaved changes บนเครื่อง Local ที่จะถูกเขียนทับโดยการ pull

Git: Force Pull

เรากำลังทำงานบน Repository ชื่อ ck-git ซึ่งมีโค้ดสำหรับโปรเจกต์เว็บ เพื่อนร่วมทีมเพิ่งอัปเดตไฟล์ README.md เราได้อัปเดตไฟล์นั้นบนเครื่องของเราแต่ยังไม่ได้ push ไปยัง Repository

ลองดูว่าจะเกิดอะไรขึ้นเมื่อเราพยายาม pull การเปลี่ยนแปลง:

git pull

คำสั่งนี้คืนค่า Error:

error: Your local changes to the following files would be overwritten by merge: README.md Please, commit your changes or stash them before you can merge.

เรามี 3 ทางเลือก: commit การเปลี่ยนแปลง stash ไว้ หรือบังคับให้ Git pull ทั้งๆ ที่จะเขียนทับไฟล์ของเรา

เราสามารถบังคับ Git ให้ pull การเปลี่ยนแปลงได้โดย fetch การเปลี่ยนแปลงที่ทำไปแล้ว แล้ว reset Repository ให้แสดงการเปลี่ยนแปลงเหล่านั้น เริ่มต้นด้วยการ fetch โดยใช้คำสั่ง git fetch:

git fetch --all

คำสั่งนี้ดึง metadata ทั้งหมดของการเปลี่ยนแปลงที่ทำไปที่ Remote Repository ต่อไป เราจะ backup Branch ปัจจุบัน เพื่อให้แน่ใจว่าไม่สูญเสียงานเมื่อโค้ดถูกเขียนทับ

เราสามารถ backup branch ได้ด้วยคำสั่ง git branch:

git branch backup

คำสั่งนี้สร้าง branch ใหม่ชื่อ "backup" ตอนที่มี backup branch แล้ว เราสามารถ reset repository ให้แสดงเนื้อหาของ Remote Repository ได้

เราจะใช้คำสั่ง git reset เพื่ออัปเดต Repository:

git reset --hard origin/master

Option --hard จะดาวน์โหลดไฟล์ทั้งหมดจาก Remote Repository และเพิ่มเข้าไปใน Local Working Copyของโปรเจกต์ ซึ่งจะเขียนทับการเปลี่ยนแปลงที่คุณทำไป

คำว่า origin/master หมายถึง Branch ที่เรากำลังดึงข้อมูล เรากำลังดาวน์โหลดเนื้อหาของ Branch "master" จาก Remote Repository "origin"

หากคุณทำงานกับ Repository ที่มี Branch หรือ Remote Name ต่างกัน สามารถใช้สูตรนี้เป็นแนวทาง:

git reset --hard <remote>/<branch>

คำสั่ง git reset จะ reset repository ไปยัง commit ล่าสุดที่เรา fetch มา

การบันทึกการเปลี่ยนแปลงที่ยังไม่ Commit

คุณสามารถบันทึกการเปลี่ยนแปลงที่ยังไม่ commit ได้โดยใช้คำสั่ง git stash คำสั่งนี้จะ "stash" โค้ดของคุณไว้เพื่อใช้ภายหลัง ลองสร้าง stash ของโค้ดเรา:

git stash

การเปลี่ยนแปลงทั้งหมดที่เราทำไปที่ Repository จะถูกบันทึกไว้ใน stash เมื่อเราพร้อมที่จะทำงานกับการเปลี่ยนแปลงเหล่านั้นอีกครั้ง เราสามารถ "pop" stash ของเราได้:

git stash pop

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการบันทึกด้วย git stash ในบทความ git stash tutorial ของเรา

สรุป

คุณสามารถบังคับ Git Repository ให้ pull เนื้อหาจาก Remote Repository ได้ โดยต้อง fetch เนื้อหาของ Repository ก่อน เมื่อ fetch แล้ว คุณสามารถ reset การเปลี่ยนแปลงให้ตรงกับ Branch บน Remote Repository ที่คุณต้องการให้ Codebase ใช้งาน

ตอนนี้คุณมีความรู้เพียงพอที่จะ Force Git Pull Operation ได้แล้ว!