Tôi có hai nhánh của chủ, mỗi nhánh cho một đối tượng khác, và sau đó tôi có một nhánh tổng hợp kết hợp cả hai. Tôi đã cam kết một thứ gì đó với nhánh tổng hợp, nhưng bây giờ tôi thấy tôi sẽ áp dụng thay đổi đó cho một trong những nhánh cụ thể cho tính năng đó. Có cách nào để làm điều này unapply/áp dụng một nơi nào khác cơ động với git?Trong git, làm thế nào để loại bỏ một cam kết từ một chi nhánh và áp dụng nó cho một chi nhánh khác nhau?
21
A
Trả lời
27
Cherry-pick cam kết nhắm mục tiêu chi nhánh và đặt lại nhánh nguồn. Giả sử, bạn muốn di chuyển cam kết mới nhất từ source
chi nhánh để target
, làm:
git checkout target
git cherry-pick source
git checkout source
git reset --hard source^
Nếu cam kết không phải là cuối cùng, bạn sẽ phải sử dụng git rebase -i
thay vì lệnh cuối cùng và chọn cụ thể cam kết tên cho cherry-pick
của bạn.
2
Nói chung, khi tôi làm điều gì đó như thế này, tôi sẽ:
- Tạo một file vá ngược sử dụng git diff (ví dụ
git diff HEAD^ HEAD
) - Apply vá ngược này đến chi nhánh Tôi muốn loại bỏ các thay đổi từ.
- Kiểm tra các chi nhánh I DO muốn sự thay đổi trên
- Sử dụng
git cherry-pick
áp dụng áp dụng cam kết
Tôi tin rằng có một cách dễ dàng hơn, nhưng tôi thích điều này kể từ khi tôi sử dụng (và nhớ) diff/lệnh chọn cherry-pick tốt hơn
+3
Các bước 1 + 2 == trở lại git – Dustin
Cảm ơn! Hoạt động tuyệt vời. – prismofeverything
Lưu ý rằng thiết lập lại/rebase cả hai làm ** lịch sử viết lại **, vì vậy họ không nên được sử dụng nếu lịch sử đã được xuất bản - sau đó bạn sẽ phải sử dụng git-revert thay thế. –