1. ホーム
  2. git

[解決済み] Git チェリーピック構文とブランチのマージ

2023-08-23 17:57:22

質問

私はあるブランチから別のブランチにチェリーピックをしようとしているのですが、それは簡単なはずなのに、マージであるというエラーが発生します。

$ 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 機能を提供するようになったのですか?

どのように解決するのですか?

以下のものを用意する必要があります。 -m コミットが マージコミット である場合、すなわち複数の親を持つコミットの場合です。

通常、どのような git cherry-pick REV が行うことは、次のように記述することができます。

  1. の間の変化を取る。 rev とその親との間の変更を取る。

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

マージコミットは2つの開発ラインを結合します。たとえば、1 つの行はウィジェットを実装し、もう 1 つの行は雑然としたものを取り除きます。マージはウィジェットを含むコードを提供し、クラッタを取り除きます。

ここで、チェリーピック処理のステップ1を考えてみましょう。gitは、あなたが雑念を取り除きたいのか、ウィジェットを実装したいのかを推測することができません。なぜなら、両方を行う方法に関する情報は単一のマージコミット内に含まれておらず、マージされた結果のツリーのコンテンツのみが含まれているからです。

-m オプションを使用すると、git にどのように処理を進めるかを指示することができます。たとえば、散らかったものを取り除くときに master で、マージコミットが git merge WIDGET で作成され、その後 git cherry-pick -m 1 merged-commit は新しいウィジェットをチェリーピックします。なぜなら、マージされたツリーと親1(乱雑さを取り除く最後のコミット)の間の差分は、まさにウィジェットが追加されたものであるからです。一方 git cherry-pick -m 2 merge-commit は乱雑さを削除します。なぜなら、親 2 (ウィジェット追加の最後のコミット) と マージコミット の間にある差分は、まさに雑多なものを削除するのに欠けているからです。 ウィジェット ブランチに欠けている乱雑さを取り除くものです。