Tôi muốn loại bỏ một cam kết cụ thể, C, trong lịch sử git, cũng như một số cam kết đơn-hợp nhất.Xóa một cam kết cụ thể trong lịch sử git bao gồm hợp nhất
Lịch sử trông như thế này. Trong ví dụ này, tôi muốn xóa một cam kết hợp nhất m6
và cam kết có vấn đề C
.
---m0-------------------m1---m2---m3-------------m4---m5----m6---m7---(...)
\ / \ / \/
b0---b1---b2---b3 b4--(C)--b5 b6
Tôi muốn gió lên với điều này (thay đổi đánh dấu):
vv
---m0------------------m1---m2---m3---------m4---m5---b6---m7---(...)
\ / \vvvvvvv/ ^^
b0---b1---b2---b3 b4---b5
^^^^^^^
Nếu tôi sử dụng "git rebase -i" tìm cách tách bỏ C
và b6/m6
, công trình này, nhưng tôi nhận được:
---m0---b0---b1---b2---b3---m1---(...)---
và lịch sử được làm phẳng. Tôi muốn bảo toàn toàn bộ cấu trúc. Ngược lại, nếu tôi chạy với --preserve-merges
cờ, sau đó tôi nhận được:
error: Commit <sha-1 corresponding to m6> is a merge but no -m option was given.
fatal: cherry-pick failed
Could not pick <sha-1 corresponding to m6>
và tôi không thể loại bỏ b6/m6
(mặc dù tôi có thể loại bỏ C).
Cách phù hợp để kết thúc với kết quả mong muốn là gì? Tôi đang sử dụng git 1.8.4, nếu điều đó quan trọng.
(Lưu ý rằng những câu hỏi khác trên StackOverflow mà tôi perused dường như không chiếm trường hợp rất cụ thể này, như vậy là gần như tôi có thể nói, đây không phải là một câu hỏi trùng lặp.)
Câu trả lời của tôi dưới đây không thực sự là câu trả lời, nhưng quá lớn/cần định dạng cho nhận xét. Tôi biết đến với một nhà tái tạo cho điều này sẽ là một nỗi đau, nhưng nếu bạn * có thể * đến với một, và nếu nó là một lỗi, mà chắc chắn sẽ giúp các folks git sửa chữa nó. :-) – torek