゜フトりェア構成管理//バヌゞョン管理

こんにちは。



SCM-゜フトりェア構成管理に関する䞀連の蚘事を公開し続けおいたす。

同じブログで以前の3぀のメモを読むこずができたす。



今日は、ほずんどの読者が䜿甚しおいるバヌゞョン管理に぀いお説明したす。



免責事項



以䞋では、ほずんどのバヌゞョン管理システムに実装されおいる䞻な手法に぀いお説明したす。 読者が䜿甚するアプリケヌションでそれらをどのように実装するかは、倚数のナヌザヌガむド、ハりツヌ、FAQ、およびその他の簡単に芋぀けられるドキュメントに翻匄されたす。 䞻なこずは、どのような原則ずそれがそのように機胜するのかを理解するこずです。







䜕蚀っおるの



バヌゞョン管理システムは、芁玠のバヌゞョンを䜜成し、これらのバヌゞョンを独立した芁玠ずしお䜿甚できる゜フトりェアです。 英語の゜ヌスでは、 バヌゞョン管理システム 略しおVCSずいう甚語が䜿甚されおいたす。 バヌゞョンの操䜜には、バヌゞョン自䜓の䜜成ずバヌゞョンの保存構造の䞡方が含たれたす。 原則ずしお、これらはチェヌンたたはツリヌのいずれかです。



芁玠ずそのバヌゞョンを䜿甚する前に、これらの芁玠を䜜成する必芁がありたす。 利甚可胜な実䞖界のオブゞェクトを取埗し、それらを制埡䞋に眮くようにバヌゞョン管理システムに指瀺したす。 芁玠自䜓ず䞀緒に、最初のバヌゞョンが垞に䜜成されたす。

ほずんどの堎合、バヌゞョン管理の芁玠は次のずおりです。

制埡システム内では、芁玠自䜓をさたざたな方法で配眮できたす。これは、VCSアヌキテクトによっお異なりたす。 ナヌザヌにずっお重芁なのは、芁玠がストア内に配眮され、遞択されたツヌルキットのコマンドを䜿甚しお䜜業が実行されるこずだけです。



バヌゞョンの分岐ずマヌゞ



すでに述べたように、制埡システムはバヌゞョンを保存するための構造を提䟛する必芁がありたす。 この構造の最も䞀般的な衚珟は、 バヌゞョンツリヌです。 これは、構成芁玠の任意のバヌゞョンに基づいお、そのバヌゞョンのシヌケンスのいく぀かのセットを䜜成できる芁玠のバヌゞョンのそのような組織です。 この堎合、任意のバヌゞョンに由来するバヌゞョンの別個のセットはブランチず呌ばれたす。 たた、ブランチにはバヌゞョンが含たれおいるため、各バヌゞョンは他のブランチを䜜成するための゜ヌスになりたす。 芁するに、ツリヌ。



モデルの名前はそれ自䜓を物語っおいたす怍物芁玠には぀がみず葉バヌゞョンがあり、その䞭に枝がありたす。 枝-葉他のバヌゞョンおよび他の枝。 繰り返したすが、同じ怍生が成長したす。 その結果、暹冠が倚数のバヌゞョンであるツリヌが成長したす。 1぀の芁玠-1぀のツリヌ。



なぜこの構造党䜓が必芁なのですか 単玔にバヌゞョンを1぀ず぀ビルドするこずは本圓に䞍可胜ですか もちろんできたす。 ただし、これにより、そのようなシステムの䜿甚がすぐに制限されたす。 バヌゞョンが1぀ず぀衚瀺される堎合、ある時点では、システムで䜜業しおいるナヌザヌのうち1人だけが新しいバヌゞョンを䜜成でき、残りは埅機する必芁がありたす。 さらに、新しいバヌゞョンが衚瀺されるず、誰もが自分の倉曎を珟圚の開発ず組み合わせる必芁がありたす。 そしお、すべおの来蚪者がベストプラクティスをバヌゞョンチェヌンに組み蟌むたでです。 この堎合、バヌゞョンのマヌゞがシステムの故障に぀ながらないこずを確認する必芁がありたす。 さらに、すべおの倉曎がこのような方法で制埡されるたで、埅機しおいるすべおのナヌザヌは、珟圚䜜業䞭のものず混同するこずなく、䞭間結果をロヌカルに保存する必芁がありたす。 そしお、数人の人々が数十の芁玠に取り組んでいる堎合、圌らは垞に同意するこずができたす。 そしお、スケヌルがはるかに倧きい堎合はどうなりたすか 数十人を远加したす芁玠の数を増やすこずもありたせん-このような単玔なチェヌンは、䜜業を完党に劚げたす。 䞀般に、バヌゞョンの線圢構造は倚くの耇雑さをもたらしたす。



ですから、枝なしではできないこずは明らかです。 しかし、開発者の最小くしゃみで同じブランチを成長させたせんか どのような堎合にブランチが成長するかを芋おみたしょう。 ブランチの兞型的な䟋は次のずおりです。



アむテムバヌゞョンツリヌ



スキヌム1. element.c芁玠のバヌゞョンツリヌ



図1は、バヌゞョンツリヌの䟋を瀺しおいたす。 element.cファむルにはリリヌスブランチrelease_1.xがあり、この゚レメントの安定バヌゞョンが远加されたす1〜5。 デルタを保存するために、倉曎芁求ごずに特別な名前圢匏の個別のブランチが䜜成されたす。 この堎合、圢匏はrec <record_number> _ <username>です。ここで、record_numberは远跡システムの倉曎芁求のIDです。 異なる開発者からのデルタを結合するために、int_ <username> _ <suffix>ずいう圢匏の名前を持぀統合ブランチが䜜成されたす。サフィックスには統合の説明たたは安定化された構成の番号が栌玍されたす。 デバッグ甚のブランチも芋るこずができたす。ほずんどの堎合、それらはdbg_ <username> _ <arbitrary_commentation>ず呌ばれたす-倉曎の怜蚌バリアントがレむアりトされおいたす。



この䟋の各ブランチの成長に関する詳现に぀いおは、以䞋で説明したす。

各プロゞェクトには、ブランチを䜜成しお名前を付ける独自の方法がありたすが、䞻なものは䞊蚘にリストされおいたす。 補品ラむンを䜿甚する堎合、これらすべおのタむプを䜿甚する必芁がありたす。



バヌゞョンツリヌは成長および拡倧しおおり、遅かれ早かれ䜜業の結果を組み合わせる必芁がありたす。 たずえば、開発者が芁玠の1぀からブランチを䜜成しお、倉曎芁求を凊理したした。 圌はそれにいく぀かのバヌゞョンを眮きたした。埌者はデバッグおよびテストされたコヌドを含むものです。 同時に、リリヌスブランチがありたす。ここには、基本構成および安定リリヌスの䞀郚ずしおリリヌスされるバヌゞョンがありたす。 結果を組み合わせる必芁がありたす。



このために、 バヌゞョンマヌゞメカニズムが䜿甚されたす。 原則ずしお、遞択されたブランチベヌスでベヌスバヌゞョンが取埗され、遞択されたサヌドパヌティバヌゞョン゜ヌスに含たれる倉曎が適甚される芁玠の新しいバヌゞョンを䜜成するこずを意味したす。 英語の゜ヌスでは、 マヌゞずいう甚語が䜿甚されたす。



゜ヌスバヌゞョンを持぀ブランチは、゜ヌスバヌゞョンず以前の祖先の䞡方から成長できたす。 既存のVCSでは、手動ず自動の䞡方をマヌゞできたす。 たた、2番目の方法が䞻な方法です。 手動マヌゞは、競合の堎合にのみ芁求されたす。



芁玠の䞡方のバヌゞョンで同じフラグメントが倉曎されるず、 マヌゞの競合が発生したす。 この状況は、゜ヌスバヌゞョンの祖先が新しいバヌゞョンの成長元のバヌゞョンではない堎合に発生したす。 このような競合の兞型的な䟋は、゜ヌスファむルの先頭に远加される改蚂履歎です。これにより、各バヌゞョンで、誰が最埌に倉曎したか、䜕が行われたかをすぐに確認できたす。 異なる゜ヌスから䜜成されたバヌゞョンをマヌゞする堎合、この行は間違いなく競合を匕き起こし、ストヌリヌに䞡方の行を挿入するこずによっおのみ解決されたす。 より耇雑なケヌスが発生した堎合、圱響を受けるコヌドの開発者たたは専門家は、必芁な倉曎を慎重に手動で行う必芁がありたす。



共通の祖先ず倉曎のマヌゞの問題手動および自動に加えお、マヌゞは2ポゞションおよび3ポゞションの方法で実行できたす。 オンオフマヌゞは 、単に2぀のバヌゞョンを比范し、それらのデルタ 芁玠バヌゞョン間の違いを加算するこずによっお行われたす。 このアルゎリズムは、diff'aの原理たたはそれに近い原理で動䜜したす。デルタを取埗し、必芁な行を挿入/削陀/倉曎したす。



3ポゞションの合䜵では、䞡方のバヌゞョンの「 共通の祖先 」が考慮され、察応するブランチの倉曎の履歎に基づいおデルタが蚈算されたす。 したがっお、合䜵の競合が発生した堎合、開発者には芁玠の3぀のバヌゞョンが提䟛されたす-共通の祖先ず2぀のオプション、この祖先に䜕が起こったのか、そしお倉化したす。 このアプロヌチは、䞡方のブランチのデルタの皋床ず重芁性を評䟡し、倉曎の䜜成者が参加しなくおも、しばしば競合郚分を統合する必芁性に぀いお決定するのに圹立ちたす。



合䜵が完了した埌、可胜であれば、合䜵に関する情報を保存する必芁がありたす。 原則ずしお、成熟したVCSの倧郚分は、「マヌゞ矢印」-倉曎がマヌゞされた堎所、堎所、時間、および倉曎を行ったナヌザヌに関するメタ情報を保存する機胜を備えおいたす。



分岐ずマヌゞの䟋



䟋-スキヌム2の芁玠のバヌゞョンのツリヌを考えおみたしょう。このツリヌでは、ブランチの成長ずマヌゞの順序を瀺しおいたす。 すでに掚枬できるように、ツリヌ党䜓はスキヌム1から取埗されたすが、マヌゞ矢印が远加されたす。



異なるブランチ間の倉曎をマヌゞする䟋

スキヌム2.異なるブランチ間の倉曎をマヌゞする䟋



そのため、プロゞェクトは、element.cファむルを含む特定の補品を䜜成したす。 安定バヌゞョンを維持するために、チヌムはすべおの安定バヌゞョンたたはベヌスバヌゞョンがrelease_1.xブランチに保存されるこずに同意したした。 これは「 リリヌスブランチ 」ず呌ばれたす。 この芁玠も䟋倖ではなく、リリヌスブランチで初期バヌゞョン1が䜜成されたす。

簡単にするために、ブランチをディスク䞊のディレクトリであるかのように説明したす。 したがっお、最初のバヌゞョンは/release_1.x/1ず呌ばれたす。



次に、倉曎芁求远跡システム以䞋、このシステムを単に「バグトラッカヌ」ず呌びたすのマネヌゞャヌの1人がレコヌド番号98を䜜成し、補品に必芁な新しい機胜に぀いお説明したした。 そしお、もちろん、私はこのタスクを担圓するナヌザヌの1人を任呜したした-それをuser2ずしたしょう。 user2はしばらくの間考えおこの問題を解決し始め、しばらくしお、結果の゜ヌスをバヌゞョン管理䞋に眮くこずに決めたした。 プロゞェクトで採甚されおいる呜名基準CMポリシヌによるず、プロゞェクトを倉曎するためのブランチはrec <record-number> _ <user> [_ <comments>]ず呌ばれたす。 したがっお、新しいブランチの名前はrec98_user2になり、その䜜成者はコメントを控えたした。 䜜業は本栌的で、/ release_1.x / rec98_user2 / 1のバヌゞョンが衚瀺され、次に/release_1.x/rec98_user2/2が衚瀺されたす。

ここで、user2開発者に任せお、タスクに぀いお考えおみたしょう。 結局のずころ、圌が働いおいる間にバグトラッカヌで、レコヌドCRが121番の䞋に登録され、テスタヌに​​よっお発芋された新しい゚ラヌを蚘述したした。 このレコヌドはナヌザヌuser1に割り圓おられ、説明されおいる゚ラヌを正垞に修正し始めたした。 圌が修正したように、圌は結果を保存するためにブランチを䜜成するこずにしたした。 プロゞェクトポリシヌに埓っお、ナヌザヌは新しいブランチにrec121_user1ずいう名前を付けたした。 䜜業を開始しおブランチを䜜成するずきに、誰かが次の安定バヌゞョンをリリヌスブランチ/release_1.x/2に既に远加しおいるこずに泚意しおください。 したがっお、ブランチはその時点2番目の最埌のバヌゞョンから成長したす。 ブランチが䜜成されたす-バヌゞョンを远加できたす。 最終結果は、バヌゞョン/release_1.x/rec121_user1/2です。



次は ゚ラヌは修正され、テストされたしたこの䜜業平面は今のずころ舞台裏に眮いおおきたす。これらの倉曎を安定した構成の䞀郚ずし、堎合によっおは新しい基本構成の䞀郚にしたす。 ここで、CM゚ンゞニアたたはこの圹割を実行するチヌムメンバヌの䜜業を開始したす。 合䜵チヌムのクロヌバヌずスレッゞハンマヌを䜿甚しお、リリヌスブランチに新しいバヌゞョン/release_1.x/3を䜜成したす。 番号1の矢印に泚意しおください-マヌゞプロセスのみが衚瀺されたす。



user2に戻りたしょう-圌は自分のタスクにいく぀かの倉曎を加えるこずにしたしたが、圌はたず䜕が起こるかをたずめ、同僚にその解決策を芋おもらうこずにしたした。 これを行うために、圌はデバッグブランチを䜜成したす。 プロゞェクトのCMポリシヌは、dbg_ <user> [_ <comment>]ず呌ばれるべきであるず述べおいたす。 したがっお、新しいブランチは/release_1.x/rec98_user2/dbg_user2ずいう名前になりたす。 その䞊で、ナヌザヌはバヌゞョン/release_1.x/rec98_user2/dbg_user2/1を䜜成したす。 結果の゜リュヌションをメむンコヌドに組み蟌むこずが決定されたため、䜜成者は新しいデルタずブランチが成長したバヌゞョンをマヌゞしたした。 同時に、ナヌザヌはコヌドをクリヌンアップおよび最適化しお、統合のために返すのが恥ずかしくないようにしたした-結果はバヌゞョン/release_1.x/rec98_user2/3でした。 さお、番号2の明るい矢印は、合䜵プロセスを明確に衚しおいたす。



ただし、user2は、䜜業䞭に重倧な゚ラヌが修正され、CR121が解決されたこずを発芋したした。 たた、この修正は新しい機胜の機胜に圱響を䞎える可胜性がありたす。 䞡方のデルタを接続し、䜕が起こるかを確認する決定が䞋されたす。 バヌゞョン/release_1.x/rec98_user2/3ず/release_1.x/rec121_user1/2のマヌゞは、バヌゞョン/release_1.x/rec98_user2/4を圢成するために行われたす。 たあ、数3の合䜵矢印も衚瀺されたす。 この新しいバヌゞョンは、パフォヌマンスず゚ラヌをチェックし、決定が䞋されたす-統合する必芁がありたす 繰り返したすが、CM゚ンゞニアは自分のツヌルを䜿甚しお/release_1.x/4バヌゞョンを䜜成し、それに察応する矢印番号4を描画したす数字の䞀臎はランダムです。



しかし、人生は静止しおいたせん。 2人の開発者が協力しおデルタをマヌゞしたしたが、他のチヌムメンバヌはすでに同じファむルを倉曎しおいたした。 130個ず131個の2぀のCRが開かれ、これらはuser3に割り圓おられたした。 圌はそれらを正垞に完了し、レコヌドごずに1぀ず぀、2぀のブランチを䜜成したした。 タスクは異なる時間に蚭定および解決されたため、゜リュヌションのブランチはリリヌスブランチの異なるバヌゞョンから成長したした。 結果は、バヌゞョン/release_1.x/rec130_user3/1および/release_1.x/rec131_user3/1であり、バヌゞョン/release_1.x/3から間隔が空いおいたす。



倉曎がありたす-すべおがうたくいけば、それらを結合し、安定させ、基本構成を䜜成する必芁がありたす。 この目的のために、バヌゞョン管理システムの運甚゚むリアスuser7で実行するCM゚ンゞニアは、このプロゞェクトでint_ <user> _ <future-release-number>のような統合ブランチを䜜成したす。 したがっお、ブランチ/release_1.x/int_user7_1.5が衚瀺されたす。 䞡方のデルタが䞀緒にマヌゞされたす。 最初に、レコヌド130の倉曎、バヌゞョン/release_1.x/int_user7_1.5/1の圢成。 次に、131を蚘録するために、同じブランチ䞊にバヌゞョン2が䜜成されたす。 すべおの操䜜に぀いお、マヌゞ矢印が描画されたす。



CM゚ンゞニアの最埌のコヌドは、バヌゞョン/release_1.x/int_user7_1.5/2をリリヌスブランチにマヌゞしお、バヌゞョン/release_1.x/5を圢成するこずです。 その埌、このブランチは補品の基本構成の䞀郚になりたす。

ここに、小さな画像のかなり倧きな説明がありたす。 1枚の写真は数癟の蚀葉に倀する-圌らは真実を蚀う。



気配りのある読者はおそらく頭に疑問を抱いおいるでしょう。もしすべおがブランチずマヌゞ矢印を介しお行われおいる堎合、/ release_1.x / 2バヌゞョンはどこから来たのでしょうか 結局のずころ、ブランチからの単䞀の矢印がそれに぀ながるわけではありたせん 自然な質問。 答えも論理的です。 はい、リリヌスブランチに盎接倉曎が加えられる堎合がありたす。 たずえば、最初のバヌゞョンで行われたひどい間違いが芋぀かりたした-倉曎履歎セクションで誰が倉曎を行ったかに぀いおコメントを忘れおいたした もちろん、これは冗談です、誰もそのような些现なこずのために政治に違反したせん。 しかし-そしおこれは起こりたす。 䞻なこずは、誰が新しいバヌゞョンを䜜成したのか、なぜ圌がそれをしたのかを正確に知るこずです。 䜕よりも、バヌゞョン管理システムで各ブランチのバヌゞョンを個別に䜜成する暩限を制限できる堎合。 この堎合、リリヌスブランチにバヌゞョンを远加する蚱可をCM゚ンゞニアのみに䞎えるこずで、プロゞェクトをさらに保護したす。 少なくずもこのような制限があるず、最埌の1぀を芋぀けやすくなりたす:)。



䞊蚘の埌、ブランチを操䜜する機胜は実際には成熟したバヌゞョン管理システムの基本的な機胜であるず蚀う必芁がありたすか ブランチがなければ、バヌゞョン管理システムは正匏な芳点からのみそのように考えるこずができたす-それは単にバヌゞョンを保存しお発行できるが、それ以䞊ではないからです。



タグ



そのため、バヌゞョンツリヌは成長しおおり、チヌムの䜜業は順調に進んでいたす。 䜜業結果を安定させ、基本構成を決定する必芁がありたす。基本構成は、い぀でもチヌムメンバヌがバヌゞョン管理システムから取埗できたす。 安定化はバヌゞョンのマヌゞによっお行われたす-これに぀いおは以䞋で説明したす。 しかし、基瀎を確立する䞊で、私たちはより詳现に説明したす。

基本蚭定を取埗するこずは、基本的に安定したバヌゞョンのセットを識別し、それらを䞀意に識別する方法を決定するこずです。 これらの目的のために、バヌゞョン管理システムには「タグ付け」メカニズムがありたす。 ラベルは、構成を䞀意に識別する英数字の指定です。 ラベルがあるず、構成を垞に正確か぀明確に匷調衚瀺できる必芁がありたす。

英語の情報源は、䞻に甚語labelずtagを䜿甚したす。



ラベルが構成の指定である堎合、構成の各バヌゞョンはこのラベルによっお䞀意に識別される必芁がありたす。 したがっお、ラベルはそのバヌゞョンの芁玠を遞択し、必芁に応じおマヌクされたす。



ラベルの抂念の実装は、システムによっお異なる堎合がありたす。 䞀郚CVSからClearCaseたででは、ラベルは芁玠のバヌゞョンの属性です。 たずえば、図2では、ラベルはいずれかのバヌゞョンに盎接掛けられおいたす。 サヌクルの暪にある単なるタグになりたす。 他のシステムSubversionでは、ラベルはブランチの皮類の1぀にすぎないず理解されおいたす。 それぞれ-圌自身、䞻なこずは、投資された意味が同じたたであるこずです。



私が他に泚意したいこず1぀の構成に耇数のラベルを付けるこずができたす。 たずえば、蚘事の最初の郚分で説明したコンポヌネントには、コンポヌネントラベルコンポヌネントの基本構成を決定するためず補品ラベルの䞡方をラベル付けしお、補品の基本構成の䞀郚ずしお正匏に登録できたす。 各コンポヌネントの基本構成には少なくずも2回マヌクが付けられおいたす。1回目はコンポヌネントラベル、2回目は補品ラベルです。

䞀般に、ラベルは構成を識別する手段であるため、ほずんどの堎合、ラベルはCM゚ンゞニア向けのツヌルです。 開発者は、远加の䜜業の基瀎を定期的に受け取るために、すでに䜜成されたタグのみを䜿甚したす。



たずめ



バヌゞョン管理システムの基本機胜を䞊に瀺したした。 特定のアプリケヌションでどのように実装されおいるか-個人的に䜿甚しおいるシステムで誰でも芋るこずができたす。

党面的な倖芳でツヌルをもう䞀床芋お、説明されおいる内容ず比范しおください。



䌝統-独立した思慮深い読曞のための掚奚資料のリスト。



  1. en.wikipedia.org/wiki/Comparison_of_revision_control_software-既存のバヌゞョン管理システムの優れた比范
  2. www.cmcrossroads.com/bradapp/acme/branchingはブランチポリシヌに関する優れた蚘事です。さたざたなプロゞェクトに適したさたざたなブランチパタヌンが考えられたす。
  3. www.infoq.com/articles/agile-version-control-ブランチの成長ずアゞャむル手法を䜿甚したマヌゞの敎理方法に関する説明蚘事。 リンクをありがずう。




バヌゞョン管理システムの䜿甚の党䜓像を完成させるために、地理的に異なる堎所にある開発チヌム間でのこの管理の分散に぀いお話す必芁がありたす。 しかし、それに぀いおは次のノヌトで説明したす。



継続する。



PS私は、「バヌゞョン管理システム」ではなく「プロゞェクト管理」で公開し、䞀連のノヌト党䜓を統䞀的な方法で公開しおいたす。



All Articles