Git: một cam kết / blob lơ lửng là gì và chúng đến từ đâu?


148

Tôi đang tìm kiếm thông tin cơ bản về các cam kết & các đốm màu.

Repo của tôi có vẻ tốt Nhưng tôi đã chạy git fscklần đầu tiên để xem những gì nó đã làm và tôi có một danh sách dài các 'đốm sáng lơ lửng' và một 'cam kết lơ lửng'.

Những thứ này là gì? Họ đến từ đâu vậy? Họ có chỉ ra điều gì bất thường (tốt hay xấu) về tình trạng repo của tôi không?

Câu trả lời:


95

Trong quá trình làm việc với kho git của bạn, bạn có thể sẽ ngừng hoạt động và thực hiện các động thái khác gây ra các đốm trung gian, và thậm chí một số điều mà git làm cho bạn để tránh mất thông tin.

Cuối cùng (theo điều kiện, theo trang git gc man ) nó sẽ thực hiện thu gom rác và dọn dẹp những thứ này. Bạn cũng có thể buộc nó bằng cách gọi quy trình thu gom rác , git gc.

Để biết thêm thông tin về điều này, hãy xem Bảo trì và Phục hồi dữ liệu trên trang git-scm.

Việc chạy thủ công của GC theo mặc định sẽ để lại 2 tuần trước thời gian chạy lệnh này của mạng an toàn. Trên thực tế, đôi khi nên chạy GC để giúp đảm bảo sử dụng hiệu quả kho lưu trữ git của bạn. Tuy nhiên, giống như bất cứ điều gì, bạn nên hiểu những gì nó đang làm trước khi phá hủy những thứ có thể quan trọng đối với bạn.


10
Vì vậy, thật công bằng khi nói rằng 1) trừ khi tôi nghĩ rằng có một số điều sai trái với repo của tôi, việc gỡ bỏ những thứ này là an toàn git gcvà 2) Tôi không cần phải lo lắng về điều này bởi vì các bit lơ lửng này là bình thường và git đã xử lý chúng?
ngờ1ejack

7
Đó sẽ là một đánh giá công bằng.
vgoff

9
Ngoài ra, bất cứ khi nào bạn 'git add' một tệp, nhưng không cam kết phiên bản chính xác của tệp đó, bạn sẽ kết thúc với một đốm màu lơ lửng. Không có gì phải lo lắng cả.
cant7

7
myst1ejack - Nói chung, bạn không nên chạy bộ sưu tập rác thủ công. Đó là một thói quen xấu để xâm nhập và git thu gom rác khi cần thiết. Bất lợi khi chạy thủ công là bạn mất khả năng phục hồi các đốm màu lơ lửng và cam kết rằng bạn có thể không muốn ngay bây giờ nhưng bạn có thể muốn trong tương lai. Khi bạn chạy bộ sưu tập rác, bạn sẽ lấy đi một số chức năng hoàn nguyên khá mạnh mẽ từ git. Sử dụng thận trọng và là ngoại lệ, không phải là quy tắc. --- Hãy để git làm việc của nó.
Elijah Lynn

95

Dangling blob = Một thay đổi đã làm cho khu vực / chỉ mục dàn dựng nhưng không bao giờ được cam kết. Một điều đáng kinh ngạc với git là một khi nó được thêm vào khu vực tổ chức, bạn luôn có thể lấy lại vì những đốm màu này hoạt động giống như cam kết rằng chúng cũng có hàm băm !!

Cam kết cam kết = Một cam kết không được liên kết trực tiếp bởi bất kỳ cam kết con, chi nhánh, thẻ hoặc tham chiếu nào khác. Bạn cũng có thể lấy lại những thứ này!


5
'Tổ tiên' có nên đọc 'hậu duệ' không? Nói chung, bạn không thể đạt được bất kỳ cam kết git nào thông qua tổ tiên của nó.
Phil Miller

@Nigsocrat Tôi cũng có suy nghĩ tương tự, tôi đồng ý có lẽ nên đọc con cháu.
stbest

1
Tôi vẫn đọc "lên ngôi" trong câu trả lời của bạn. Có vẻ như phiên bản của bạn từ ngày 2 tháng 7 đã không sửa lỗi chính tả.
iclman

Làm thế nào để bạn lấy lại một blob lơ lửng?
HelloGoodbye

1
@ElijahLynn Bạn nói đúng. Tôi nghĩ rằng tôi đọc một chút quá nhanh các cuộc thảo luận. Một cam kết lơ lửng không có bất kỳ hậu duệ / con và không được tham chiếu bởi một thẻ hoặc chi nhánh.
iclman

44

HOWTO xóa tất cả các cam kết lơ lửng khỏi kho git của bạn từ http://www.tekkie.ro/news/howto-remove-all-dangling-commits-from-your-git-reposeective/

git reflog expire --expire=now --all
git gc --prune=now

Hãy chắc chắn rằng bạn thực sự muốn loại bỏ chúng, vì bạn có thể quyết định rằng bạn cần chúng sau tất cả.


5
Trong thực tế, hầu hết người dùng không bao giờ cần điều này và nếu họ làm điều đó có lẽ là cho một trường hợp sử dụng theo chương trình. Theo tôi, không gian đĩa được lưu hoặc tăng tốc độ bằng cách loại bỏ các cam kết lơ lửng không đáng để tôi nỗ lực.
Elijah Lynn

1
Điều này trả lời một câu hỏi khác nhau.
Elijah Lynn

5

Một cam kết lơ lửng là một cam kết không liên quan đến tham chiếu, tức là không có cách nào để đạt được nó.

Ví dụ, hãy xem xét sơ đồ dưới đây. Giả sử chúng ta xóa tính năng nhánhX mà không hợp nhất các thay đổi của nó, thì cam kết D sẽ trở thành một cam kết lơ lửng vì không có tham chiếu nào liên quan đến nó. Nếu nó đã được hợp nhất thành chủ, thì các tham chiếu CHÍNH và chính sẽ chỉ ra cam kết D và nó sẽ không còn nguy hiểm nữa, ngay cả khi chúng tôi đã xóa tính năngX. Đọc ghi chú sau sơ đồ để hiểu rõ hơn về điều này.

Git tự động thu gom rác (nghĩa là xử lý) cam kết treo lủng lẳng. Chúng ta có thể sử dụng git reflogđể khôi phục một nhánh (của các cam kết lơ lửng) đã bị xóa mà không hợp nhất nó. Chúng tôi chỉ có thể khôi phục các xác nhận đã xóa nếu nó có trong kho đối tượng cục bộ. Nếu đó là rác được thu thập, thì chúng ta không thể phục hồi nó.

nhập mô tả hình ảnh ở đây

LƯU Ý rằng một tên nhánh tức là nhãn nhánh thực sự là một tham chiếu đến cam kết mới nhất trên một nhánh tức là đầu nhánh. Trong sơ đồ trên, FeatureX, master và HEAD chỉ là các tham chiếu đến các cam kết cụ thể. nhãn FeatureX và master đề cập đến các cam kết mới nhất trên các nhánh tương ứng của chúng. Đầu thường nói đến đầu của nhánh hiện đang được kiểm tra (chủ trong trường hợp này). Nếu bạn kiểm tra một cam kết cũ hơn trên nhánh hiện tại của mình, thì HEAD sẽ ở trạng thái tách rời, nghĩa là nó sẽ trỏ đến cam kết cũ thay vì cam kết mới nhất. Cũng lưu ý rằng HEAD được gọi là một tham chiếu tượng trưng vì nó thực sự trỏ đến nhãn nhánh hiện tại và bất kỳ nhãn nhánh nào luôn luôn trỏ đến đỉnh của nhánh. Vì vậy, trong những trường hợp bình thường, CHÍNH gián tiếp chỉ ra cam kết mới nhất.

Bên cạnh đó, lưu ý rằng Git đại diện cho biểu đồ / lịch sử cam kết của nó dưới dạng biểu đồ chu kỳ có hướng . Mỗi cam kết có một tham chiếu đến nó cha mẹ. Do đó, các mũi tên trong một điểm sơ đồ cam kết từ cam kết con đến cam kết cha mẹ. Chúng tôi cần một tài liệu tham khảo cho cam kết con mới nhất để đạt được các cam kết cũ hơn trên một chi nhánh.

PS - Sơ đồ và sự hiểu biết ở trên được lấy từ khóa học miễn phí này . Mặc dù khóa học khá cũ, kiến ​​thức vẫn có liên quan.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.