2012-04-04 36 views
8

Hôm nay tôi gặp phải một vấn đề. Đồng đội của tôi đã tạo ra chi nhánh từ chủ nhân. Ông đã phát triển một tính năng trong nhánh này và sau đó phát triển hai tính năng phụ trong các nhánh của subfeature. Cuối cùng, ông đã thực hiện hai cam kết tái cấu trúc toàn bộ điều. Vì vậy ...Chi nhánh rebit Git với trẻ em đã hợp nhất

 C--D E--F    | subfeatures 
    / \/ \ 
    B------M1------M2--G--H | feature 
/
A-------------------K  | master 

Thông thường, chúng tôi sẽ rebase chi nhánh tính năng trước khi không chuyển tiếp nhanh chóng hợp nhất thành chính. Nhưng tất nhiên việc rebase này thất bại. Rebased chi nhánh tính năng trở nên trông như:

 B'--C'--D'--E'--F'--G'--H' 
    /
A--K 

Trong con trỏ trình C & D trở thành sai vì vậy tôi cũng nhận được hai chi nhánh subfeature phát triển 'từ trên không'. Tôi hiểu làm thế nào để sửa chữa nó nếu chi nhánh subfeature không được sáp nhập vào tính năng, nhưng tại thời điểm này tôi đã nhầm lẫn. Tôi đã hái tất cả mọi thứ trong nhánh phục hồi đã được rebased và sáp nhập lại. Có cách nào dễ dàng hơn để làm điều đó không?

Trả lời

11

Lưu ý rằng bạn cần git1.7.6 + cho git rebase --preserve-merges để hoạt động bình thường.

Ngắn câu chuyện ngắn: Bạn vừa hoàn thành việc hợp nhất và ai đó đã đẩy một cam kết trước khi bạn có thể đẩy bạn. Giải pháp là làm cho git nhận thức được sự hợp nhất mà bạn đã làm.

git rebase --preserve-merges <upstream> 

hoặc

git rebase -p <upstream> 

Nhưng có một vấn đề, nếu hợp nhất của bạn có xung đột mà bạn giải quyết chúng sẽ không được chọn của các máy móc thiết bị rebase.
Và bạn sẽ kết thúc việc giải quyết mâu thuẫn một lần nữa ... ít nhất đây là trường hợp với phiên bản git 1.7.5.4

(Điều đó sẽ gọi cho git rerere)

2

Bạn đã từng khai thác từng cam kết một bằng tay?

Chỉ cần chạy git rebase -i master feature và viết lại lịch sử theo ý bạn.

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