GIT hợp nhất tổng thể thành một chi nhánh


49

Tôi đã phát triển một tính năng mới trên một nhánh mới và về phía đã cam kết khá nhiều thay đổi trên nhánh chính của tôi.

Có thể hợp nhất nhánh chính vào nhánh mới của tôi để luôn cập nhật để tôi không có quá nhiều xung đột hợp nhất sau khi tính năng mới kết thúc?


Bạn đã thử git-merge chưa? Giúp ở đây .
karatedog

Câu trả lời:


56

Bạn có thể git merge masterhoặc git rebase master, trong trường hợp này tôi thích git rebase hơn .

Bởi vì git rebaselàm cho nó như thể những thay đổi trên nhánh tính năng được thực hiện trên đầu những thay đổi trên nhánh chính, điều này làm cho biểu đồ phiên bản đơn giản hơn.

Nổi loạn

Lấy ví dụ từ hướng dẫn git rebase , git rebase mastertrong nhánh feature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

Tuy nhiên, git rebasechỉ phù hợp khi chi nhánh chưa được phân phối, hoặc sẽ có sự nhầm lẫn và công việc phụ ở hạ lưu, vì các cam kết cũ A, B, C hiện được thay thế bằng các cam kết mới A ', B', C ', cộng với F và G mà trước đó không có.

Kết quả thực tế sau khi git rebase masterở chi nhánh featurelà:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

Cam kết A, B, C đang lơ lửng sau cuộc nổi loạn, nhưng có thể truy cập thông qua git reflog feature.

Hợp nhất

Nếu ai đó đã kéo chi nhánh của bạn hoặc bạn đã đẩy nó vào một nơi nào đó, bạn nên hợp nhất vào đó để tránh nhầm lẫn và làm thêm ở đầu bên kia. Xem Phục hồi từ rebase ngược dòng .

Đây là kết quả của git merge masterchi nhánh feature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

Ngoài ra, nếu bạn git merge featureở chi nhánh master, nó sẽ trông như thế này:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master

Bạn nên giải thích lý do tại sao bạn thích rebase và sự khác biệt là gì. Rebase tạo ra một lịch sử tuyến tính - điều này có thể không phù hợp với câu hỏi này.
Andreas Rehm

Ok nếu tôi hiểu rõ về nó: Tôi phải kiểm tra nhánh chính nếu tính năng mới chưa kết thúc và một cuộc nổi loạn nếu nó kết thúc?
mnml

Không, với nhánh tính năng đã được kiểm tra, hãy thực hiện git rebase mastervà nó sẽ "khởi động lại" các thay đổi trong nhánh tính năng để chúng "dựa" vào các thay đổi trong nhánh chính. Nếu các thay đổi trong nhánh chính xung đột với các thay đổi trong nhánh tính năng, git sẽ yêu cầu bạn giải quyết chúng và tiếp tục, bỏ qua chúng hoặc hủy bỏ. Nếu bạn cảm thấy không chắc chắn, bạn có thể kiểm tra một nhánh thử nghiệm để thử nó git checkout -b test-feature feature(giả sử nhánh tính năng của bạn được đặt tên là "tính năng").
Christoffer Hammarström

2
Ý bạn là gì "không thể thấy chi nhánh của tôi nữa"? Dù sao, git rebasechỉ nên được sử dụng nếu chi nhánh chưa được phân phối, mà tôi giả sử là trường hợp vì bạn nói đó là một chi nhánh mới, xin lỗi về điều đó. Xem Phục hồi từ rebase ngược dòng trong các tài liệu tôi liên kết đến. Bạn sẽ phải sử dụng git mergethay thế. Và bạn có thể sử dụng git reflogđể tìm đầu chi nhánh tính năng trước đây nếu bạn muốn lấy lại.
Christoffer Hammarström

1
Tôi chưa bao giờ thấy một lời giải thích rõ ràng hơn về sự khác biệt giữa hợp nhất và rebase. Cảm ơn bạn.
Paulo Pedroso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.