Các câu trả lời hàng đầu mô tả cách áp dụng các thay đổi từ một cam kết cụ thể cho chi nhánh hiện tại. Nếu đó là những gì bạn có nghĩa là "làm thế nào để hợp nhất", thì chỉ cần sử dụng cherry-pick như họ đề xuất.
Nhưng nếu bạn thực sự muốn hợp nhất , tức là bạn muốn có một cam kết mới với hai cha mẹ - cam kết hiện có trên nhánh hiện tại và cam kết bạn muốn áp dụng các thay đổi từ - thì việc chọn cherry sẽ không thực hiện được điều đó.
Có lịch sử hợp nhất thực sự có thể là mong muốn, ví dụ, nếu quá trình xây dựng của bạn tận dụng lợi thế của tổ tiên để tự động đặt chuỗi phiên bản dựa trên thẻ mới nhất (sử dụng git describe
).
Thay vì chọn cherry, bạn có thể thực hiện git merge --no-commit
và sau đó điều chỉnh chỉ mục theo cách thủ công để xóa mọi thay đổi bạn không muốn.
Giả sử bạn đang ở chi nhánh A
và bạn muốn hợp nhất cam kết ở đầu chi nhánh B
:
git checkout A
git merge --no-commit B
Bây giờ bạn đã được thiết lập để tạo một cam kết với hai cha mẹ, mẹo hiện tại là A
và B
. Tuy nhiên, bạn có thể có nhiều thay đổi được áp dụng hơn bạn muốn, bao gồm các thay đổi từ các cam kết trước đó trên nhánh B. Bạn cần hoàn tác những thay đổi không mong muốn này, sau đó cam kết.
(Có thể có một cách dễ dàng để đặt trạng thái của thư mục làm việc và chỉ mục trở lại trạng thái trước khi hợp nhất, để bạn có một bảng xếp hạng rõ ràng để chọn cherry mà bạn muốn ở vị trí đầu tiên. Nhưng Tôi không biết làm thế nào để đạt được danh sách sạch đó git checkout HEAD
và git reset HEAD
cả hai sẽ loại bỏ trạng thái hợp nhất, đánh bại mục đích của phương pháp này.)
Vì vậy, thủ công hoàn tác những thay đổi không mong muốn. Ví dụ, bạn có thể
git revert --no-commit 012ea56
cho mỗi cam kết không mong muốn 012ea56
.
Khi bạn hoàn thành việc điều chỉnh mọi thứ, hãy tạo cam kết của bạn:
git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
Bây giờ bạn chỉ có thay đổi bạn muốn và cây tổ tiên cho thấy bạn đã hợp nhất về mặt kỹ thuật từ B.