2012-02-10 12 views
274

私は自分のマスターブランチでいくつかの変更を行い、それらをアップストリームに持っていきたいと思っています。私は、次のように桜選ぶときしかし、私はgitのは言うfd9f578にはまり込むコミット:git cherry-pickは "38c74dはマージですが-mオプションは指定されていません"

$ git cherry-pick fd9f578 
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given. 

はGitが私に教えて何をしようとしているし、ここで使用されるように正しいことを桜選ぶのですか?マスターブランチには、アップストリームブランチで変更されたファイルへの変更が含まれているので、マージ競合があると確信していますが、まったく整理するのが難しくありません。私はどこで変更が必要かを知っています。

これは、私が上流に持ち帰りたいコミットです。

e7d4cff added some comments... 
23e6d2a moved static strings... 
44cc65a incorporated test ... 
40b83d5 whoops delete whitspace... 
24f8a50 implemented global.c... 
43651c3 cleaned up ... 
068b2fe cleaned up version.c ... 
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common 
4172caa cleaned up comments in sessions.c ... 

答えて

342

チェリーピックが機能する方法はチェンジが(その時点で作業ツリーの違いとその親の作業ツリー)を表し、そしてあなたの現在のブランチにそれを適用する差分を取ることです。

したがって、コミットに2つ以上の親がある場合、それは2つ以上の差分を表します。どちらを適用する必要がありますか?

あなたは2人の親とのマージであったfd9f578を選んでチェリーをしようとしています。ですから、-mオプションを使用して、diffを計算する必要があるチェリーピックコマンドに指示する必要があります。たとえば、ベースとして親1を使用する場合はgit cherry-pick -m 1 fd9f578です。

私はあなたの特定の状況について確かに言うことはできませんが、git cherry-pickの代わりにgit mergeを使用するのが一般的にお勧めです。あなたがマージコミットを選択すると、すべてがに変更され、親に加えられた変更は-mコミットとなります。あなたはすべての歴史を失い、すべての違いを一緒に盛り上げる。あなたの電話。

+2

@wufooあなたはおそらく 'git rebase'について学ぶべきです - それはマージのようですが、2つのブランチを統合する代わりに、それを移植してもう一方の上に座ってください。 – Borealid

+21

親の番号はどのように知っていますか? – Anentropic

+27

@Anentropic 1は「第1の親」であり、2は「第2の親」であり、以下同様である。順序はコミットにリストされている順序です( 'git show'などで表示されます)。 – Borealid

11

@ Borealidの回答は正しいですが、ブランチの正確なマージ履歴を保存しておき、それを線形化したものを選びたいと思っているとします。

開始状態::ここでそれを行うための簡単で安全な方法ですあなたは枝X上にあり、あなたがにコミットY..Zをチェリーピックします。これは何

  1. git checkout -b tempZ Z
  2. git rebase Y
  3. git checkout -b newX X
  4. git cherry-pick Y..tempZ

は、桜Zに基づいてブランチtempZを作成することですが、Yからの歴史を持つ以降の直線化、およびそれをXのコピーに貼り付けてnewX。 (Xを変更するのではなく、新しい支店でこれを行う方が安全です)もちろん、手順4で競合が発生する可能性があります。通常の方法で解決する必要があります(cherry-pickはその点でrebaseと非常によく似ています)。

ステップ2で「現在のブランチtempZが最新です」というメッセージが表示された場合は、Y..Zはすでにリニアなので、そのメッセージは無視してステップ3と4を実行します。

次に、newXを確認し、それがあなたが望んだことをしたかどうかを確認してください。

(注:それはXYとの関係にどのような方法で依存しないため、これは、簡単なgit rebase XときブランチZのと同じではありません。つまり、あなたの共通の祖先とY間のコミットがあるかもしれません)

+1

'git rebase Y'は'現在のブランチtempZは最新です ' – Basilevs

+0

私はそれが' Y..Z'がすでに線形であったことを意味します。だからあなたはそのメッセージを無視してステップ3とステップ4を進めることができます。 –

+1

面白いアイデアを紙に書いて、何が起こっているのかを完全に理解する必要がありました – Chris

関連する問題