2012-06-20 30 views
8

Tôi đã thực hiện một số cam kết và đẩy chúng vào kho lưu trữ của tôi. Sau đó, tôi đã làm một yêu cầu kéo nhưng tôi nhận ra có một số cam kết tôi không muốn được trong yêu cầu kéo.Xóa 4 cam kết khỏi lịch sử git của tôi

Họ trông như thế này:

My commits look like this: 

Correct HTML  
ab1c41c 

HTML escaping 
8b38955 

Merge branch 'master' into internationalized  
2854662 

Modified config 
b942f13 

tried pushing 
b73d792 

Added assets  
f20106e 

Added config  
408118f 

Fixed views conflicts 
86f2509 

added layouts 
da27e11 

Fixed layout markup 
92d6bcc 

Nếu tôi muốn thoát khỏi những cam kết:

Modified config 
b942f13 

tried pushing 
b73d792 

Added assets  
f20106e 

Added config  
408118f 

Làm thế nào để làm điều đó? Chú ý rằng tôi muốn giữ những cái mà trước đây trong thời điểm đó những người tôi muốn xóa:

Correct HTML  
ab1c41c 

HTML escaping 
8b38955 
+0

Bạn muốn loại bỏ tất cả các tệp và sửa đổi của ba lần commit này. Hoặc bạn chỉ không muốn tin nhắn cam kết được hiển thị? –

+0

Bạn không muốn những cam kết đó trong kho lưu trữ trung tâm? hoặc chỉ trong thư mục làm việc của bạn? –

Trả lời

12

Bạn có thể thực hiện interactive rebase.

Giả sử đầu của bạn là ở ab1c41c từ ví dụ của bạn, gọi rebase như sau

git rebase -i HEAD~7 

này cho git bạn muốn thao tác cuối cùng 8 hoặc lâu hơn cam kết. Bạn sẽ được đưa vào trình soạn thảo của mình với danh sách các cam kết và một số hướng dẫn.

Xóa các dòng có chứa các cam kết xóa, lưu và thoát. Git sẽ tiến hành rebase, và thế là xong.

Xin lưu ý, vì quá trình rebase, nếu bạn muốn đẩy đến cùng chi nhánh, bạn cần phải chuyển tùy chọn --force.

Disclaimer rebasing và lực đẩy có thể làm bạn mất việc hoặc đái người tắt, vì vậy chỉ cần chắc chắn rằng bạn hiểu những gì bạn đang làm. :)

+1

** Cảnh báo: ** Không được thực hiện lại các cam kết mà bạn đã đẩy tới kho lưu trữ công cộng. [Tham khảo tại đây] (http://git-scm.com/book/en/Git-Branching-Rebasing#The-Perils-of-Rebasing). Trong trường hợp này, các cam kết đã có sẵn trong kho công cộng. –

1

Chỉ cần thiết lập lại với --hard trên các cam kết ngay trước:

git reset --hard 86f2509 

Cẩn thận: bạn sẽ mất những cam kết mãi mãi, không có cách nào để quay trở lại. Ngoài ra, nếu ai đó đã kéo trong các cam kết bạn muốn thoát khỏi, mọi thứ có thể bị lộn xộn. Trong trường hợp đó, bạn có thể muốn xem 'git revert'.

+0

Nếu có một số cam kết từ trước đó mà tôi muốn giữ? Tôi đã làm một cái nĩa, và có một số cam kết tôi muốn giữ. –

+0

Tôi đoán bạn sẽ cần phải tạo một chi nhánh, thiết lập lại và sau đó anh đào chọn các cam kết trên đầu trang mà bạn muốn. –

3

Như Blake Taylor đã đề cập here, bạn có thể sử dụng interactive rebase để sắp xếp lại các cam kết (hoặc) xóa các cam kết trung gian.

Nhưng điều đó phải được thực hiện, trước khi bạn đẩy những cam kết đó vào kho công cộng. Refer here. Trong trường hợp của bạn, những cam kết đó đã có sẵn trong repo công cộng. Vì vậy, tôi không đề nghị sử dụng rebase.

Nếu bạn không muốn những cam kết đó trong thư mục làm việc của mình.

  • a) Tạo chi nhánh, trỏ đến 86f2509 (cam kết ổn định cuối cùng trong cây đang hoạt động).

    git checkout -b <branch name> 86f2509

  • b) Cherry Pick những cam kết mà bạn muốn. Trong trường hợp của bạn ab1c41c8b38955.

    git cherry-pick 8b38955 ab1c41c

Bây giờ thư mục làm việc của bạn sẽ không có những cam kết không mong muốn.

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