2011-01-19 39 views
10

Tôi không có kinh nghiệm với Git và bây giờ tôi có một vấn đề lớn rơi vào lòng tôi.Hoàn tác hợp nhất git

Sau đây là cách chi nhánh hiện tại của tôi trông giống như:

feature  /---F1-----F2----\ 
      /    \ 
master -----M0-----M1-----M2-----M3-----M4 
      \      /
bugfix  \--B1-----B2-----------/ 

Tình hình:

Có người đã làm một điều rất xấu và đẩy một hợp nhất thực sự tồi tệ (M3). Tôi chỉ nhận thấy sự hợp nhất xấu khi các mô hình của chúng tôi (không phải mã nguồn) sẽ không tải sau khi tôi hợp nhất B1 và ​​B2 thành M4. May mắn thay, tôi chưa đẩy M4.

Vấn đề:

Làm thế nào để thiết lập những điều đúng một lần nữa? Tôi muốn M0, M1, M2, F1, F2, B1 và ​​B2. Nhưng tôi không muốn M3 và M4 (kể từ M4 rõ ràng là bị hỏng). Nếu tôi để từ bỏ các thay đổi, thì F1 và F2 có thể được hy sinh :)

Tôi đã xem git revert nhưng tôi không tự tin rằng tôi hoàn toàn hiểu cách hoạt động. Vì vậy ... Tôi thực sự hy vọng được giúp đỡ về cách giải quyết vấn đề này.

Xin cảm ơn trước.

Trả lời

6

Vì vậy, để làm rõ, bạn muốn gì, đúng không?

feature  /---F1-----F2 
      /    
master -----M0-----M1-----M2 
      \    
bugfix  \--B1-----B2 

Hãy chắc chắn rằng HEAD s featurebugfix vẫn còn trên F2B2 tương ứng.

Sửa: nếu featurebugfix không có các chi nhánh, làm cho họ chi nhánh (giấu công việc của bạn nếu nó là uncommited):

git checkout F2 
git branch feature 
git checkout B2 
git branch bugfix 

Chỉnh sửa cuối

Sau đó thiết lập lại tổng thể để M2 :

git checkout master 
git reset M2 --hard 

(đặt lại sẽ khiến bạn mất các thay đổi cục bộ của bạn, giấu chúng nếu bạn không muốn điều đó.)

M3M4 không bị hủy ngay lập tức, nhưng cuối cùng sẽ bị hủy. Chúng không được hiển thị trong git log hoặc gitk.

Sau đó, đã đến lúc hợp nhất feature và tạo M3' đúng.

+0

Có, loại, nhưng "tính năng", "chính" và "lỗi" không thực sự là chi nhánh, tôi nghi ngờ đó là điều khó hiểu. Đó là, 3 ppl cam kết thay đổi của riêng họ về nhánh chính. Một anh chàng đã hợp nhất xấu và bị đẩy. Tôi kéo hợp nhất xấu. Bây giờ tôi muốn một cách để loại trừ việc hợp nhất xấu trong khi vẫn giữ tất cả các thay đổi riêng lẻ ... – aberrant80

+0

Vì vậy, 'feature' và' bugfix' không có nhánh? Chắc chắn tác giả của 'feature' có một nhánh trong repo của riêng mình. Những gì bạn cần làm là đặt lại master của bạn thành M2, và yêu cầu tác giả của 'feature' làm như vậy (nhưng hãy chắc chắn rằng anh ta không bị mất chi nhánh' feature') và làm lại hợp nhất, đúng lúc này. Xem bản cập nhật của tôi nếu bạn muốn tự mình làm điều đó. – Gauthier

+0

Bạn có thực sự có một repo không có chi nhánh 'master' không? – Gauthier

1

Nếu bạn không đẩy (xuất bản) hợp nhất cam kết, hãy sử dụng git reset. Ví dụ. trên nhánh master, giả sử cây làm việc của bạn là sạch sẽ, làm git reset --hard. Thông tin

thêm: Undo a Git merge that hasn't been pushed yet

Nếu bạn đã công bố những thay đổi của bạn, bạn có thể muốn xem xét việc thực hiện một cam kết Hoàn nguyên để thay thế. Thông tin thêm tại đây: http://progit.org/2010/03/02/undoing-merges.html

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