2013-09-16 32 views
5

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ỏ Cb6/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.)

+0

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

Trả lời

0

Hình như nó có thể là một lỗi nhỏ trong git-rebase--interactive:

  case "$new_parents" in 
      ' '*' '*) 
        test "a$1" = a-n && die "Refusing to squash a merge: $sha1" 
      ... snip ... 
      *) 
        output eval git cherry-pick "$strategy_args" "[email protected]" || 
          die_with_patch $sha1 "Could not pick $sha1" 
        ;; 

Khi điều này chạm m6, tập mới của các bậc cha mẹ là số ít, vì vậy nó cố gắng sử dụng cherry-pick, nhưng m6 là một hợp nhất để cherry-pick đòi hỏi một gợi ý về những cha mẹ sử dụng .

Tôi không chắc chắn lý do tại sao nó cố gắng để mất m6 ở tất cả, mặc dù.

0

Giải pháp/giải pháp thay thế: (đối với tôi, dù sao) Điều này có vẻ là lỗi trong git rebase. Tôi trở lại git 1.7.9 và vấn đề của tôi đã được giải quyết; git rebase --interactive --preserve-merges hoạt động chính xác như tôi muốn và tạo biểu đồ tôi đã chỉ ra trong bài đăng của mình.

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