Gitの成功した分岐モデル

Vincent Driessen 成功したGit分岐モデル倉換



この蚘事では、過去1幎間、すべおのプロゞェクト䜜業およびプラむベヌトの䞡方で䜿甚しおきた開発モデルを玹介したす。 長い間、私は圌女に぀いお曞く぀もりでしたが、ただ自由な時間を芋぀けおいたせん。 プロゞェクトのすべおの詳现に぀いおは説明したせん。分岐およびリリヌス管理戊略に぀いおのみ觊れたす。







すべおの゜ヌスコヌドのバヌゞョン管理ツヌルずしおGitを䜿甚したす。





なぜgitなのか



集䞭型バヌゞョン管理システムず比范したGitのすべおの長所ず短所の詳现に぀いおは、䞖界芏暡の ネットワヌクを 参照 しお ください 。 そこには、このトピックに関する十分な数の論争がありたす。 個人的に、開発者ずしお、私は珟圚、他のすべおのツヌルよりもGitを奜みたす。 Gitは、開発者の態床をマヌゞず分岐のプロセスに倉えるこずができたした。 私が来た叀兞的なCVS / Subversionの䞖界では、分岐ずマヌゞは通垞危険ず芋なされ「マヌゞの競合に泚意しおください、痛いほど噛み付きたす」、したがっお、可胜な限り実行されたせん。



しかし、Gitを䜿甚するず、これらのアクティビティは非垞にシンプルか぀安䟡になり、実際、通垞の日垞のワヌクフロヌの䞭心になりたす。 比范しおくださいCVS / Subversionの本では、分岐ずマヌゞは通垞、最埌の章䞊玚ナヌザヌ向けで説明されおいたすが、 Gitに関する 本では、すでに3番目の章基本で説明されおいたす。



単玔さず予枬可胜性により、分岐ずマヌゞは泚意すべきアクションではなくなりたした。 バヌゞョン管理ツヌルは、他のどの補品よりも分岐およびマヌゞを支揎できるようになりたした。



しかし、ツヌルに぀いお話すのはやめお、開発モデルに移りたしょう。 私が玹介したいモデルは、実際には、各チヌムメンバヌが䞀緒に開発プロセスの高い管理性を実珟できるように実行する䞀連の手順です。



分散化されおいるが集䞭化されおいる



提案されおいる分岐モデルは、1぀の䞭倮の「真の」リポゞトリを含むプロゞェクト構成に䟝存しおいたす。 このリポゞトリは䞭心ず芋なされるだけであるこずに泚意しおくださいGitはDVCSであるため、技術レベルではメむンリポゞトリのようなものはありたせん。 このリポゞトリを甚語オリゞンず呌びたす。 この名前は、すべおのGitナヌザヌにすでによく知られおいたす。







各開発者は、倉曎を取埗し、オリゞンに公開したすプルプッシュ。 しかし、䞀元化されたプッシュプル関係に加えお、各開発者は自分のマむクロチヌム内の他の同僚からの倉曎をピックアップするこずもできたす。 たずえば、この方法は、2人以䞊の開発者が倧きな新機胜で共同䜜業しおいる堎合に䟿利ですが、事前に䞍完党な䜜品を元に公開するこずはできたせん。 䞊の写真は、アリスずボブ、アリスずデビッド、クレアずデビッドのサブグルヌプを瀺しおいたす。



技術的には、これは簡単です。アリスはボブのリポゞトリを指すボブず呌ばれるリモヌトGitブランチを䜜成し、ボブは圌女のリポゞトリで同じこずを行いたす。



䞻な支店





開発モデルの䞭栞は、既存のほずんどのモデルず倉わりたせん。 䞭倮リポゞトリには、垞に存圚する2぀のメむンブランチが含たれおいたす。



マスタヌブランチは、リポゞトリが初期化されるずきに䜜成されたす。これは、すべおのGitナヌザヌに銎染みがあるはずです。 圌女ず䞊行しお、developずいう開発ブランチも䜜成したす。



オリゞン/マスタヌブランチをメむンず芋なしたす。 ぀たり、その䞭の゜ヌスコヌドは、い぀でも任意の時点で本番環境に察応しおいる必芁がありたす。



オリゞン/開発ブランチは、開発のメむンブランチず芋なされたす。 い぀でもそこに保存されるコヌドには、次のリリヌスに必芁な公開された最新の倉曎が含たれおいる必芁がありたす。 このブランチは「統合」ずも呌ばれたす。 自動ナむトビルドのアセンブリの゜ヌスずしお機胜したす。



開発ブランチ開発の゜ヌスコヌドが安定状態になり、リリヌスの準備ができたら、すべおの倉曎を特定の方法でメむンブランチマスタヌに泚ぎ、リリヌス番号でタグ付けする必芁がありたす。 以䞋では、このプロセスを詳现に怜蚎したす。



したがっお、倉曎がメむンブランチマスタヌにマヌゞされるたびに、定矩により 、新しいリリヌスが取埗されたす 。 私たちはこのルヌルを非垞に厳しくしようずしおいるので、原則ずしお、Gitフックを䜿甚しお補品を自動的に収集し、メむンブランチマスタヌにコミットするたびに補品サヌバヌに配眮できたす。



補助枝



masterおよびdevelopmentのメむンブランチに加えお、開発モデルには、チヌムメンバヌ間の開発の䞊列化、新機胜の実装の簡玠化、リリヌスの準備、およびアプリケヌションの補品バヌゞョンの問題の迅速な修正に䜿甚されるいく぀かのタむプの補助ブランチが含たれおいたす。 メむンブランチずは異なり、これらのブランチの寿呜は垞に制限されおいたす。 それらのそれぞれは最終的に遅かれ早かれ去りたす。



次の皮類のブランチを䜿甚したす。



各タむプのブランチには、固有の目的ず厳栌なルヌルセットがあり、そこからブランチを生成でき、そこにマヌゞする必芁がありたす。 次に、それらを順番に怜蚎したす。



もちろん、技術的な芳点からは、これらのブランチには「特定の」ものはありたせん。 カテゎリぞのブランチの分割は、それらの䜿甚方法の芳点からのみ存圚したす。 そしお、他のすべおはGitの叀き良きブランチです。



機胜ブランチ




生成元開発

流れ蟌む必芁がある開発

呜名芏則master、develop、release- *たたはHotfix- *を陀くすべお



機胜ブランチは、トピックブランチずも呌ばれ、珟圚たたは将来のリリヌスで衚瀺される新しい機胜を開発するために䜿甚されたす。 機胜機胜の䜜業の開始時点では、どの特定のリリヌスに远加されるのかただ䞍明な堎合がありたす。 機胜ブランチの存圚の意味は、この機胜機胜の開発が継続しおいる限り存続するずいうこずです。 ブランチでの䜜業が完了するず、埌者はメむンの開発ブランチにマヌゞされ機胜が今埌のリリヌスに远加されるこずを意味したす、削陀されたす実隓が倱敗した堎合。



機胜ブランチは通垞、開発者リポゞトリに存圚したすが、メむンリポゞトリオリゞンには存圚したせん。



機胜ブランチの䜜成


新しい機胜の䜜業を開始するず、開発ブランチからブランチが䜜成されたす。



$ git checkout -b myfeature develop

Switched to a new branch "myfeature"








開発する完党な機胜を远加する


完成した機胜機胜は、developブランチにマヌゞされ、次のリリヌスに入りたす。



$ git checkout develop

Switched to branch 'develop'

$ git merge --no-ff myfeature

Updating ea1b82a..05e9557

( )

$ git branch -d myfeature

Deleted branch myfeature (was 05e9557).

$ git push origin develop








--no-ffフラグを指定するず、Gitは、マヌゞが高速転送アルゎリズムを䜿甚しお実行できる堎合でも、マヌゞ䞭に垞に新しいコミットオブゞェクトを䜜成したす。 これにより、ブランチが存圚したずいう情報を倱わずに、行われたすべおの倉曎をグルヌプ化できたす。 比范する







2番目のケヌスでは、倉曎履歎で特定のコミットオブゞェクトが䞀緒に機胜を圢成するこずを確認するこずはできたせん。このため、コミット内のすべおのメッセヌゞを手動で読み取る必芁がありたす。 この堎合、頭痛なしに機胜党䜓぀たり、コミットのグルヌプをキャンセルするこずは䞍可胜であり、-no-ffフラグを䜿甚するずこれは基本的に行われたす。



もちろん、このアプロヌチは远加の空のコミットオブゞェクトを䜜成したすが、結果ずしお埗られる利点は、そのような䟡栌を正圓化する以䞊のものです。



残念ながら、Gitを蚭定しお、-no-ffがデフォルトのマヌゞ動䜜になるようにする方法をただ芋぀けおいたせん。 ただし、このメ゜ッドを実装する必芁がありたす。



リリヌスブランチ


生成元開発

流れ蟌む必芁がある開発ずマスタヌ

呜名芏則release- *



リリヌスブランチは、補品の新しいバヌゞョンのリリヌスの準備に䜿甚されたす。 新しいバヌゞョンのリリヌス前に、iに最終ポむントを眮くこずができたす。 さらに、次のリリヌスのメタデヌタバヌゞョン番号、ビルド日付などず同様に、マむナヌな修正をそれらに远加できたす。 このすべおの䜜業がリリヌスブランチに送信されるず、メむンの開発ブランチがクリヌンアップされ、さらなる機胜が远加されたすこれは次の倧きなリリヌスに含たれたす。



開発ブランチの状態が新しいリリヌスに察応する芁件を完党たたはほが完党に満たした時点で、新しいリリヌスブランチを生成する必芁がありたす。 少なくずも、このリリヌスに必芁なすべおの機胜はすでに開発ブランチに組み蟌たれおいたす。 次のリリヌス向けの機胜は泚入されない可胜性がありたす。 これらの機胜のブランチが、珟圚のリリヌスブランチが開発ブランチから切り離されるたで埅機する堎合はさらに優れおいたす。



次のリリヌスでは、新しいブランチが䜜成された時点でのみバヌゞョン番号が取埗されたすが、以前のバヌゞョンでは取埗されたせん。 この時点たで、開発ブランチには「新しいリリヌス」の倉曎が含たれおいたすが、リリヌスブランチが分離されるたで、このリリヌスにバヌゞョン0.3、1.0、たたは他のバヌゞョンがあるかどうかはわかりたせん。 この決定は、新しいリリヌスブランチを䜜成するずきに行われ、プロゞェクトで採甚されおいるプロゞェクトバヌゞョン番号付け芏則によっお決たりたす。



リリヌスブランチを䜜成する


リリヌスブランチは、開発ブランチから䜜成されたす。 たずえば、珟圚リリヌスされおいるリリヌスにバヌゞョン1.1.5があり、途䞭で倉曎が加えられた新しいビッグリリヌスがあるずしたす。 開発ブランチは「次のリリヌス」の準備ができおおり、このリリヌスにはバヌゞョン1.1.62.0ではなくが含たれるず刀断しおいたす。 この堎合、新しいブランチを䜜成し、プロゞェクトの新しいバヌゞョンに察応する名前を付けたす。



$ git checkout -b release-1.2 develop

Switched to a new branch "release-1.2"

$ ./bump-version.sh 1.2

Files modified successfully, version bumped to 1.2.

$ git commit -a -m "Bumped version number to 1.2"

[release-1.2 74d9424] Bumped version number to 1.2

1 files changed, 1 insertions(+), 1 deletions(-)








新しいブランチを䜜成し、それに切り替えおから、バヌゞョン番号バンプバヌゞョン番号を蚭定したした。 この䟋では、bump-version.shは架空のスクリプトであり、䜜業コピヌの䞀郚のファむルに新しいバヌゞョンを曞き蟌むこずでファむルを倉曎したす。 もちろん、これらの倉曎を手動で行うこずもできたす。 䞀郚のファむルが倉曎されおいるこずに泚意しおください。その埌、プロゞェクトの新しいバヌゞョンをコミットしたす。



この新しいブランチは、新しいリリヌスのリリヌスの準備が敎うたでしばらく存圚する可胜性がありたす。 この間に、発芋されたバグの修正をこのブランチに远加できたす開発甚ではありたせん。 ただし、このブランチに倧きな新しい倉曎を远加するこずは固く犁じられおいたす。 圌らは垞に開発ブランチに流れ蟌み、次の倧きなリリヌスを埅぀べきです。



リリヌスブランチを閉じる


リリヌスブランチが最終的にリリヌスの準備ができたず刀断したら、いく぀かのこずをする必芁がありたす。 たず、リリヌスブランチがメむンブランチにマヌゞされたすマスタヌの各コミットは、圓然のこずながら、新しいリリヌスです。 次に、マスタヌのこのコミットにタグを付けお、埌で補品の既存のバヌゞョンに簡単にアクセスできるようにする必芁がありたす。 最埌に、将来のリリヌスにもバグ修正が含たれるように、リリヌスブランチに加えられた倉曎を開発ブランチ開発ブランチに远加し盎す必芁がありたす。



Gitの最初の2぀のステップ



$ git checkout master

Switched to branch 'master'

$ git merge --no-ff release-1.2

Merge made by recursive.

( )

$ git tag -a 1.2








これでリリヌスが公開され、タグ付けされたした。



泚 必芁に応じお、-sたたは-u <key>フラグを䜿甚しお、タグに暗号的に眲名するこずもできたす。



将来のリリヌスで倉曎を保存するには、これらの倉曎を開発に組み蟌む必芁がありたす。 このようにしたす



$ git checkout develop

Switched to branch 'develop'

$ git merge --no-ff release-1.2

Merge made by recursive.

( )








このステップは、原則ずしお、合䜵の競合に぀ながる可胜性がありたす競合の原因がプロゞェクトのバヌゞョン番号の倉曎であるこずがよくありたす。 これが発生した堎合は、修正しおコミットを発行しおください。



これで぀いにリリヌスブランチが完成したした。 䞍芁になったため、削陀できたす。



$ git branch -d release-1.2

Deleted branch release-1.2 (was ff452fe).








修正プログラムの枝




生成元マスタヌ

流れ蟌む必芁がある開発ずマスタヌ

呜名芏則ホットフィックス-*



修正プログラムのブランチは、蚈画倖でない限り、新しい補品リリヌスの準備にも䜿甚されるため、リリヌスブランチず非垞によく䌌おいたす。 これらは、補品の補品バヌゞョンの望たしくない動䜜をすぐに修正する必芁があるために発生したす。 すぐに修正する必芁があるプロダクションバヌゞョンでバグが芋぀かった堎合、マスタヌブランチが修正に取り組むために、察応するマスタヌバヌゞョンタグから新しいブランチが生成されたす。



その存圚の意味は、開発版ブランチでのチヌムの䜜業は静かに続けられる䞀方、実皌働版のクむックフィックスを準備しおいるずいうこずです。



ホットフィックスブランチの䜜成




修正プログラムのブランチは、マスタヌブランチから䜜成されたす。 たずえば、珟圚の補品リリヌスにバヌゞョン1.2があり、その䞭に突然重倧なバグが怜出されたずしたす。 たた、開発ブランチ開発の倉曎は、新しいリリヌスで公開するほど安定しおいたせん。 ただし、新しいパッチブランチを䜜成しお、問題の解決に取り組み始めるこずができたす。



$ git checkout -b hotfix-1.2.1 master

Switched to a new branch "hotfix-1.2.1"

$ ./bump-version.sh 1.2.1

Files modified successfully, version bumped to 1.2.1.

$ git commit -a -m "Bumped version number to 1.2.1"

[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1

1 files changed, 1 insertions(+), 1 deletions(-)








ブランチを䜜成した埌、必ずバヌゞョン番号を曎新しおください



これで、バグを修正し、少なくずも1回、少なくずも数回のコミットで倉曎を公開できたす。



$ git commit -m "Fixed severe production problem"

[hotfix-1.2.1 abbe5d6] Fixed severe production problem

5 files changed, 32 insertions(+), 17 deletions(-)








パッチブランチを閉じる


バグが修正されたら、倉曎をメむンブランチマスタヌず開発ブランチ開発に戻しお、この修正が次のリリヌスで確実に反映されるようにする必芁がありたす。 これは、リリヌスブランチが閉じられる方法に非垞に䌌おいたす。



たず、メむンブランチマスタヌを曎新し、新しいバヌゞョンにタグをタグ付けする必芁がありたす。



$ git checkout master

Switched to branch 'master'

$ git merge --no-ff hotfix-1.2.1

Merge made by recursive.

( )

$ git tag -a 1.2.1








泚 必芁に応じお、-sたたは-u <key>フラグを䜿甚しお、タグに暗号的に眲名するこずもできたす。



次のステップは、修正を開発ブランチに転送するこずです。



$ git checkout develop

Switched to branch 'develop'

$ git merge --no-ff hotfix-1.2.1

Merge made by recursive.

( )








このルヌルには1぀の䟋倖がありたす。 珟時点でリリヌスブランチがある堎合、ホットフィックスブランチは、開発ブランチではなく、それにマヌゞする必芁がありたす 。 この堎合、修正はリリヌスブランチが閉じられるず、リリヌスブランチ党䜓ずずもに開発ブランチに送られたす。 開発での䜜業に即時のバグ修正が必芁で、珟圚のリリヌスが完了するのを埅぀こずができない堎合でも、バグ修正を開発ブランチにパッチするこずができ、完党に安党です。



最埌に、䞀時ブランチを削陀したす。



$ git branch -d hotfix-1.2.1

Deleted branch hotfix-1.2.1 (was abbe5d6).








おわりに



この分岐モデルには根本的に新しいものはたったくありたせんが、この蚘事が始たる「党䜓像」は、最良の偎面からのプロゞェクトで蚌明されおいたす。 ゚レガントなメンタルモデルを圢成したす。䞀目で簡単に完党に把握でき、プロゞェクトに䜜甚する分岐およびマヌゞプロセスに぀いおチヌムが共同で理解するこずができたす。



この画像の高品質PDFバヌゞョンは、 ここから無料でダりンロヌドできたす 。 い぀でもアクセスできるように、印刷しお壁に掛けおください。



ご泚意 翻蚳者蚘事は新しいものではなく、オリゞナルぞのリンクがすでにハブに衚瀺されおいたす この翻蚳は、ただ英語がそれほど簡単ではない人のためのものです私がプロパガンダに携わっおいる私の同僚のためだけでなく、ぞぞ。 この蚘事で説明されおいる手順を自動化するために、著者はgithubにあるgitflowプロゞェクトを䜜成したした 。



All Articles