Trong Git, các nhánh chỉ là các con trỏ (tham chiếu) để xác nhận trong một biểu đồ chu kỳ có hướng (DAG) của các xác nhận. Điều này có nghĩa là việc xóa một nhánh chỉ xóa các tham chiếu đến các xác nhận, điều này có thể làm cho một số cam kết trong DAG không thể truy cập được, do đó không thể nhìn thấy. Nhưng tất cả các cam kết trên một nhánh bị xóa vẫn sẽ nằm trong kho lưu trữ, ít nhất là cho đến khi các cam kết không thể truy cập được cắt tỉa (ví dụ: sử dụng git gc
).
Lưu ý rằng git branch -d
sẽ từ chối xóa một chi nhánh nếu không thể chắc chắn rằng việc xóa nó sẽ không để lại các cam kết không thể truy cập được. Bạn cần sử dụng mạnh hơn git branch -D
để buộc xóa chi nhánh nếu nó có thể để lại các cam kết không thể truy cập được.
Cũng lưu ý rằng các cam kết không thể truy cập được, nếu chúng có mặt, chỉ là các cam kết giữa đầu cuối của nhánh bị xóa và một cam kết đã được sáp nhập với một nhánh hiện có khác, bất kỳ cam kết được gắn thẻ hoặc điểm phân nhánh; Bất cứ cái nào đến sau. Ví dụ trong tình huống sau:
---- O ---- * ---- * ---- / M ---- * <- chủ <- TRỤ
\ /
\ --. ---- .-- / - x --- y <- đã xóa chi nhánh
chỉ cam kết 'x' và 'y' sẽ không thể truy cập được sau khi xóa chi nhánh.
Nếu bạn hoạt động trên một chi nhánh bị xóa trong gc.reflogExpire
khoảng thời gian, mặc định là 90 ngày, bạn sẽ có mẹo cuối cùng của một chi nhánh bị xóa được ghi lại trong phần reflog (xem git reflog show HEAD
, hoặc git log --oneline --walk-reflogs HEAD
). Bạn sẽ có thể sử dụng reflog CHÍNH để khôi phục con trỏ đã xóa. Cũng lưu ý rằng trong trường hợp này, các cam kết không thể truy cập chỉ trong một nhánh bị xóa sẽ được bảo vệ khỏi việc cắt tỉa (loại bỏ) trong gc.reflogExpireUnreachable
khoảng thời gian, theo mặc định là 30 ngày.
Nếu bạn không thể tìm thấy đầu của một nhánh vừa bị xóa trong reflog cho HEAD, bạn có thể thử sử dụng git fsck
để tìm "cam kết không thể truy cập <sha1>" và kiểm tra các nhánh (thông qua git show <sha1>
hoặc git log <sha1>
) để tìm đầu của nhánh bị xóa.
Độc lập với cách bạn tìm thấy đầu của một nhánh bị xóa, bạn có thể hoàn tác xóa hoặc thay vào đó tạo lại một nhánh vừa bị xóa bằng cách sử dụng
git branch <deleted-branch> <found-sha1-id>
Tuy nhiên, lưu ý rằng reflog cho một chi nhánh sẽ bị mất.
Ngoài ra còn có tập lệnh git-resurrect.sh trong contrib/
đó giúp tìm dấu vết của một đầu nhánh với tên đã cho và hồi sinh (không xóa) nó.