บิตที่สับสนอยู่ที่นี่:
Git ไม่เคยเห็นไฟล์เหล่านั้นเป็นไฟล์เดี่ยวเลย Git คิดว่าทุกสิ่งเป็นเนื้อหาที่สมบูรณ์
Git มักจะใช้แฮช 160 บิตแทนวัตถุใน repo ของตัวเอง แผนผังไฟล์เป็นรายการชื่อและแฮชที่สัมพันธ์กับเนื้อหาของแต่ละรายการ (รวมถึงข้อมูลเมตาบางส่วน)
แต่แฮชขนาด 160 บิตจะระบุเนื้อหาโดยเฉพาะ (ภายในจักรวาลของฐานข้อมูล git) ดังนั้นต้นไม้ที่มีแฮชในขณะที่เนื้อหาจะมีเนื้อหาอยู่ในสถานะ
หากคุณเปลี่ยนสถานะของเนื้อหาของไฟล์แฮชจะเปลี่ยนไป แต่ถ้าแฮชของมันเปลี่ยนไปแฮชที่เชื่อมโยงกับเนื้อหาของชื่อไฟล์ก็จะเปลี่ยนไปเช่นกัน ซึ่งจะเปลี่ยนการแฮชของ "ไดเรกทอรีต้นไม้"
เมื่อร้านค้าฐานข้อมูลคอมไพล์ต้นไม้ไดเรกทอรีที่ต้นไม้ไดเรกทอรีนัยและรวมทั้งหมดของเนื้อหาทั้งหมดของไดเรกทอรีและไฟล์ทั้งหมดที่อยู่ในนั้น
มันถูกจัดระเบียบในโครงสร้างต้นไม้ที่มีตัวชี้ (ไม่เปลี่ยนรูปได้, นำกลับมาใช้ใหม่ได้) ไปที่ blobs หรือต้นไม้อื่น ๆ แต่เหตุผลมันเป็นภาพรวมเดียวของเนื้อหาทั้งหมดของต้นไม้ทั้งหมด การแสดงในฐานข้อมูล git ไม่ใช่เนื้อหาข้อมูลแบบเรียบ แต่มีเหตุผลคือเป็นข้อมูลทั้งหมดและไม่มีอะไรอื่น
หากคุณทำให้ต้นไม้เป็นอนุกรมกับระบบไฟล์ลบโฟลเดอร์. git ทั้งหมดและบอกให้ git เพิ่ม tree กลับเข้าไปในฐานข้อมูลของมันคุณจะไม่ต้องเพิ่มอะไรลงในฐานข้อมูล - องค์ประกอบจะมีอยู่แล้ว
มันอาจช่วยให้คิดถึงแฮชของคอมไพล์เป็นตัวชี้นับที่อ้างอิงกับข้อมูลที่ไม่เปลี่ยน
หากคุณสร้างแอปพลิเคชันรอบ ๆ เอกสารจะเป็นกลุ่มของเพจซึ่งมีเลเยอร์ซึ่งมีกลุ่มที่มีวัตถุ
เมื่อคุณต้องการเปลี่ยนวัตถุคุณต้องสร้างกลุ่มใหม่ทั้งหมดสำหรับมัน หากคุณต้องการเปลี่ยนกลุ่มคุณต้องสร้างเลเยอร์ใหม่ซึ่งต้องการหน้าใหม่ซึ่งต้องการเอกสารใหม่
ทุกครั้งที่คุณเปลี่ยนวัตถุเดียวมันจะวางไข่เอกสารใหม่ เอกสารเก่ายังคงมีอยู่ เอกสารใหม่และเก่าแบ่งปันเนื้อหาส่วนใหญ่ของพวกเขา - พวกเขามีหน้าเดียวกัน (ยกเว้น 1) หน้านั้นมีเลเยอร์เดียวกัน (ยกเว้น 1) เลเยอร์นั้นมีกลุ่มเดียวกัน (ยกเว้น 1) กลุ่มนั้นมีวัตถุเดียวกัน (ยกเว้น 1)
และในทำนองเดียวกันฉันหมายถึงสำเนาที่มีเหตุผล แต่การนำไปใช้อย่างชาญฉลาดมันเป็นเพียงตัวชี้นับที่อ้างอิงถึงวัตถุที่เปลี่ยนแปลงไม่ได้
repo คอมไพล์เป็นจำนวนมากเช่นนั้น
ซึ่งหมายความว่าเซ็ตการแก้ไข git ที่กำหนดนั้นมีข้อความการคอมมิท (เป็นรหัสแฮช) มันมีแผนผังการทำงานและมีการเปลี่ยนแปลงพาเรนต์
การเปลี่ยนแปลงพาเรนต์เหล่านั้นจะมีการเปลี่ยนแปลงพาเรนต์ไปตลอดทาง
ส่วนของ repo git ที่มีประวัติคือสายโซ่แห่งการเปลี่ยนแปลง สายโซ่แห่งการเปลี่ยนแปลงนั้นอยู่ในระดับเหนือต้นไม้ "ไดเรกทอรี" - จากต้นไม้ "ไดเรกทอรี" คุณไม่สามารถไปที่ชุดการเปลี่ยนแปลงและสายการเปลี่ยนแปลงโดยไม่ซ้ำกัน
เพื่อค้นหาว่าเกิดอะไรขึ้นกับไฟล์คุณเริ่มต้นด้วยไฟล์นั้นในเซ็ตการแก้ไข เซ็ตการแก้ไขนั้นมีประวัติ บ่อยครั้งในประวัติศาสตร์นั้นมีไฟล์ชื่อเดียวกันอยู่บางครั้งมีเนื้อหาเหมือนกัน หากเนื้อหาเหมือนกันแสดงว่าไม่มีการเปลี่ยนแปลงกับไฟล์ หากมีความแตกต่างมีการเปลี่ยนแปลงและงานต้องทำเพื่อให้ได้สิ่งที่แน่นอน
บางครั้งไฟล์ก็หายไป; แต่ทรี "ไดเรกทอรี" อาจมีไฟล์อื่นที่มีเนื้อหาเหมือนกัน (รหัสแฮชเดียวกัน) ดังนั้นเราจึงสามารถติดตามได้ในลักษณะนั้น (หมายเหตุนี่คือสาเหตุที่คุณต้องการให้คอมมิทบังคับย้ายไฟล์แยกจากคอมมิท -Edit) หรือชื่อไฟล์เดียวกันและหลังจากตรวจสอบไฟล์แล้วก็มีความคล้ายคลึงกันพอสมควร
ดังนั้นคอมไพล์สามารถปะติดปะต่อ "ประวัติไฟล์" เข้าด้วยกันได้
แต่ประวัติไฟล์นี้มาจากการแยกวิเคราะห์ "ชุดการเปลี่ยนแปลงทั้งหมด" ที่มีประสิทธิภาพไม่ใช่จากลิงก์จากไฟล์หนึ่งไปยังอีกเวอร์ชั่นหนึ่ง