2012-10-18 40 views
8

Có một vài cam kết trên nhánh từ xa mà tôi muốn loại bỏ. Ví dụ, nếu lịch sử trông giống như:Làm cách nào để xóa cam kết git

A->B->C->D 

Tôi muốn xóa C và D để cho tôi:

A->B 

nơi B tại là HEAD?

+1

Xem câu hỏi đính kèm; ngoại trừ bạn muốn 'HEAD ~ 2' (để xóa 2 lần commit cuối cùng). – cmbuckley

+0

Sử dụng 'git reset' để xóa các cam kết. [Hướng dẫn này] (http://git-scm.com/2011/07/11/reset.html) giải thích những gì nó làm. –

Trả lời

14

Tôi sẽ bố trí tất cả các cách khác nhau để xóa cam kết cho bạn và khi nào bạn nên sử dụng chúng. Trước khi bạn thực hiện bất kỳ điều nào trong số này, tôi khuyên bạn nên sao chép chi nhánh của bạn đến một chi nhánh khác để an toàn.

Làm điều này bằng cách làm git checkout -b copy_branch và sau đó chuyển về chi nhánh ban đầu của bạn bằng cách làm git checkout the_branch_i_want_to_delete_from_again

Nếu bạn đã đẩy, như trong trường hợp của bạn, bạn có thể chuyển sang # 3, nhưng nếu bạn đã không đẩy bạn có thể nhìn vào 1 và 2.

1) tôi đã không đẩy được nêu ra hoặc đang làm việc một mình và cam kết (s) tôi muốn loại bỏ là những cam kết gần đây nhất:

Nếu tôi có: A --- B --- C --- D

và tôi muốn xóa C và D.

Sau đó làm git reset --hard sha_of_B

mà kết quả trong: A --- B

Nếu bạn đã đẩy, như trong trường hợp của bạn, bạn vẫn có thể làm theo cách này sau đó làm một git push --force origin the_branch, nhưng điều này không được khuyến khích vì bạn có thể gây rối cho những người khác làm việc trong dự án này. Bạn nên làm theo # 3 để thay thế.

2) Tôi đã không đẩy được nêu ra hoặc đang làm việc một mình và các cam kết (s) Tôi muốn loại bỏ đang ở giữa chi nhánh của tôi:

Nếu tôi có: A --- B --C --- D

và tôi muốn làm xóa C.

git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete 

mà mở ra cực kỳ hữu ích màn hình rebase tương tác:

pick sha_of_C C 
pick sha_of_D D 

Khi git nhắc bạn "# Nếu bạn loại bỏ một dòng ở đây R COMMNG CAM KẾT S BE VẬY." đó là những gì chúng ta sẽ làm

tôi xoá dòng pick sha_of_C C, mà lá tôi với:.

pick sha_of_D D 

tôi lưu nó trong vi với: wq, mà kết quả trong:

A --- B --- D

Nếu bạn đã đẩy, như trong trường hợp của bạn, bạn vẫn có thể làm theo cách này sau đó thực hiện git push --force origin the_branch, nhưng điều này không được khuyến khích vì bạn có thể gây rối cho người khác dự án này, bạn nên làm theo # 3 để thay thế.

3) Tôi đã đẩy và tôi đang làm việc với những người khác:

Nếu tôi có: A --- B --- C --- D và tôi muốn xóa C và D.

sau đó làm

git revert sha_of_D 

Lưu ý rằng bạn có thể phải giải quyết mâu thuẫn ở đây và sau đó cam kết. Sau đó, hãy thực hiện

git revert sha_of_C 

Lưu ý rằng bạn có thể phải giải quyết xung đột tại đây rồi cam kết.

Điều này dẫn đến:

A --- B --- C --- D --- Reverted_D --- Reverted_C

Đây là an toàn để đẩy như bạn đang thực sự chỉ cần thêm một cam kết mà đảo ngược tất cả các thay đổi của C và D, về cơ bản xóa nó.

Nói chung, bạn nên tránh thực hiện git push --force bằng mọi giá trừ khi thật cần thiết. Nhưng nếu bạn sắp thực hiện một lực đẩy, hãy sử dụng sự bảo vệ, bạn chắc chắn nên tạo một bản sao của chi nhánh của bạn trước khi làm như vậy. Nó thường là một quy tắc tốt để chỉ dính vào # 3 nếu bạn đã đẩy ở tất cả.

Hy vọng điều này hữu ích.

Dan

+0

Giải thích và ví dụ tuyệt vời, cảm ơn bạn. – Kasyx

1

Để xóa cuối cùng cam kết

$ git reset --hard HEAD^ 

Để xóa mới nhất của 2 cam

$ git reset --hard HEAD~2 

Bạn có thể tải chi nhánh tại địa phương. Sau đó xóa các cam kết và thực hiện lệnh đẩy --force

$ git pull origin 
$ git checkout origin/<branchname> 
$ git checkout -b <branchname> 
$ git reset --hard HEAD~2 
$ git push origin <branchname> --force 
Các vấn đề liên quan