2012-09-27 14 views
50

これまで数え切れないほどのチェリーピックをしていましたが、今はこれで生き残ることができないようです。今まで私はそれがマージされているというエラーが出ますが、-mは与えられませんでしたか?間違って見えますGitチェリーピックのシンタックスとブランチのマージ

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given. 
fatal: cherry-pick failed 

.......それは次のようになります。

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 

私は-m機能を供給する必要がないとき以来?

答えて

64

コミットがマージコミットの場合、つまり複数の親を持つコミットの場合は、-mを指定する必要があります。記述することができないものをgit cherry-pick REV

通常、:

  1. 回転とその親の間で変更してください。

  2. これらの変更を現在のHEADに適用し、結果をrevのコミットメッセージでコミットします。

マージコミットは2行の開発に加わります。たとえば、1行はウィジェットを実装し、もう1行はクラッタを除去します。マージはウィジェットのコードを提供し、混乱を避けます。

ここでcherry-pickプロセスのステップ1を考えてみましょう。gitはクラッタを削除するか、ウィジェットを実装するかを推測できません。両方を行う方法に関する情報は、単一のマージコミットの内部には含まれていないため、結果のマージされたツリーの内容のみが含まれているため、両方を行うこともできません。

-mオプションを使用すると、続行方法をgitに伝えることができます。たとえば、masterでクラッタ除去が発生し、git merge WIDGETを使用してマージコミットが作成された場合、git cherry-pick -m 1 merged-commitは、マージされたツリーと親1(クラッタ除去コミットの最後)との差分が正確にウィジェットの追加。一方、親2(ウィジェット追加コミットの最後)とのマージコミットの違いは、ウィジェットブランチから抜けたクラッタ除去であるため、git cherry-pick -m 2 merge-commitはクラッタを削除します。

+2

'git cherry-pick'を検証するには' gitプッシュする前にショー;これはあなたに押し付けようとしていることの違いを示します。 – Jimothy

+1

マージコミットを元に戻すには、成功するためにはまったく同じ考慮事項とコマンドライン引数が必要です。 – ErikE

+2

ウィジェットとクラッタの両方を削除したいのですが?それはチェリーピックマージコミットの権利のポイントですか?それ以外の場合は、ウィジェット追加の最後のコミット、またはクラッタ削除の最後のコミットをチェリーピックします。 – Zennichimaro

2

manページからの構文は次のとおりです。

通常-m親番号、--mainline親番号、することはできません:親の数はを参照

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>... 

チェリー - マージのどちら側がメインラインとみなされるべきか分からないので、マージを選択します。このオプションは、メインラインの親番号(1から始まる)を指定し、cherry-pickが指定された親に対する変更を再生できるようにします。

したがって、正しいコミットハッシュがあることを確認するためにもう一度チェックします。それはあなたがマージからではなくむしろ前にコミットを望むかもしれないかもしれません。それ以外の場合は、このフラグを使用して、マージの正しい側をポイントしてリクエストを曖昧さを解消する必要があります。

3

個人的に私は通常、2つのコミットを結合しているので、2つの親からなるコミットC(例えば、マスターでコミットし、他のブランチからコミットBをマージする)チェリーはマージを選ぶ私は混乱のコマンドを迷惑にならないでください。マージは自分自身を選択しますが、代わりに私は両親のAとBを個別にチェリーします。これはチェリーピックだけをしたいときにも役立ちますマスターからのコミットAが既にマージされる前にチェリーピッキングされているブランチにチェリーピックされた場合にのみコミットBを実行します。

0

は、結果をマージしてください:

git cherry-pick .... 
git mergetool 
git cherry-pick --continue 
14

あなたのマージコミットのでgitのは、親番号(-m)を指定するように要求しているが両親とgitのがあるべきマージのどちら側かわからない持っていますメインラインとみなした。したがって、このオプションを使用すると、メインラインとparent-pickの親番号(1から始まる)を指定して、指定した親に対する変更を再生することができます。見つけるあなたの両親をコミットするには

、試すのいずれか:

git show --pretty=raw <merge_commit> 

のか:

git cat-file -p <merge_commit> 

またはより良いGUIの可視性のために、試してみてください。その結果、

gitk <merge_commit> 

、あなたは

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821 
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit> 
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit> 

その後で、あなたのそれぞれの親の詳細を確認:

git show <parent1_or_2_commit> 

変更されたファイルの一覧を表示する--statを追加します。

または(上記の親に基づいて)変化を比較するために、次のコマンドを使用します。

git diff <parent1_or_2_commit>..<commit> 

変更されたファイルの一覧を表示する--statを追加します。

かによって両親を比較するために組み合わせる差分を使用します。

git diff --cc <parent1_commit> 
git diff --cc <parent2_commit> 

次に例えば、あなたのチェリーピックのために1から始まる親番号を指定しますその後

​​

何が起こっているかを確認するためにgit statusを実行します。変更をまだコミットしない場合は、-nオプションを追加して何が起こるかを確認してください。あなたが満足していないときは、HEAD(git reset HEAD --hard)にリセットしてください。もしあなたがgitの競合を得るならば、手動でそれらを解決するか、マージ戦略(-X)を指定する必要があります:How to resolve merge conflicts in Git?