不注意でGitに損傷を与えることは、非常に簡単です。それでも、使用するための最良の方法 行く 常に物議を醸すでしょう。
これは、Git自体が基本的な分岐操作の詳細のみを示しており、その使用パターン、つまり分岐モデルはユーザーの意見の問題であるためです。 Git分岐モデルは、ソフトウェア開発者がコードベースに変更を加えるときに必然的に発生する混乱を整理することで、苦痛を和らげることを約束します。
多くの開発者と同様に、実際のソフトウェア開発に取り掛かることができるように、「正しく機能する」ものが必要でした。だからあなたは拾った Gitフロー 、Gitユーザーによく推奨される分岐モデル。たぶん、実際にGitフローのロジックに問題が発生するまで、最初はGitフローのロジックに参加していました。あるいは、Gitフローはあなたがそれを採用するのに十分に適しているようには思えないかもしれません。結局のところ、無数の変数が関係しており、すべての状況で単一の分岐モデルがうまく機能するわけではありません。
朗報です!古典的なGitフローモデルのバリエーション、 強化されたGitフロー 主な利点を維持しながら、Gitフローワークフローのより一般的な操作を簡素化します。
で進化する製品を開発するときにGitフローがどのように優れているかを発見して以来、私はGitフローを強く支持してきました。 有意な値の増分 (言い換えると、 リリース )。
値の大幅な増加は、で通常使用される2週間以上のスプリントのように、完了するまでにかなりの時間を必要とします。 スクラム ベースの開発。開発チームがすでに本番環境にデプロイされている場合、次のリリースのスコープが本番環境のコードと同じ場所(たとえば、使用するGitリポジトリのメインブランチ)に蓄積されると、問題が発生する可能性があります。
製品がまだ初期開発段階にある間、つまり、製品の生産も実際のユーザーもいない間は、チームがすべてをメインブランチ内に保持するだけで問題ありません。実際、それは大丈夫ではありません。この戦略により、多くの儀式なしで最速の開発ペースが可能になります。しかし、実稼働環境では状況が変わります。それから、実際の人々は安定するために製品に依存し始めます。
たとえば、本番環境に重大なバグがあり、すぐに修正する必要がある場合、修正を展開するためだけに、これまでにメインブランチで発生したすべての作業をロールバックしなければならないことは、開発チームにとって大きな災害になります。また、適切なテストを行わずにコードをデプロイすることは、コードが中途半端なものであるか、十分に開発されていると見なされるかにかかわらず、明らかに選択肢ではありません。
そこで、Gitフローを含む分岐モデルが光ります。洗練された分岐モデルは、次の方法に関する質問に答える必要があります。 分離する 現在人々が使用しているシステムのバージョンからの次のリリース、方法 更新 次のリリースでのそのバージョンとその方法 修正プログラムを導入する 現在のバージョンに対する重大なバグ。
Gitフロープロセスは、「メイン」(本番または「現在のバージョン」ブランチ)と「開発」(開発または「次のリリース」ブランチ)を分離し、機能/リリース/ホットフィックスブランチの使用に関するすべてのルールを提供することで、これらの基本的なシナリオに対処します。これは、リリースベースの製品の開発ワークフローからの多くの頭痛の種を効果的に解決します。
デザインのさまざまな例の原則
しかし、古典的なGitフローモデルに適したプロジェクトでも、それがもたらす可能性のある典型的な問題に苦しんでいます。
拡張Gitフローを初めて使用したのは、グリーンフィールドのクローズドソースプロジェクトでした。私は他の1人の開発者と協力していて、メインブランチに直接コミットすることでプロジェクトに取り組んでいました。
注:製品の最初の公開リリースまでは、開発ワークフローの速度と単純さのために、Gitフローの支持者であっても、すべての変更をメインブランチに直接コミットすることは絶対に理にかなっています。まだ本番環境がないため、チームができるだけ早く修正する必要がある本番環境のバグの可能性はありません。したがって、古典的なGitフローが意味するすべての分岐魔法を実行することは、この段階ではやり過ぎです。
その後、最初のリリースに近づき、その時点を超えると、メインブランチに直接コミットすることに不安を感じることに同意しました。私たちはかなり急速に動き、ビジネスの優先事項は、堅実な開発プロセスを確立する余地をあまり残していませんでした。つまり、メインブランチがリリース可能な状態にあることを確信できる十分な自動テストを備えたプロセスです。
これは、古典的なGitフローモデルの有効なケースのようでした。メインブランチと開発ブランチが別々であり、値が大幅に増加するまでの時間が十分にあるため、ほとんどの場合、手動のQAで十分な結果が得られると確信していました。私がGitフローを提唱したとき、同僚は似たようなものを提案しましたが、いくつかの重要な違いがあります。
最初、私は押し返しました。古典的なGitフローに対して提案された「パッチ」のいくつかは少し革命的すぎるように思えました。私は彼らが主要な考えを破るかもしれないと思いました、そして全体のアプローチは不十分でしょう。しかし、さらに考えてみると、これらの調整は実際にはGitの流れを壊さないことに気づきました。一方、上記のすべての問題点を解決することで、より優れたGit分岐モデルになります。
そのプロジェクトで変更されたアプローチで成功した後、私はその背後に小さなチームがいる別のクローズドソースプロジェクトでそれを使用しました。そこでは、私は永続的なコードベースの所有者であり、外部委託された開発者または2人が時々助けました。このプロジェクトでは、6か月で本番環境に移行し、それ以来、CIおよびE2Eテストを1年以上使用しており、毎月リリースされています。
この新しい分岐アプローチに関する私の全体的な経験は非常にポジティブだったので、他の開発者と共有して、古典的なGitフローの欠点を回避できるようにしたいと思いました。
強化されたGitフローでの作業の分離については、メインと開発の2つの長寿命のブランチがまだあります。 (ユーザーはまだ修正プログラムとリリース機能を持っています。これらはブランチではなくなったため、「機能」に重点を置いています。詳細については、違いのセクションで説明します。)
ウェブデザインのcmsとは
従来のGitフロー機能ブランチの正式な命名スキームはありません。機能の準備ができたら、開発から分岐してマージし直して開発します。チームは、任意の命名規則を使用できます。または、開発者が「my-branch」よりもわかりやすい名前を使用することを単に望んでいます。強化されたGitフローについても同じことが言えます。
あるカットオフポイントまで開発ブランチに蓄積されたすべての機能が、新しいリリースを形作ります。
ほとんどの場合、履歴を適切かつ線形に保つために、機能ブランチにスカッシュマージを使用することを強くお勧めします。これがないと、チームがほんの一握りの機能ブランチをジャグリングしているときに、コミットグラフ(GUIツールまたはgit log --graph
から)がだらしなく見え始めます。
スクラムチームの推奨サイズ
ただし、このシナリオのビジュアルに問題がない場合でも、潰す理由はもう1つあります。押しつぶさずに、履歴ビューをコミットします。どちらもプレーンですgit log
(--graph
なし)およびGitHub-最も単純なマージシナリオでも、かなり一貫性のないストーリーを伝えます。
スカッシュマージを使用する際の注意点は、元の機能のブランチ履歴が失われることです。ただし、この警告は、たとえばGitHubを使用している場合にも当てはまりません。 完全な元の履歴を公開します 機能ブランチ自体が削除された後でも、スカッシュマージされたプルリクエストを介した機能ブランチの。
(うまくいけば)それがあなたがする主なことなので、リリースサイクルを見てみましょう。開発で蓄積されたものをリリースしたいところまで来たら、それは厳密にはメインのスーパーセットです。その後、クラシックと拡張Gitフローの最大の違いが始まります。
強化されたGitフローを使用してリリースを作成するすべてのステップは、従来のGitフロープロセスとは異なります。
git push origin
を使用します。git push --force
を使用してこの新しい構造をプッシュします 、リモートリポジトリはそのような「大幅な変更」をそれほど簡単には受け入れないためです。繰り返しになりますが、これは、次の理由により、このコンテキストで見られるほど安全ではありません。修正プログラムのケースは2つあります。修正プログラムを実行している場合 アクティブなリリースがない場合 —つまり、チームは開発ブランチで新しいリリースを準備しています—それは簡単です。メインにコミットし、変更をデプロイして、準備が整うまでステージングでテストしてから、本番環境にデプロイします。
最後のステップとして、メインからコミットを選択して開発し、次のリリースにすべての修正が含まれるようにします。複数の修正プログラムのコミットが発生した場合、特にIDEまたは他のGitツールでパッチを作成して適用することで、何度もチェリーピッキングを行う代わりに、労力を節約できます。最初のリリース後にマージメインを押しつぶして開発しようとすると、開発ブランチで行われた独立した進捗状況と競合する可能性が高いため、お勧めしません。
修正プログラムの処理 アクティブリリース中 つまり、メインを強制的に押しただけで、まだ新しいリリースを準備している場合は、強化されたGitフローの最も弱い部分です。リリースサイクルの長さと解決する必要のある問題の重大度に応じて、常に新しいリリース自体に修正を含めることを目指してください。これが最も簡単な方法であり、ワークフロー全体をまったく混乱させることはありません。
それがうまくいかない場合(修正をすばやく導入する必要があり、新しいリリースの準備が整うのを待つことができない場合)、やや複雑なGit手順の準備をします。
需要の価格弾力性を見つける方法
適切な計画、十分に高いコード品質、健全な開発とQA文化があれば、チームがこの方法を使用する必要はほとんどありません。万が一に備えて、Gitフローを強化するためにこのような災害計画を作成してテストすることは賢明でしたが、実際に使用する必要はありませんでした。
すべてのプロジェクトに専用の開発環境が必要なわけではありません。各開発者マシンに高度なローカル開発環境をセットアップするのは簡単かもしれません。
しかし、専用の開発環境は、より健康的な開発文化に貢献することができます。開発ブランチでテストを実行し、テストカバレッジを測定し、複雑さのメトリックを計算すると、多くの場合、ステージングに至る前にミスをキャッチすることで、ミスのコストを削減できます。
強化されたGitフローと組み合わせると、いくつかのCI / CDパターンが特に役立つことがわかりました。
このようなパターンは比較的単純ですが、日常の開発操作をサポートする強力な機械を提供します。
nodejsで何ができるか
強化されたGitフローは万人向けではありません。それは本枝を押す力の物議を醸す戦術を活用しているので、純粋主義者はそれを憤慨するかもしれません。ただし、実用的な観点からは、問題はありません。
前述のように、修正プログラムはリリース中はより困難ですが、それでも可能です。あまり頻繁に発生しないQAやテストカバレッジなどに適切な注意を払うことで、私の観点からは、従来のGitフローと比較した拡張Gitフローの全体的な利点との有効なトレードオフになります。大規模なチームや、修正プログラムがより頻繁に発生する可能性があるより複雑なプロジェクトで、強化されたGitフローがどのように機能するかを知りたいと思います。
強化されたGitフローモデルに関する私の前向きな経験も、主にクローズドソースの商用プロジェクトを中心に展開しています。プルリクエストがソースツリーの古いリリース派生に基づいていることが多いオープンソースプロジェクトでは、問題が発生する可能性があります。それを整理するための技術的な障害はありません。予想以上の労力が必要になる可能性があります。このような場合の拡張Gitフローの適用性に関して、オープンソーススペースで多くの経験を持つ読者からのフィードバックを歓迎します。
ApeeScapeの同僚に感謝します アントワーヌファム 強化されたGitフローの背後にあるアイデアを開発する上での彼の重要な役割に対して。
として マイクロソフトゴールドパートナー 、ApeeScapeは、マイクロソフトの専門家のエリートネットワークです。必要なときに必要な場所で正確に、必要な専門家と一緒に高性能チームを構築してください!
Gitフローは、Gitバージョン管理システム(VCS)の分岐モデルです。分岐モデルは、基本的なGit操作に基づいて構築され、堅牢なバージョン管理を可能にすることを目的とした使用パターンを規定します。 Gitフローは、2010年にVincent Driessenのブログ記事で公表され、それ以来人気があります。
Gitフロー分岐戦略は、大幅な値の増分で進化する製品を開発するときに優れています。これは、「main」(本番または「現在のバージョン」ブランチ)と「develop」(開発または「次のリリース」ブランチ)を分離し、ヘルパーブランチの使用に必要なすべてのルールを提供することによって行われます。
規定のパターンに従ってGitフローを使用します。これにより、チームは、現在本番環境にあるシステムのバージョンから次のリリースを分離する方法、そのバージョンを次のリリースで更新する方法、および重大なバグの修正プログラムを現在のバージョンに導入する方法に関する質問に答えることができます。
Gitフローを使用する必要があるかどうかは、特定のプロジェクトによって異なります。答える主な質問は、「開発ワークフロー全体には、メインブランチをリリース可能な状態に保つのに十分な自動品質保証がありますか?」です。答えが「いいえ」の場合、そのようなプロジェクトはGitフローの恩恵を受ける可能性があります。
答えは特定のプロジェクトのコンテキストに依存するため、単一の最良のGitワークフローはありません。一部のプロジェクトはGitフローまたはそのバリエーションの恩恵を受けますが、他のプロジェクトはトランクベースの開発アプローチの方が優れています。