SubversionずMercurialHGの比范

バヌゞョン管理システムを初めお知ったのは孊校に戻ったずきです。 それはSubversionでした。 その時、圌の匷さず胜力に非垞に感銘を受けたした。 しかし、時間が経ちたした。 ファむルやディレクトリなどの名前を倉曎するのはあたり楜しい瞬間ではありたせんでしたはい、長いラむブsvn 1.5、1.6およびその氞遠のフォルダ.svn。 そしお、ある日、バヌゞョン管理システムの倉曎に぀いお考えおいなかったら、すべおが同じ流れで続いおいたでしょう。 すべおが予想倖に玠早く起こり、Mercurialが私の目の前に珟れたした。 その機胜に぀いお読み、経隓豊富なヒントを求めなければなりたせんでしたが、今では同僚が新しいツヌルの動䜜ず動䜜を理解するのを助けたした。 Hgを知るようになればなるほど、それが奜きになり、むしろ、バヌゞョン管理ぞの分散型アプロヌチが奜きになりたしたが、Subversionは必然的に背景に消えおいきたした。

しかし、新しい職堎で再びSubversionを思い出さなければなりたせんでしたが、率盎に蚀っお、私は幞せになれたせんでした。 幞いなこずに、これは䌚瀟の無条件のポリシヌではなく、特に䞀郚の埓業員がGitを遞択しお正垞に䜜業しおいるこずを考えるず、代替手段を提䟛するこずは非垞に可胜です。 したがっお、小さなこずは、分散型バヌゞョン管理システムGitたたはMercurialを䜿甚する利点を明確に瀺すこずですが、個人的な経隓から、Hgに぀いお話すこずにしたした。 実際、この蚘事は、バヌゞョン管理システムの比范ず倉曎を目的ずしお、私が保持しおいるラりンドテヌブルの芁玄です。





どのバヌゞョン管理システムが優れおいるかに぀いおは倚くの意芋がありたす。 もちろん、それぞれの意芋には賛吊䞡論がありたす。 ただし、少なくずも最も単玔なシナリオを考えおみたしょう。2人以䞊がプロゞェクトに取り組んでおり、プロゞェクトがさらにサポヌトず開発を必芁ずする堎合たずえば、ラむブラリずしお、svnに保存するず、Mercurialに保存するよりもはるかに面倒です

Mercurialを他の機胜ず区別する特定の機胜に移りたしょう。



1. svn commitずは異なり、hg pushコマンドを䜿甚するず、プロゞェクト内の䜕かを倉曎しおサヌバヌにこれらの倉曎をコミットしたかどうかを垞に確認できたす。



svn commit-ロヌカルの倉曎をリモヌトサヌバヌに送信するコマンド。 それは原子的に起こりたす。 ただし、倉曎されたファむルの基になっおいるバヌゞョンがリモヌトサヌバヌ䞊の最埌ではない堎合にのみ倱敗したす。 ぀たり、ディレクトリにa.txtずb.txtずいう2぀のファむルがあり、b.txtのみを倉曎し、Petyaのみをa.txtファむルに倉曎した堎合、commitコマンドは正垞に完了し、svn updateコマンドを実行しなければすべおのファむルを曎新したす最新バヌゞョンぞのディレクトリ、あなたはそれに぀いお知りたせん。 Svnは、プロゞェクトフォルダヌからのコミットおよびチェックアりトもサポヌトしおいたす。 このため、あるフォルダヌでコミットした堎合、別のフォルダヌでの倉曎に぀いおはわかりたせん。



hg push-hg commitコマンドで以前に行われた䞀連の倉曎を送信するためのコマンド。 最埌のコマンドは、リポゞトリの珟圚の状態をキャプチャしたすが、完党にロヌカルで実行したす。 hg pushコマンドが実行された堎合にのみ、倉曎がリモヌトサヌバヌに送信されたす。 これは倉曎を転送するためのコマンドであるため、リポゞトリ党䜓に完党に拡匵されたす。 したがっお、このコマンドを䜿甚するず、リポゞトリの状態党䜓が完党に蚘録されたす。 そしお、誰かがあなたの前にプッシュするこずができた堎合、この状況はクロヌバヌずしお扱われ、デフォルトでは、hg pushは倱敗し、あなたのアクションはリモヌトストレヌゞに新しいヘッドを䜜るず蚀いたす。

完党を期すために、頭を定矩したしょう。 これは、それ自䜓がこのブランチの他のリビゞョンの芪ではないリビゞョンです。 ポリヘッド-1぀のブランチに耇数のヘッドがある状況。

誰かが先を行ったずきの状況に戻りたしょう。 ゚ラヌが返されたら、hg pullコマンドを実行する必芁がありたす。これにより、䞍足しおいるすべおのリビゞョンがロヌカルストレヌゞにプルされたす。 繰り返したすが、このアクションがファむルに圱響を䞎えるこずはありたせん。 それらのどれも倉曎されたせん。 このコマンドは、ただ持っおいない倉曎のリストを履歎に远加するだけです。 したがっお、リポゞトリ内の珟圚の状況を芖芚化するず、倚くのヘッドが圢成されおいるこずがわかりたす。 ロヌカルストレヌゞの倚面䜓は怖くない。 結局のずころ、私たち自身がそれを䜜りたした。 リモヌトストレヌゞで同じ状況を䜜成し、誰かが圌を説埗するこずができれば、はるかに危険です。 この人は、どのバヌゞョンが最も関連性があり、どのように䜜業するかを理解できなくなりたす。 圌は走り始め、悲鳎を䞊げ、これがすべお耇雑すぎお理解できないずcurりたす。 したがっお、珟圚の状態でプッシュするこずは絶察にしないでくださいMercurialでは、hg push --forceコマンドを䜿甚しおのみこれを行うこずができたす。 したがっお、2぀の目暙のマヌゞを実行し、Mercurialが安党にリモヌトサヌバヌにアップロヌドできる目暙を取埗する必芁がありたす。



そしお、なぜこれが重芁なのか。 䜕らかの理由で別の開発者が䞀般的なコンポヌネントロゞック、むンタヌフェむス、たたはその他を倉曎し、それに぀いお知らなかった堎合、svnの堎合、リモヌトリポゞトリに誀ったコヌドたたはコンパむルされおいないコヌドさえ含たれおいる可胜性がありたす。 同時に、最初のそのような暪棒は非垞に迅速に怜出できたすそれでも、時々svn updateを行い、コンパむルを開始したすよね、しかし、別の暪棒の発芋はテストにドラッグできたす。 Mercurialのロゞックにより、倉曎に぀いおすぐに孊習し、マヌゞですべおのチェックを䞀床に実行できたす。 もちろん、䜜業ず䞊行しお倉曎されたものに関心がなかった堎合、svnず同じ状況になるリスクがありたすが、1぀の違いがありたす-最初の堎合はこれに぀いおも知らず、2番目に埗点したす。

人がsvn commitコマンドの前にsvn updateコマンドを䜜成せず、コヌドをチェックしない堎合、圌は有眪であり、ここにプラスはないず䞻匵するこずができたすが、これは間違った意芋です。 svnの䞀連の曎新/コミットコマンドはアトミックではありたせん。hgpushはアトミック操䜜であり、これにより人生が倧幅に簡玠化されたす。



2. pull、mergeコマンドを䜿甚するず、svn updateずは異なり、リモヌトサヌバヌぞの転送を管理しおいない状態を倱うこずはありたせん。



これに぀いおはすでに蚀及したした-プルを䜿甚するず、ファむルを倉曎せずに、履歎に察する以前は䞍明な䞀連の倉曎を取埗できたす。 たた、Mercurialのマヌゞはロヌカルおよびロヌカルリビゞョンで行われるため、これらのリビゞョンはどこにも倱われたせん。 必芁に応じお、い぀でもマヌゞ結果を削陀しお再床実行するか、すべおのプル/マヌゞの前にあったリ​​ポゞトリのバヌゞョンに完党にロヌルバックできたす。 SVNでは、これは非珟実的です。 䜜業コピヌからsvn updateを実行するず、倉曎されおいない、新しい、自動的に連続するファむル、競合ファむル、および倉曎した通垞のファむルの寄せ集めができたす。 この堎合、svn update以前の状態をリポゞトリに戻すこずはできたせん。 たさか。



3.別の小さなバン-Mercurialのリポゞトリの任意のバヌゞョンに数秒でロヌルバックしたす。 唯䞀の制限は、ロヌカルコピヌがクリヌンである必芁があるこずですコミットされおいない倉曎はありたせん。 これは、hg updateを䜿甚しお目的のリビゞョンを指定しお実行できたす。 同時に、すべおの履歎がロヌカルにあるため、リモヌトサヌバヌに接続する必芁はありたせん。 svnでは、これはリモヌトサヌバヌでのみ、目的のリビゞョンでリポゞトリを再床ダりンロヌドするこずによっおのみ実行できたす。



4.アプリケヌションで䜕かを緊急に行う必芁があるこずがよくありたす。 たずえば、圌らはあなたに駆け぀けお来お、緊急にビルドを取埗したいず思っおいたす私はモバむル開発に携わっおいるので、ビルドサヌバヌがありたすが、これは起こりたす。 そしお、あなたはある皮の玠晎らしい機胜をカットしおいるので、あなたのプロゞェクトは完党に台無しにされおいたす。 SVNでは、最埌のリビゞョンからすべおの皮類をダりンロヌドするか、コヌドを倚少動䜜する状態にロヌルバックするか、今はできないず蚀う必芁がありたす。 すべおのオプションはたあたあで、通垞はかなり時間がかかりたす。 分散型バヌゞョン管理システムでは、ロヌカルコミットを行っおから、䜜業バヌゞョンのコヌドにロヌルバックしおプロゞェクトをビルドできたす。 この堎合、その埌は、混乱する前のリポゞトリの状態に正確に戻りたす



5.別の䞀般的な発生は、ラむブラリプロゞェクトの開発です。 そしお、長い間曞かれおいお、倖郚svnによっお接続されたラむブラリを䜿甚するプロゞェクトをビルドするように予期せずに芁求された堎合、倧きな問題が発生する可胜性がありたす。 叀いラむブラリを䜿甚しおいるため、単にアセンブルされおいない可胜性がありたす。叀いラむブラリを䜿甚しお、曞き換えや再構築などを行うこずができたした。 唯䞀の解決策は、このプロゞェクトが機胜するリビゞョンを探し、ラむブラリをコピヌアンドペヌストするこずです。 このような可胜性の可胜性は時間の増加ずずもに指数関数的に枛少するため、新しいバヌゞョンのラむブラリをサポヌトするための小さなプロゞェクト完了オプションは考慮しおいたせん。 Mercurialにはサブリポゞトリの抂念がありたす。これは、リポゞトリ自䜓だけでなく、その特定のバヌゞョンも指したす。 したがっお、プロゞェクトが動䜜しおいるラむブラリのバヌゞョンを垞に把握しおおり、その倉曎を恐れるこずはできたせん。



6. hgですでにブランチに぀いお蚀及したした。 svnでブランチがどのように実装されおいるかを思い出しおください。 これらは、リポゞトリの完党なコピヌを含む単なるフォルダヌです。 バヌゞョン1.5以降、このようなファむルの履歎が衚瀺されたすが、これらはただフォルダヌずファむルにすぎたせん。 それらを䜿甚するには、呜名ずコンテンツに関する特別な芏則を順守する必芁がありたす。 Mercurialでは、ブランチはリポゞトリの名前付き状態ずその倉曎です。 たた、ブランチで䜜業する堎合、すべおが同じブランチで䜜業する堎合ずたったく同じです。 はるかに簡単です。



7.ポむント6ず同様に、タグに぀いお話すこずができたす。



8.最埌に、コミットの履歎に぀いお述べたいず思いたす。 svnで玔粋に単玔であり、実際には10ではなくリビゞョン2に基づいおいお、3から10で䜕が起こっおいるのかわからなかったず蚀うこずは䞍可胜です。ただし、コミットは11でなければなりたせん。バヌゞョン2リポゞトリで䜜業し、リビゞョン10でコミット3を行い、その埌でのみ倉曎3を行ったこずを確認したす。このようなデヌタは、重芁なむベントを远跡する堎合に重芁です。



蚘事をたずめるず、私はMercurialを䜿っおいる間ずっず、その短所に名前を付けるこずができないこずに泚意したいず思いたす。 䞀郚は速床に問題があり、䞀郚はサヌバヌぞの倉曎をコミットするcommit / pushコマンドの耇雑さに起因したす。 私にずっおは、速床の特別な遅れに気づかなかったのでこれは問題ではありたせんもちろん、リポゞトリの巚倧なサむズがありたしたが、これらは人生の小さなものです、そしお2番目は習慣の問題です。



䞀般に、リストされおいるMercurialの利点の䞀郚は、他の分散型バヌゞョン管理システムに移行できたす。 そしおこの蚘事では、私自身が経隓した䟋ずしお、Mercurialに基づいお、このようなシステムを䜿甚する䞻な利点をすべお収集したいず思いたす。 あなたが遞択の苊痛を経隓しなければならないならば、私はこの蚘事が圹に立぀こずを望みたす。



ps最埌に、Gitに切り替えるこずにしたした=



All Articles