ใน 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/
ซึ่งช่วยในการค้นหาร่องรอยของปลายกิ่งที่มีชื่อที่กำหนดและกู้คืน (ยกเลิกการลบ)