2011-10-18 27 views
5

Tôi có 2 chi nhánh ở đây, nói branch1 và branch2. Có rất nhiều tính năng mới được thêm vào trong nhánh 1 và nhánh2 ổn định. Hôm nay, tôi muốn kết hợp chỉ 1 tính năng từ branch1 đến branch2. Vì vậy, tôi chỉ cần chạy git cherry-pick <commit-for-feature1-in-branch1. Tôi cho rằng chỉ có sự thay đổi trong <commit-for-featur1-in-branch1 sẽ được hợp nhất thành nhánh2. Nhưng tôi thấy có nhiều thay đổi hơn cho các tính năng khác được bao gồm.Tại sao chọn lựa chọn thay đổi nhiều hơn một cam kết?

Tôi nghĩ rằng nó sẽ nhận được sự khác biệt chỉ cho cam kết được chỉ định đó, đúng không?

FYI, cam kết trong branch1 đã được hợp nhất từ ​​chi nhánh phát triển khác, điều này có thể gây ra sự cố này không?

Tôi đã làm gì sai?

Cảm ơn.

+2

Bạn có chắc chắn rằng quy định cam kết không bao gồm nhiều thay đổi hơn bạn nghĩ? – VonC

+0

Vâng, tôi đã cố gắng để thấy sự khác biệt của cam kết đó: git diff revision^revision. đó là những gì tôi cần. – Rocky

Trả lời

3

Điều gì git cherry-pick thực hiện là cam kết mà bạn chỉ định và đọc sự khác biệt giữa nó và đó là phụ huynh. Điều này có hiệu quả làm cho một bản vá. Sau đó áp dụng bản vá này cho chi nhánh hiện đã được kiểm tra của bạn.

Trong trường hợp của bạn, cam kết chứa thêm các tính năng khác. Bạn có thể kiểm tra lại rằng thông điệp cam kết tương ứng với những gì bạn nghĩ nét là bằng cách nhìn vào các bản vá rằng đây cam kết sẽ tạo ra với git log:

git log -p -1 <sha1-of-your-commit> 

Các -p nói đăng nhập để không chỉ hiển thị các cam kết thông tin như tác giả, ngày và cam kết tin nhắn, nhưng cũng bao gồm các bản vá (hoặc sự khác biệt) mà cam kết giới thiệu. Tùy chọn -1 cho git log ngừng lịch sử danh sách sau 1 lần commit.

+0

Cảm ơn câu trả lời của bạn. Tôi đã kiểm tra nhật ký. Đó là chính xác những gì tôi muốn. Nhưng sau khi tôi chạy git cherry-pick, nó bổ sung thêm mã không phải trong cam kết đó. Và FYI, cam kết trong nhánh 1 đã được sáp nhập từ chi nhánh phát triển khác, điều này có thể gây ra vấn đề này không? – Rocky

+0

mã nằm trong chi nhánh của bạn. chạy 'git log -p -1' trên nhánh bạn đã chọn và xem những gì đã được thêm vào. Nếu những thứ phụ không có ở đó, nó có nghĩa là nó đã tồn tại trong nhánh đó. Để kiểm tra commit nào đã thêm một đoạn mã, 'git log -Ssometextfromafeature' sẽ hiển thị những gì đã thêm mã đó. –

1

Tôi cũng đã đi qua hành vi này ... Tôi đã theo dõi nó xuống để giải thích sau đây, nhưng có lẽ một người nào đó làm rõ một này nó hơn:

  • Bạn cherry chọn một cam kết, cam kết có chứa 1 thay đổi trong 1 tập tin
  • Bạn nhận thấy rằng không chỉ sự thay đổi chứa trong cam kết mà còn nhiều thay đổi (chủ yếu là xung quanh thay đổi được bao gồm)

Điều này là do sự thay đổi trong cam kết phụ thuộc vào một sự thay đổi trước. Vì vậy, khu vực mã này đã được thay đổi nhiều lần sau khi chi nhánh mục tiêu bạn muốn chọn anh đào đã được tạo ra.

Git quay lại lịch sử cho đến khi nguồn chọn cherry phù hợp với mục tiêu và tạo bản vá dựa trên bản sửa đổi này. Đó là lý do thay đổi nhiều hơn có thể xuất hiện ...

Tôi thấy hành vi này một chút đáng sợ, bởi vì người ta sẽ hy vọng rằng chỉ những thay đổi từ cam kết băm nhất định được chọn

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