Câu hỏi Cherry chọn một cam kết với git nghĩa là gì?


Gần đây, tôi đã được yêu cầu anh đào chọn một cam kết. Nhưng tôi không biết nó có ý nghĩa gì. Vậy cái gì cherry picking một cam kết trong git nghĩa là gì? Bạn làm nó như thế nào?


1366
2018-02-18 07:20


gốc


Thay vì hợp nhất, với việc chọn lại hoa anh đào từ một chi nhánh đến nhánh đích (ví dụ: master) sẽ dễ dàng hơn. - Levent Divilioglu


Các câu trả lời:


Cherry chọn trong git có nghĩa là chọn một cam kết từ một nhánh và áp dụng nó vào một nhánh khác.

Điều này trái ngược với các cách khác như merge và rebase thường áp dụng nhiều cam kết vào một nhánh khác.

  1. Hãy chắc chắn rằng bạn đang ở trên nhánh bạn muốn áp dụng cam kết.

    git checkout master
    
  2. Thực hiện như sau:

    git cherry-pick <commit-hash>
    

N.B .:

  1. Nếu bạn chọn anh đào từ một nhánh công cộng, bạn nên cân nhắc sử dụng

    git cherry-pick -x <commit-hash>
    

    Điều này sẽ tạo ra một thông điệp cam kết tiêu chuẩn hóa. Bằng cách này, bạn (và các đồng nghiệp của bạn) vẫn có thể theo dõi nguồn gốc của cam kết và có thể tránh xung đột hợp nhất trong tương lai.

  2. Nếu bạn có ghi chú gắn liền với cam kết họ không làm theo lựa chọn anh đào. Để mang lại cho họ hơn là tốt, Bạn phải sử dụng:

    git notes copy <from> <to>
    

Các liên kết bổ sung:


1637
2018-02-18 07:29



Nếu bạn chọn anh đào từ một nhánh công cộng, bạn nên cân nhắc sử dụng git cherry-pick -x <commit-hash>. Điều này sẽ tạo ra một thông điệp cam kết tiêu chuẩn hóa. Bằng cách này, bạn (và các đồng nghiệp của bạn) vẫn có thể theo dõi nguồn gốc của cam kết và có thể tránh xung đột hợp nhất trong tương lai. - MBober
Anh đào có thực sự cần thiết không? Sẽ không phải là một thiết lập lại hỗn hợp hoặc thiết lập lại mềm làm một công việc tương tự? - Nav
Lưu ý rằng nếu bạn có ghi chú gắn liền với cam kết họ không làm theo lựa chọn anh đào. Bạn phải sử dụng git notes copy <from> <to> để mang lại cho họ hơn là tốt. - Zitrax
git push là bước cuối cùng để thực hiện thay đổi trên chính - feel good and programming
FYI: Một cam kết ngữ nghĩa chứa tất cả các tệp của cây đang hoạt động của thời điểm đó (và băm cam kết của cam kết trước đó), vì vậy bạn không áp dụng toàn bộ cam kết cho một cam kết khác, nhưng thay đổi một cam kết đã thực hiện trên cam kết trước đó "cherry-pick commit applies the changes introduced by the named commit on the current branch" Hầu hết các ppl có xu hướng suy nghĩ về cam kết như những thay đổi (như svn là iirc), nhưng nó không phải là, mỗi cam kết đề cập đến cây làm việc hoàn chỉnh. Mặc dù điều này không tạo ra sự khác biệt trong trường hợp này, nó có thể giúp hiểu tại sao git hoạt động như nó. - Emile Vrijdags


Trích dẫn này được lấy từ; Kiểm soát phiên bản với Git (Cuốn sách thực sự tuyệt vời, tôi khuyến khích bạn mua nó nếu bạn quan tâm đến git)

Chỉnh sửa: Vì câu trả lời này vẫn nhận được hiển thị, tôi muốn thêm rất hay trong video hướng dẫn hành động về nó:

Youtube: Giới thiệu về Git cherry-pick

Sử dụng git cherry-pick Lệnh git cherry-pick commit áp dụng   thay đổi được giới thiệu bởi cam kết có tên trên nhánh hiện tại. Nó sẽ   giới thiệu một cam kết mới, riêng biệt. Nói đúng, dùng git   cherry-pick không làm thay đổi lịch sử hiện tại trong một kho lưu trữ;   thay vào đó, nó thêm vào lịch sử. Như với các hoạt động Git khác   giới thiệu các thay đổi thông qua quá trình áp dụng khác biệt, bạn có thể cần phải   giải quyết xung đột để áp dụng đầy đủ các thay đổi từ cam kết đã cho .   Lệnh git cherry-pick thường được sử dụng để giới thiệu cụ thể   cam kết từ một chi nhánh trong một kho lưu trữ trên một nhánh khác. A   sử dụng chung là cam kết chuyển tiếp hoặc cổng sau từ việc bảo trì   chi nhánh cho một chi nhánh phát triển.

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above

trước: before

sau: after


184
2018-05-13 15:06



khi các cam kết được chọn bằng anh đào được lấy trên một số nhánh (b1) và sau đó được chuyển tới master. Và nếu chi nhánh b1 (từ đó cam kết ban đầu được chọn) cũng đã được cố gắng để được giao cho chủ. Làm thế nào về các cuộc xung đột? Điều đó có được chăm sóc hay nó hoạt động như thế nào? - parasrish
@parasrish Có, họ đã được chăm sóc với các hợp nhất trước đây của bạn. Vì vậy, bạn đã thay đổi a, b, c, d từ nhánh (b1). Bạn anh đào chỉ chọn "c". Sau đó, trong tương lai khi bạn hợp nhất từ ​​(b1) thành thạo, vì các thay đổi "c" giống nhau, nó sẽ chỉ hợp nhất các thay đổi a, b, d và duy trì "c". Nhưng nếu bạn rollback hợp nhất của bạn, sau đó bạn sẽ quay trở lại thay đổi với "c" trong đó. Bạn sẽ cần phải cuộn chúng lại một cách riêng biệt. - Teoman shipahi
Cần nhấn mạnh: Trong ví dụ như đã cho, chỉ có sự khác biệt (F - E) được áp dụng cho Z. Đó là một trường hợp hẹp. Cherry-pick có thể được sử dụng để áp dụng sự khác biệt của nhiều cam kết, nói rằng, tất cả các sự khác biệt giữa hai cam kết không liền kề. Ví dụ, sau từ trên, (F - E), (E - D), (D - C), và (C - B). Điều đó tương đương với việc áp dụng sự khác biệt (F - B). - Thomas Bitonti
Ngoài ra, điều gì sẽ xảy ra nếu Commit được chọn (F trong ví dụ) có nhiều hơn một người tiền nhiệm ngay lập tức? - Thomas Bitonti
@ThomasBitonti Tôi nghĩ rằng nó là khá rõ ràng chỉ có sự khác biệt (F - E) được áp dụng cho Z. Chữ cho thấy cam kết, và cam kết duy nhất áp dụng trên Z. Bạn có thể thấy rõ ràng nó trong lệnh là tốt. Ngoài ra, OP yêu cầu "chọn anh đào" là gì, không phải cách áp dụng "Nhiều lựa chọn anh đào". Hơn nữa áp dụng lựa chọn anh đào từ cam kết đơn lẻ không phải là một trường hợp hẹp, nó là khá nhiều một kịch bản trường hợp rộng. - Teoman shipahi


Cherry hái trong Git được thiết kế để áp dụng một số cam kết từ một chi nhánh vào một chi nhánh khác. Nó có thể được thực hiện nếu bạn ví dụ. đã phạm sai lầm và cam kết thay đổi thành chi nhánh sai, nhưng không muốn hợp nhất toàn bộ chi nhánh. Bạn chỉ có thể ví dụ. hoàn nguyên cam kết và chọn cherry trên nhánh khác.

Để sử dụng nó, bạn chỉ cần git cherry-pick hash, Ở đâu hash là một băm cam kết từ chi nhánh khác.

Đối với thủ tục đầy đủ xem: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html


125
2018-02-18 07:29





cherry-pick là một tính năng của Git. Nếu ai đó muốn Cam kết các cam kết cụ thể trong một chi nhánh cho một chi nhánh mục tiêu, sau đó chọn cherry-pick.
        git cherry-pick các bước như sau.

  1. thanh toán (chuyển sang) mục tiêu chi nhánh.
  2. git cherry-pick <commit id>
    

    Ở đây commit id là id hoạt động của một nhánh khác.Eg.

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. đẩy tới chi nhánh mục tiêu

Chuyến thăm https://git-scm.com/docs/git-cherry-pick


25
2017-08-24 09:39





Bạn có thể nghĩ rằng nếu một lựa chọn anh đào tương tự như một rebase, hoặc thay vào đó nó được quản lý như một rebase. Bằng cách này, tôi có nghĩa là phải mất một cam kết hiện có và tái tạo nó lấy, như là điểm khởi đầu, người đứng đầu của chi nhánh bạn đang ở trên.

A rebase có một cam kết đã có một X cha và tái tạo cam kết như thể nó thực sự có một Y mẹ, và điều này là chính xác những gì một cherry-pick làm.

Cherry pick là nhiều hơn về cách bạn chọn các cam kết. Với pull (rebase), git ngầm tạo lại các cam kết cục bộ của bạn trên những gì được kéo vào nhánh của bạn, nhưng với cherry-pick bạn rõ ràng chọn một số commit (s), và ngầm tái tạo nó (chúng) trên đầu nhánh hiện tại của bạn.

Vì vậy, cách bạn làm điều đó khác, nhưng dưới mui xe họ là những hoạt động rất giống nhau - sự tái sinh của các cam kết.


8
2018-01-31 22:19



Tôi thấy đây là một cái nhìn khá hữu ích về mọi thứ. Nó ngụ ý tại sao cherry-pick cư xử theo cách nó thực hiện khi nhánh đích sau đó được sáp nhập trở lại nhánh nguồn. Cảm ơn ngài. - Aluan Haddad
tôi muốn sử dụng lựa chọn anh đào thay vì git hợp nhất sau khi một tính năng được thực hiện. mọi người luôn git merge feature_branch khi họ hoàn thành một tính năng. tại sao không sử dụng lệnh cherry-pick? bạn có suy nghĩ gì không? - j2emanue


Nó giống như Copy (từ đâu đó) và Paste (ở đâu đó), nhưng đối với các cam kết cụ thể.

Ví dụ, nếu bạn muốn sửa chữa nóng, bạn có thể sử dụng cherry-pick đặc tính.

Làm của bạn cherry-pick trong một nhánh phát triển và merge cam kết với một nhánh phát hành. Tương tự, hãy làm cherry-pick từ một nhánh phát hành đến master. Voila


3
2017-10-07 11:55