Git Cherry-pickとマージのワークフロー


302

私がリポジトリのメンテナーであり、コントリビューターから変更をプルしたい場合、いくつかの可能なワークフローがあります:

  1. 私はcherry-pickそれぞれリモートから(順番に)コミットします。この場合、gitはコミットをリモートブランチとは無関係であると記録します。
  2. mergeはブランチで、すべての変更を取り込み、新しい「競合」コミットを追加します(必要な場合)。
  3. 私はmergeそれぞれリモートブランチから(順番に)個別にコミットし、すべてを1つにまとめるのではなく、コミットごとに競合を記録できるようにします。
  4. 完全を期すために、rebasecherry-pickオプションと同じですか?)を実行できますが、私の理解では、これは投稿者を混乱させる可能性があります。多分それはオプション1を排除します。

2と3のどちらの場合も、1とは異なり、gitはコミットのブランチ履歴を記録します。

cherry-pickまたはmerge説明されている方法を使用することの賛否両論は何ですか?私の理解は方法2が標準であるということですが、単一の「競合」マージで大規模なコミットを解決することは、最もクリーンな解決策ではないと感じています。

回答:


297

rebase(およびcherry-pick)にmergeは、それぞれ長所と短所があります。私はmergeここで主張しますが、両方を理解する価値があります。(優先されるケースを列挙した、代替のよく議論された答えをここで探してくださいrebase。)

merge好ましいcherry-pickrebaseの理由のカップルのため。

  1. 堅牢性。コミットのSHA1識別子は、それ自体だけでなく、それに先行する他のすべてのコミットとの関連でもそれを識別します。これにより、特定のSHA1でのリポジトリの状態がすべてのクローンで同一であることが保証されます。(理論的には)誰かが同じ変更のように見えることをした可能性はありませんが、実際にはリポジトリが破損またはハイジャックされています。個々の変更をチェリーピックすることができ、それらは同じである可能性がありますが、保証はありません。(マイナーな二次的な問題として、作業コピーが同一になったとしても、両方が履歴に存在するため、同じコミットで他の誰かが再びチェリーピックすると、新しいチェリーピックコミットは余分なスペースを消費します。)
  2. 使いやすさmergeワークフローはかなり簡単に理解できる傾向があります。 rebaseより高度であると考えられる傾向があります。両方を理解することをお勧めしますが、バージョン管理の専門家になりたくない人(私の経験では、自分の仕事は得意ですが、余分な時間を費やしたくない同僚が多くいます)。時間はちょうど融合します。

マージが多いワークフローrebasecherry-pickも、特定の場合に役立ちます。

  1. への1つの欠点mergeは乱雑な歴史です。 rebase他の変更に定期的にマージした場合のように、長い一連のコミットが履歴に散らばることを防ぎます。私が実際に使用するのは、これが実際の主な目的です。あなたがなりたいものに非常に慎重に、決してにされていないrebase、あなたが他のリポジトリと共有していることをコード。コミットがpush編集されると、他の誰かがその上でコミットした可能性があり、リベースはせいぜい上記のような種類の重複を引き起こします。最悪の場合、リポジトリが非常に混乱し、微妙なエラーが発生して、フェレットアウトに長い時間がかかります。
  2. cherry-pick 基本的に破棄することに決めたトピックブランチから変更の小さなサブセットをサンプリングするのに便利ですが、いくつかの便利な部分があることに気づきました。

多くの変更を1つよりもマージすることを好む場合については、それは非常に単純です。多数のチェンジセットを作成し始めたら、個々のチェンジセットをマージするのは非常に退屈な作業になる可能性があります。git(およびMercurial、Bazaar)のマージ解決は非常に優れています。ほとんどの場合、長いブランチでさえマージする大きな問題に遭遇することはありません。通常、すべてを一度にマージします。多数の競合が発生した場合にのみバックアップを取り、マージ断片を再実行します。それでも私は大きな塊でそれをします。非常に現実的な例として、3か月分の変更をマージする同僚がいて、250000行のコードベースで9000件の競合が発生しました。修正するために行ったのは、一度に1か月分のマージを実行することです。競合は直線的には増加せず、バラバラに実行すると結果が大きくなります。9000未満の競合。それはまだ多くの作業でしたが、一度に1つのコミットを実行することほどではありませんでした。


1
実際、理論的には、マロリーが同じSHA1であるが内容が異なるコミットを作成することでリポジトリを破損する可能性がありますが、実際にはおそらく起こりません。:)
ボンベ

1
ハ:)私は「理論的にはオッズが非常に低いため、それが起こらないと信頼できる」ことを意味しましたが、あなたはそれがtopsy-turvyと読むのは正しいです。
クォーク

"merge --squash"についてどう思いますか?
cmcginty 2009

@Bombeマロリーが成功したい場合、元のコミットと2番目のコミットを同じSHA1で具体的に構築する必要があります。したがって、別の質問は次のとおりです。2つの(やや)偽のコミットが表示され、気付かない確率はどれくらいですか?;)
JoãoPortela、2011年

64
9000の衝突?私は仕事を辞めて、養蜂家になります。
セバスチャンパッテン2014

95

私の意見では、チェリーピッキングは、それが必要とされるまれな状況のために予約する必要があります。たとえば、 'master'ブランチ(トランク、メイン開発ブランチ)を直接修正し、それを 'maint'にも適用する必要があることに気付いた場合'。ワークフローは、マージまたはリベース(または「git pull --rebase」)のいずれかに基づく必要があります。

チェリーピッキングまたは再配置コミットつまり覚えてくださいのGitの観点から、リモートリポジトリにコミットとは異なるので、オリジナルよりも(異なるSHA-1識別子を有します)。(Rebaseは通常、パッチID、つまりコミットIDではなく変更をチェックするため、これを処理できます)。

また、gitでは多くのブランチを一度にマージすることができます:いわゆるoctopus merge。タコのマージは競合なしで成功する必要があることに注意してください。それにもかかわらず、それは役に立つかもしれません。

HTH。


19
+1は、リベース/チェリーピッキングが実際にコミットを「コピー」し、元のコミットへのリンクを失う点です。
studgeek 2011

1
私たちはこの方法でチェリーピックを使用して、バグ修正(おそらく非常に小さな機能)のコミットを既存のリリースブランチに移動してパッチを準備します。複数のコミットにまたがる機能は、通常、マスターに基づくリリースブランチに入る必要があります。
foxxtrot、2011年

3
@foxxtrot:別の解決策は、このバグを示す最も古いコミットに基づいて、バグ修正用に別のブランチを作成し、それを「maint」と「master」にマージすることです...ただし、この場合は、そのバグ修正を知る必要があります両方のブランチに適用されます。
JakubNarębski、2011年

4
@Jakubバグ修正ブランチの作成とマージに不可欠な2つのコマンド:バグを引き起こしgit blameたコミットを見つけgit branch --contains、ブランチをマージする場所を決定する。この投稿
gcbenison 2012年

-10

リベースとチェリーピックは、クリーンなコミット履歴を維持できる唯一の方法です。マージの使用を避け、マージの競合を作成しないでください。gerritを使用している場合は、必要に応じて1つのプロジェクトをMergeに設定し、1つのプロジェクトをチェリーピックモードに設定して、自分で試してください。


これが質問にどのように答えるかはまったくわかりませんが、いくつかの例ではいくつかの光がもたらされるでしょう
エイドリアンNasui

1
あなたの歴史がまっすぐに見えるという事実は、それが理解しやすくなることを意味しません。
nicolimo86 2018年

マージは、きれいな履歴を持つための通常の方法です。Cherry-pick and rebaseは、主に履歴を変更する必要がある状況で使用されます。つまり、マージが常に最初の選択肢であることを意味します。リベースが変更されたため、リモートおよび複数のユーザーで作業する場合、comit shaの変更は非常に危険です。
Radon8472

ここのこの男はメダルに値します。彼は引き続き反対票を投じられることを知っていますが、それは正しい答えです。称賛。
PW Kad

申し訳ありませんが、今までこれらのコメントはありませんでした。結論を出す前に、テスト環境で試してみてください。私は複数の製品ブランチに貢献している約600人の開発者を抱えています。ローカルワークスペースで開発者が何をするかは気にしません。統合のために変更が送信された場合、開発ブランチまたは時々リリースまたはバグ修正ブランチにチェリーピックできるはずです。参考までに...私はGerritを使用しています。
ナガラジマガダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.