2886

最近、私はcherry-pickコミットを求められました。

では、gitでコミットをチェリーピッキングするとはどういう意味ですか?どうしますか?

4

12 に答える 12

3509

Gitでのチェリーピッキングとは、あるブランチからコミットを選択し、それを別のブランチに適用することを意味します。

mergeこれは、rebase通常、別のブランチに多くのコミットを適用するなどの他の方法とは対照的です。

  1. コミットを適用するブランチにいることを確認してください。

     git switch master
    
  2. 以下を実行します。

     git cherry-pick <commit-hash>
    

注意:

  1. 公的機関からチェリーピックをする場合は、使用を検討する必要があります

     git cherry-pick -x <commit-hash>
    

    これにより、標準化されたコミットメッセージが生成されます。このようにして、あなた(およびあなたの同僚)はコミットの発信元を追跡することができ、将来的にマージの競合を回避することができます。

  2. コミットにメモが添付されている場合、それらはチェリーピックに従わない。それらも持ち込むには、以下を使用する必要があります。

     git notes copy <from> <to>
    

追加のリンク:

于 2012-02-18T07:29:42.237 に答える
407

この引用は以下から引用されています:Gitによるバージョン管理

gitcherry-pickの使用コマンドgitcherry-pickcommitは、名前付きcommitによって現在のブランチに導入された変更を適用します。新しい明確なコミットを導入します。厳密に言えば、gitcherry-pickを使用してもリポジトリ内の既存の履歴は変更されません。代わりに、履歴に追加されます。差分を適用するプロセスを介して変更を導入する他のGit操作と同様に、特定のコミットからの変更を完全に適用するには、競合を解決する必要がある場合があります。コマンドgitcherry-pickは通常、リポジトリ内の1つのブランチから別のブランチに特定のコミットを導入するために使用されます。一般的な使用法は、コミットをメンテナンスブランチから開発ブランチにフォワードポートまたはバックポートすることです。

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

前: 前

後: 後

また、これはそれについての非常に素晴らしいアクションビデオチュートリアルです:Youtube:Gitチェリーピックの紹介

于 2015-05-13T15:06:34.483 に答える
182

Gitでのチェリーピッキングは、あるブランチから別のブランチにコミットを適用するように設計されています。あなたが例えばするならば、それはすることができます。間違いを犯し、間違ったブランチに変更を加えましたが、ブランチ全体をマージしたくありません。あなたはちょうど例えばすることができます。コミットを元に戻し、別のブランチでチェリーピックします。

これを使用するには、が必要ですgit cherry-pick hash。ここで、hashは他のブランチからのコミットハッシュです。

完全な手順については、http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.htmlを参照してください。

于 2012-02-18T07:29:18.783 に答える
113

チェリーピックが必要な場合の状況の簡単な例

次のシナリオを検討してください。2つのブランチがあります。

a)release1-このブランチはお客様に提供されますが、まだ修正が必要なバグがいくつかあります。

b)マスター-クラシックマスターブランチ。たとえば、release2の機能を追加できます。

NOWrelease1で何かを修正しました。もちろん、masterでもこの修正が必要です。そして、それはチェリーピッキングの典型的なユースケースです。したがって、このシナリオでのチェリーピックは、release1ブランチからコミットを取得し、それをマスターブランチに含めることを意味します。

于 2018-12-11T13:00:53.043 に答える
103

チェリーピックの機能を段階的に説明したイラストと、これらのイラストのアニメーション(終わり近く)を用意しました。

  1. チェリーピッキングの前に
    (ブランチからコミットのチェリーピックを実行します): Lfeatureここに画像の説明を入力してください

  1. コマンドの開始git cherry-pick feature~2
    (前feature~2の2番目
    featureのコミット、つまりコミットL): ここに画像の説明を入力してください

  1. コマンド(git cherry-pick feature~2)を実行した後: ここに画像の説明を入力してください

同じアニメーション: ここに画像の説明を入力してください


ノート:

コミットL'、ユーザーの観点から(commit =スナップショット)、commitの正確なコピーですL

技術的には(内部的に)、これは新しい別のコミットです(たとえばLK(親として)へのポインターが含まれているのに対しL'、へのポインターが含まれているためE)。

于 2019-09-17T02:04:47.737 に答える
66

チェリーピックはGitの機能です。誰かが1つのブランチの特定のコミットをターゲットブランチにコミットしたい場合は、cherry-pickが使用されます。
gitcherry-pickの手順は次のとおりです。

  1. ターゲットブランチをチェックアウト(切り替え)します。
  2. git cherry-pick <commit id>
    

    ここで、コミットIDは別のブランチのアクティビティIDです。

    git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
    
  3. ターゲットブランチにプッシュ

https://git-scm.com/docs/git-cherry-pickにアクセスします

于 2016-08-24T09:39:59.967 に答える
26

チェリーピックがリベースに似ているのか、それともリベースのように管理されているのかを考えることができます。これは、既存のコミットを取得し、現在のブランチのヘッドを開始点として再生成することを意味します。

Arebaseは、親Xを持つコミットを取得し、実際に親Yを持つかのようにコミットを再生成します。これは、まさにacherry-pickが行うことです。

チェリーピックは、コミットを選択する方法に関するものです。(リベース)を使用pullすると、gitはブランチにプルされたものの上にローカルコミットを暗黙的に再生成しますが、cherry-pick明示的にいくつかのコミットを選択し、現在のブランチの上に暗黙的に再生成します。

したがって、実行方法は異なりますが、内部的には、コミットの再生成という非常によく似た操作です。

于 2017-01-31T22:19:17.317 に答える
18

現在のブランチに特定のコミットを適用します。

これの意味は :

  • このコミットによって追加されたすべてのファイルが追加されます
  • このコミットによって削除されたすべてのファイルが削除されます
  • このコミットによって変更されたすべてのファイルがマージされます。これは、このコミットからの変更だけでなく、コミットからのファイル全体を意味します。

例:コミットAを検討する

added newFileA
modified main:
+ import './newFileA'

コミットB

added newFileB
modified main:
+ import './newFileB'

別のブランチでコミットBをチェリーピックすると、次のようになります。

/newFileB
/main :
   import './newFileA'
   import './newFileB'

コミットBにはnewFileBmainが含まれていますが、 newFileAは含まれていないため、バグが発生するため、注意して使用してください。

于 2019-11-12T15:56:17.480 に答える
16

コピー(どこかから)と貼り付け(どこかへ)のようなものですが、特定のコミット用です。

たとえば、ホットフィックスを実行する場合は、このcherry-pick機能を使用できます。

cherry-pick開発ブランチでmerge実行すると、リリースブランチにコミットします。同様に、cherry-pickリリースブランチからマスターへのを実行します。出来上がり

于 2016-10-07T11:55:51.050 に答える
12

プロジェクトで開発者のチームと協力している場合、多数のgitブランチ間の変更を管理することは複雑な作業になる可能性があります。ブランチ全体を別のブランチにマージしたくない場合があり、1つまたは2つの特定のコミットを選択するだけで済みます。このプロセスは「チェリーピッキング」と呼ばれます。

さくらんぼ狩りに関するすばらしい記事を見つけました。詳細については、https ://www.previousnext.com.au/blog/intro-cherry-picking-gitをご覧ください。

于 2019-01-21T08:30:49.263 に答える
8

コミットIDなしでマージする場合は、このコマンドを使用できます

git cherry-pick master~2 master~0

上記のコマンドは、マスターの最後の3つのコミットを1から3にマージします

シングルコミットでこれを実行したい場合は、最後のオプションを削除してください

git cherry-pick master~2

このようにして、マスターの最後から3番目のコミットをマージします。

于 2019-03-19T12:38:35.940 に答える
1

公式ドキュメントからの抜粋:

1つ以上の既存のコミットが与えられた場合、それぞれが導入する変更を適用し、それぞれに新しいコミットを記録します。これには、作業ツリーがクリーンである必要があります(HEADコミットからの変更はありません)。

変更を適用する方法が明確でない場合、次のようになります。

  1. 現在のブランチとHEADポインターは、正常に行われた最後のコミットに留まります。

  2. CHERRY_PICK_HEAD refは、適用が難しい変更を導入したコミットを指すように設定されています。

  3. 変更がクリーンに適用されたパスは、インデックスファイルと作業ツリーの両方で更新されます。

  4. 競合するパスの場合、git-mergeの「TRUEMERGE」セクションで説明されているように、インデックスファイルには最大3つのバージョンが記録されます。作業ツリーファイルには、通常の競合マーカー<<<<<<<および>>>>>>>で囲まれた競合の説明が含まれます。

その他の変更は行われません。

続きを読む...

于 2020-03-21T08:01:10.423 に答える