Git ติดตามเนื้อหาไฟล์ไม่ใช่ชื่อไฟล์ ดังนั้นการเปลี่ยนชื่อไฟล์โดยไม่เปลี่ยนเนื้อหาจึงเป็นเรื่องง่ายสำหรับการตรวจจับคอมไพล์ (Git ไม่ได้ติดตาม แต่ทำการตรวจจับโดยใช้git mvหรือgit rmและgit addมีประสิทธิภาพเหมือนกัน)
เมื่อไฟล์ถูกเพิ่มลงในที่เก็บชื่อไฟล์จะอยู่ในอ็อบเจ็กต์ทรี เนื้อหาไฟล์จริงถูกเพิ่มเป็นวัตถุไบนารีขนาดใหญ่ ( หยด ) ในที่เก็บ Git จะไม่เพิ่ม blob อื่นสำหรับไฟล์เพิ่มเติมที่มีเนื้อหาเดียวกัน ในความเป็นจริง Git ไม่สามารถจัดเก็บเนื้อหาในระบบไฟล์โดยมีอักขระสองตัวแรกของแฮชเป็นชื่อไดเร็กทอรีและส่วนที่เหลือเป็นชื่อไฟล์ภายใน ดังนั้นการตรวจจับการเปลี่ยนชื่อจึงเป็นเรื่องของการเปรียบเทียบแฮช
ในการตรวจจับการเปลี่ยนแปลงเล็กน้อยของไฟล์ที่เปลี่ยนชื่อ Git จะใช้อัลกอริทึมบางอย่างและขีด จำกัด ขีด จำกัด เพื่อดูว่านี่เป็นการเปลี่ยนชื่อหรือไม่ ตัวอย่างเช่นมีลักษณะที่เป็นธง-M git diffนอกจากนี้ยังมีค่าคอนฟิกูเรชันเช่นmerge.renameLimit(จำนวนไฟล์ที่ต้องพิจารณาเมื่อทำการตรวจหาการเปลี่ยนชื่อระหว่างการผสาน)
หากต้องการทำความเข้าใจว่า git ปฏิบัติกับไฟล์ที่คล้ายกันอย่างไร (กล่าวคือการแปลงไฟล์ใดที่ถือเป็นการเปลี่ยนชื่อ) ให้สำรวจตัวเลือกการกำหนดค่าและแฟล็กที่มีให้ตามที่กล่าวไว้ข้างต้น คุณไม่จำเป็นต้องพิจารณาด้วยวิธีการ เพื่อทำความเข้าใจว่า git ทำงานเหล่านี้ให้สำเร็จได้อย่างไรให้ดูที่อัลกอริทึมเพื่อค้นหาความแตกต่างของข้อความและอ่านซอร์สโค้ด git
อัลกอริทึมถูกนำไปใช้เพื่อวัตถุประสงค์ที่แตกต่างผสานและบันทึกเท่านั้นซึ่งจะไม่ส่งผลต่อวิธีการจัดเก็บ git การเปลี่ยนแปลงเล็กน้อยในเนื้อหาไฟล์หมายความว่ามีการเพิ่มออบเจ็กต์ใหม่สำหรับมัน ไม่มีเดลต้าหรือความแตกต่างเกิดขึ้นที่ระดับนั้น แน่นอนในภายหลังอ็อบเจ็กต์อาจถูกบรรจุโดยที่เดลต้าถูกเก็บไว้ในไฟล์แพ็คไฟล์ แต่ไม่เกี่ยวข้องกับการตรวจจับการเปลี่ยนชื่อ