2009-11-20 25 views
21

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?

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.

+0

Cảm ơn! Hoạt động tuyệt vời. – prismofeverything

+6

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ế. –

2

Nói chung, khi tôi làm điều gì đó như thế này, tôi sẽ:

  1. Tạo một file vá ngược sử dụng git diff (ví dụ git diff HEAD^ HEAD)
  2. Apply vá ngược này đến chi nhánh Tôi muốn loại bỏ các thay đổi từ.
  3. Kiểm tra các chi nhánh I DO muốn sự thay đổi trên
  4. 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ác vấn đề liên quan