2012-03-15 31 views
46

Tôi rất mới để git, và đã tự hỏi nếu một cái gì đó như thế này là có thể?Xóa git cũ cam kết

>git log --pretty=oneline --abbrev-commit 
2f05aba Added new feature 
3371cec Fixed screw up <-- I want to remove this 
daed25c Screw up   <-- and remove this. 
e2b2a84 First.    So it's like they never happend. 

Điều này có khả thi không?

Trả lời

42

Điều này có thể với git rebase. Hãy thử như sau

git rebase -i HEAD~4 

rồi làm theo hướng dẫn tương tác trong trình chỉnh sửa của bạn. Trong bước đầu tiên bạn "bí" các cam kết. Hình ảnh trông giống như sau:

pick 2f05aba ... will be preserved 
squash 3371cec ... will be squashed with daed25c 
squash daed25c ... will be squashed with e2b2a84 
pick e2b2a84 .. will contain this and 3371cec and daed25c 

Trong bước thứ hai, bạn có thể chỉnh sửa thư cam kết.

+10

Không phải là câu hỏi về việc xóa các cam kết thay vì đè bẹp chúng? – Richard

+1

@Stony: Vâng, bạn có thể cũng có thể xóa chúng. Nhưng từ các ý kiến ​​cam kết trong OP ("vít lên" và "vít cố định lên") Tôi giả định rằng một là hoàn tác khác và rằng bạn cũng có thể chỉ squash cả hai. – Deve

54

Nếu bạn thực sự muốn xóa chúng (lau chúng từ lịch sử, không bao giờ được nhìn thấy nữa), bạn có thể

chạy rebase:

git rebase -i HEAD~4 

và sau đó, chỉ cần xóa (hoặc nhận xét ra) các dòng tương ứng với các cam kết bạn muốn xóa, như vậy:

pick 2f05aba ... #will be preserved 
#pick 3371cec ... #will be deleted 
#pick daed25c ... #will be deleted 
pick e2b2a84 ... #will be preserved 
+0

Tôi mới dùng github, Làm thế nào để bạn đẩy các thay đổi sau đó (khi tôi bấm Đồng bộ hóa, nó chỉ hoàn nguyên những gì tôi đã làm). Tôi nghĩ rằng tôi đã nhận nó: 'git push origin HEAD - lực lượng ' –

+0

@NicolasThery bạn không. Đó là lý do tại sao git push từ chối làm việc mà không cần --force, bởi vì bạn đang viết lại lịch sử và bạn sẽ phá vỡ các kho lưu trữ của người khác. Nếu bạn đã đẩy thì lựa chọn duy nhất của bạn là thực hiện 'git revert'. Mà, khi bạn nghĩ về nó là hợp lý bởi vì nếu bạn kéo mã của người khác, bạn sẽ không muốn họ có thể xóa các cam kết cũ của bạn mà không có một số loại lịch sử nào bạn? –

+0

Tôi cho rằng điều này chỉ đơn giản là làm việc trong repo Git hiện tại và không thay đổi bất cứ thứ gì ngược dòng/bất kỳ nút Git nào khác? –

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