🌱 Git Dangling Commit? Vì sao commit “mất tích” và “cách giải cứu” an toàn
Khi làm việc với Git, chắc hẳn không ít lần bạn gặp tình huống vừa commit xong nhưng checkout branch khác thì commit biến mất. Nhiều người lo lắng rằng code đã bị mất vĩnh viễn.
Đừng lo lắng! Thực tế, trong đa số trường hợp, commit đó vẫn còn tồn tại dưới dạng Dangling Commit hoặc Dangling Blob.
Bài viết này sẽ giúp bạn hiểu rõ bản chất của hiện tượng này và cách khôi phục commit một cách an toàn.
Git Dangling Commit / Dangling Blob là gì?
Trong Git, mọi thứ đều là object. Commit, file, thư mục đều được lưu dưới dạng object và được tham chiếu thông qua SHA.
- Dangling Commit là commit không còn được branch hoặc tag nào trỏ tới.
- Dangling Blob là object file (blob) không còn nằm trong commit nào đang được tham chiếu.
Điều quan trọng ở đây Dangling KHÔNG có nghĩa là bị xóa. Git vẫn giữ các object này cho đến khi cơ chế Garbage Collection (GC) chạy.
Vì sao commit bị “mất tích” khi checkout branch?
Nguyên nhân phổ biến nhất là bạn đã:
- Commit ở một branch local
- Sau đó checkout sang branch remote (origin/xxx)
Khi checkout trực tiếp origin/main, Git đưa bạn vào trạng thái detached HEAD. Lúc này, nếu bạn tạo commit mới rồi checkout sang branch khác, commit đó không được branch nào trỏ tới và trở thành
dangling commit.
Do git log chỉ hiển thị lịch sử từ HEAD hiện tại, nên commit cũ không còn xuất hiện, khiến bạn tưởng rằng commit đã mất. Dưới đây là một ví dụ rất phổ biến sinh ra Dangling Commit khi làm việc với Git:
① Ban đầu bạn checkout vào remote branch:
git checkout origin/dev
Trường hợp này Detached HEAD xuất hiện, HEAD trỏ trực tiếp vào commit E, không trỏ vào branch local nào!② Bây giờ dev tiếp tục dev và commit:
git commit -m "Commit D"
Ở đây Commit D được tạo nhưng không branch nào trỏ tới D!③ Tiếp tục checkout sang branch khác
git checkout dev
Lúc này Commit D bị “bỏ rơi”, tuy nhiên nó vẫn tồn tại trong Git object database và hoàn toàn có thể khôi phục được!
Cách tìm và khôi phục Dangling Commit an toàn
🔻 Cách hiệu quả nhất để tìm lại commit là sử dụng git reflog:
git reflog --oneline Reflog lưu lại toàn bộ lịch sử di chuyển của HEAD, kể cả những commit không còn branch trỏ tới. Khi đã tìm được SHA của commit, bạn nên khôi phục bằng cách tạo branch mới:git checkout -b recover-commit <commit-sha>
Đây là cách an toàn nhất, tránh ảnh hưởng đến các branch hiện tại trong project.
🔻 Một cách giải quyết khác nếu bạn muốn đưa commit bị "thất lạc" đó vào branch mình đang làm việc (ví dụ 'dev' branch), sử dụng 'git cherry-pick':
git checkout dev
git cherry-pick <commit-sha>
🔻 Để giải quyết triệt để Dangling Commit, tránh mất dấu commit trong detached HEAD là luôn tạo branch trước khi commit:
git checkout -b dev origin/dev📹 Video về Dangling Commit và cách giải quyết:
Kết luận
Git rất hiếm khi tự làm mất dữ liệu của bạn. Phần lớn các trường hợp commit “biến mất” thực chất chỉ là Dangling Commit do không còn branch tham chiếu. Hiểu rõ cơ chế object, branch và detached HEAD sẽ giúp bạn:
- Không hoảng loạn khi commit không xuất hiện
- Khôi phục code nhanh chóng, an toàn
- Làm việc với Git tự tin và chuyên nghiệp hơn
>>>>>> Follow ngay <<<<<<<
Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊


