การลบสาขาในคอมไพล์ลบออกจากประวัติหรือไม่?


190

มาจาก svn เพิ่งเริ่มทำความคุ้นเคยกับคอมไพล์

เมื่อสาขาถูกลบในคอมไพล์มันจะถูกลบออกจากประวัติ?

ใน svn คุณสามารถกู้คืนสาขาได้อย่างง่ายดายโดยการคืนค่าการดำเนินการลบ (ย้อนกลับผสาน) เช่นเดียวกับการลบทั้งหมดใน svn สาขาจะไม่ถูกลบจริงๆมันเพิ่งถูกลบออกจากทรีปัจจุบัน

หากสาขาถูกลบออกจากประวัติศาสตร์ในคอมไพล์แล้วจะเกิดอะไรขึ้นกับการเปลี่ยนแปลงที่รวมเข้าด้วยกันจากสาขานั้น? พวกเขายังคงอยู่หรือไม่

คำตอบ:


251

สาขาเป็นเพียงตัวชี้เพื่อคอมมิทคอม ในคอมไพล์คอมมิตแต่ละทรีมีต้นกำเนิดที่สมบูรณ์มันเป็นโครงสร้างที่แตกต่างกันมากจาก svn ที่ทุกสาขาและแท็ก (ตามแบบแผน) อาศัยอยู่ใน 'โฟลเดอร์' แยกต่างหากของที่เก็บพร้อมกับ 'ลำต้น' พิเศษ

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

หากสาขาถูกลบโดยไม่ถูกรวมเข้ากับสาขาอื่นดังนั้นคอมมิชชันในสาขานั้น (จนถึงจุดที่แยกจากการส่งที่ยังเข้าถึงได้) จะหยุดมองเห็น

คอมมิทจะยังคงอยู่ในที่เก็บและเป็นไปได้ที่จะกู้คืนทันทีหลังจากลบ แต่ในที่สุดจะถูกเก็บรวบรวมขยะ


3
ขอบคุณสำหรับคำตอบ. คุณช่วยอธิบายความหมายของคำว่า "การกระทำแต่ละรายการที่มีต้นกำเนิดที่สมบูรณ์" ได้หรือไม่? ดังที่ฉันเข้าใจแล้วการกระทำแต่ละอย่างในคอมไพล์คือชุดของเดลตาที่อ้างอิงกลับไปที่การคอมมิทของผู้ปกครองไม่ใช่ทรีทั้งต้น
Ken Liu

2
@Ken Liu: การกระทำมีพอยน์เตอร์เป็นศูนย์หรือมากกว่าพาเรนต์วัตถุต้นไม้และข้อมูลเมตาบางส่วนเกี่ยวกับการกระทำ การกระทำดังนั้นจึงระบุทั้งต้นไม้ต้นกำเนิดคู่และเมื่อดูกับผู้ปกครอง (s) การเปลี่ยนแปลงที่นำมาใช้
CB Bailey

9
@Ken Liu: ขึ้นอยู่กับสิ่งที่คุณได้รับโดย 'contain' แต่ใช่แล้วการกระทำแต่ละอย่างมีต้นไม้ที่สมบูรณ์ ในวัตถุฐานข้อมูลวัตถุจะถูกจัดทำดัชนีโดย id ดังนั้นวัตถุจะถูกใช้ร่วมกันระหว่างวัตถุทั้งหมด (ต้นไม้และการกระทำ) ที่อ้างอิงวัตถุเหล่านั้นดังนั้นค่าโสหุ้ยในการจัดเก็บโดยนัยจะไม่แย่เท่าที่ควรในตอนแรก git ยังมีการเพิ่มประสิทธิภาพการจัดเก็บข้อมูลที่มีประสิทธิภาพ (ไฟล์แพ็ค) ซึ่งทำให้การใช้พื้นที่ดิสก์มีประสิทธิภาพยิ่งขึ้น
CB Bailey

22
"ในที่สุดพวกเขาจะถูกเก็บขยะ" - ในที่สุดเมื่อไหร่?
BadHorsie

7
@BadHorsie, มันขึ้นอยู่กับ
AliOli

86

ใน Git สาขาเป็นเพียงพอยน์เตอร์ (การอ้างอิง) เพื่อคอมมิชชันในกราฟ acyclic (DAG) ของคอมมิท ซึ่งหมายความว่าการลบสาขาจะลบเฉพาะการอ้างอิงถึงการกระทำซึ่งอาจทำให้การกระทำบางอย่างใน DAG ไม่สามารถเข้าถึงได้จึงมองไม่เห็น แต่คอมมิชชันทั้งหมดที่อยู่ในสาขาที่ถูกลบจะยังคงอยู่ในที่เก็บอย่างน้อยก็จนกว่าคอมมิทที่เข้าถึงไม่ได้จะถูกตัด (เช่นใช้git gc)

โปรดทราบว่าgit branch -dจะปฏิเสธที่จะลบสาขาหากไม่แน่ใจว่าการลบสาขานั้นจะไม่สามารถเข้าถึงได้ คุณจำเป็นต้องใช้ความแข็งแกร่งgit branch -Dเพื่อบังคับการลบสาขาถ้ามันอาจทำให้ไม่สามารถเข้าถึงได้

โปรดทราบด้วยว่าการเข้าถึงที่ไม่สามารถเข้าถึงได้หากมีอยู่จะเป็นเพียงการกระทำระหว่างปลายสุดท้ายของสาขาที่ถูกลบและการกระทำที่รวมกับสาขาอื่นที่มีอยู่การกระทำที่ติดแท็กหรือการแยกสาขา ไม่ว่าจะในภายหลัง ตัวอย่างเช่นในสถานการณ์ต่อไปนี้:

---- O ---- * ---- * ---- / M ---- * <- master <- HEAD
     \ /
      \ -. ---- .-- / - x --- y <- ลบสาขา

คอมมิต 'x' และ 'y' เท่านั้นจะไม่สามารถเข้าถึงได้หลังจากลบสาขา

หากคุณดำเนินการในสาขาที่ถูกลบภายในgc.reflogExpireระยะเวลาเริ่มต้น 90 วันคุณจะมีเคล็ดลับสุดท้ายของสาขาที่ถูกลบบันทึกไว้ในการอ้างอิง HEAD (ดูgit reflog show HEADหรือgit log --oneline --walk-reflogs HEAD) คุณควรใช้ HEAD reflog เพื่อกู้คืนตัวชี้ที่ถูกลบ โปรดทราบว่าในกรณีนี้การเข้าถึงที่ไม่สามารถเข้าถึงได้ในสาขาที่ถูกลบจะได้รับการปกป้องจากการตัด (การลบ) ภายในgc.reflogExpireUnreachableระยะเวลาซึ่งโดยค่าเริ่มต้นคือ 30 วัน

หากคุณไม่พบส่วนปลายของสาขาที่เพิ่งลบใน reflog สำหรับ HEAD คุณสามารถลองใช้git fsckเพื่อค้นหา "ไม่สามารถเข้าถึงได้ <sha1>" แล้วตรวจสอบสิ่งเหล่านั้น (ผ่านgit show <sha1>หรือgit log <sha1>) เพื่อค้นหาเคล็ดลับของสาขาที่ถูกลบ

เป็นอิสระจากวิธีการที่คุณพบว่าเคล็ดลับของสาขาที่ถูกลบคุณสามารถยกเลิกการลบหรือสร้างสาขาที่เพิ่งลบใหม่โดยใช้

git branch <deleted-branch> <found-sha1-id>

อย่างไรก็ตามโปรดทราบว่าการ reflog สำหรับสาขาจะหายไป


นอกจากนี้ยังมีสคริปต์git-resurrect.shcontrib/ซึ่งช่วยในการค้นหาร่องรอยของปลายกิ่งที่มีชื่อที่กำหนดและกู้คืน (ยกเลิกการลบ)


1
! น่ากลัว git reflog show HEADการจดทะเบียนกระทำและฉันสร้างสาขาใหม่เหมือนที่คุณพูดสมบูรณ์แบบ
Steven Almeroth

2

หากคุณกังวลเกี่ยวกับสาขาที่ถูกลบโดยไม่ตั้งใจและไม่มีสำเนา repo ของคุณอีกต่อไปจะมีส่วนขยายไปยังเซิร์ฟเวอร์ Git ขององค์กรเช่น Gerrit ที่จะตรวจจับประวัติการเขียนซ้ำและการลบสาขาจะสำรองข้อมูลเหล่านั้นไว้ภายใต้การอ้างอิงพิเศษ สามารถเรียกคืนได้หากจำเป็นและจะไม่ถูกตัดทิ้งโดยการรวบรวมขยะ ผู้ดูแลระบบ Gerrit ยังคงสามารถลบข้อผูกพันที่เลือกได้หากจำเป็นด้วยเหตุผลทางกฎหมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.