2011-10-26 37 views
19

Tôi có cam kết cục bộ không thuộc bất kỳ chi nhánh nào mà tôi muốn xóa. Tôi không muốn rebase chúng, tôi thực sự muốn xóa chúng, và mất tất cả các nội dung liên quan đến cam kết này.Làm thế nào để xóa một đứa trẻ mồ côi cam kết trong git?

Đó là lệnh của họ để làm như vậy?

Cho đến nay tôi đã thử tính năng tương tác lại nhiều lần được đề xuất nhưng nó chỉ di chuyển xung quanh, nó không xóa chúng. Tôi cũng đã cố gắng sử dụng reflog xóa, nhưng tôi không thể tìm ra cách để vượt qua một cam kết cụ thể Id để lệnh.

Đây là cây làm việc:

o [master] Commit #6 
| 
o Commit #5 
| 
| o Commit #4 
|/ 
o Commit #3 
| 
o Commit #2 
| 
o Commit #1 

Tôi muốn thể chất xóa các cam # 4.

+0

Bạn có thể xây dựng trên "di chuyển cam kết xung quanh" không? – greg0ire

+0

@ greg0ire tốt, các cam kết vẫn còn tồn tại, nhưng được liên kết với cái gì khác .. Đó là những gì một rebase làm: thay đổi cha mẹ cam kết ... không? – FMaz008

+0

Trong lần rebase tương tác, bạn cần phải xóa hoàn toàn dòng với commit bạn muốn xóa. Việc hoàn nguyên cam kết chỉ đơn giản là tạo một cam kết mới áp dụng sự khác biệt ngược lại của quy tắc được chỉ định. Điều này chỉ thêm một cam kết khác mà bạn sẽ phải xóa. Hãy thử rebase và loại bỏ hoàn toàn dòng. –

Trả lời

28

Nếu cam kết không được tham chiếu bởi bất cứ điều gì, nó sẽ được gỡ bỏ với bộ sưu tập rác của git, trong thời gian.

Nếu bạn muốn buộc nó trước mặt, sử dụng git gc --prune=now --aggressive

+0

Vâng tôi đã ở trên một chi nhánh, sau đó tôi đã thực hiện một cam kết, sau đó tôi hoàn nguyên cam kết với một GUI (Tôi nghĩ rằng điều này tương ứng với một thiết lập lại cứng). Vì vậy, bây giờ cam kết của tôi là ra khỏi tất cả các chi nhánh, nhưng cam kết vẫn là "cha mẹ" cho một chi nhánh. Tôi đã thử lệnh, nhưng tôi vẫn có cam kết vô dụng của mình: ( – FMaz008

+0

Hoàn nguyên cam kết trong git không chỉ là lấy cam kết đi. Nó thực sự áp dụng đảo ngược cam kết. Nếu cam kết bạn không muốn là ở tip của một chi nhánh, sử dụng 'git reset --hard shaOfLastGoodCommit'. Điều đó sẽ loại bỏ (các) cam kết xấu và di chuyển đầu của nhánh của bạn đến cam kết tốt cuối cùng – Andy

+0

Tôi đã đặt lại --hard, hai lần .. Nó chỉ thay đổi đầu nhánh ("thẻ chính") thành cam kết mà tôi muốn xóa, sau đó tôi thay thế nó trên đầu nhánh thực, nhưng cam kết tôi muốn xóa vẫn còn đó. – FMaz008

2

Để loại bỏ một cam kết, bạn chỉ cần phải chắc chắn rằng nó không còn là một phần của bất kỳ chi nhánh. Tức là, đối với mỗi chi nhánh trong kho lưu trữ của bạn, hãy đảm bảo rằng cam kết không phải là một phần của chuỗi cam kết từ con đến cha mẹ xác định nhánh đó. Nếu bạn tìm thấy một chi nhánh như vậy, hoặc xóa nó, hoặc thay đổi lịch sử của nó để nó không còn bao gồm commit xấu nữa.

Khi đó là sự thật, cam kết xấu sẽ được thu thập rác cuối cùng.

Các vấn đề liên quan