私はSubversionオタクです。Mercurial、Git、またはその他のDVCSを検討する必要があるのですか?


300

分散バージョン管理システム(DVCS)の利点を理解しようとしています。

Subversion Re-educationMartin Fowlerによるこの記事は非常に有用であることがわかりました。

Mercurialおよびその他のDVCSは、変更セットとローカルコミットを使用してコードを処理する新しい方法を促進します。それは地獄と他のコラボレーションの問題をマージすることを防ぎます

私は継続的な統合を実践しているので、これに影響されることはありません。プライベートブランチで単独で作業することは、実験しない限りオプションではありません。メジャーバージョンごとにブランチを使用し、トランクからマージされたバグを修正します。

Mercurialを使用すると、副官を持つことができます

これはLinuxのような非常に大規模なプロジェクトに役立つ可能性があることは理解していますが、小規模で高度に協力的なチーム(5〜7人)には価値がありません。

Mercurialはより高速で、ディスクスペースが少なくて済み、完全なローカルコピーにより、ログと差分の操作がより高速になります。

私が取り組んでいる非常に大規模なプロジェクトであっても、SVNの速度やスペースの問題に気づかなかったので、私もこれには関心がありません。

元SVNオタクからの個人的な経験や意見を求めています。特に、変更セットの概念と、測定した全体的なパフォーマンスの向上に関して。

更新(1月12日):今、試してみる価値があると確信しています。

更新(6月12日):Mercurialにキスし、気に入った。彼の桜の地元のコミットメントの味。試しにMercurialにキスしました。SVNサーバーがそれを気にしないことを願っています。それはとても間違っていた。とてもいい感じがしました。今夜恋しているわけじゃない

最終更新(7月29日)Eric Controlの次の例であるVersion Control by Exampleをレビューする特権がありました。彼は私を納得させました。Mercurialに行きます。


8
私もこれにとても興味があります。Subversionは、バージョン管理について考えるように教えられてきた方法に適合します(CVSなどから来ました)。それにもかかわらず、MercurialとGitを使用してオープンソースプロジェクトのバグ修正を試行する必要がありましたが、まだ変換されていません。
ベリンロリチュ

29
質問の+1。最近では、集中型と比較して、分散型のほうが優れ、高速、シンプル、自然でトラブルがなく、90%光沢のあるカーゴカルトになっています。必ずしもそうではないことを除いて。それらは異なるツールであり、それぞれは、ある状況では利点があり、他の状況では欠点があります。
ジョナスプラッカ

17
@Sharpie:両方を使用したsvngitおよびhg年のために、私は彼らの長所と短所のかなりよく承知しています。一方でgit、確かにこれらの中で最も強力であり、それがいることを認めることが重要だより強力なが自動的に意味するものではありませんより良いです。Emacsは確かにWebブラウザーで実行されているjavascriptテキストエディターよりも強力ですが、奇妙なことに、今このコメントをjavascriptブラウザーのテキストエディターに書き込んでいます!単純さは、愚かであっても、多くのコンテキストで価値があります。集中化されたローカルsvnなものを使用するとgit-svn、両方の長所が提供されます。
ジョナスプラッカ

9
@Sharpie:好きなのはあなたにとって良いことです。しかし、一人の男のプロは別の男の短所です。一部の人々は、単一の標準トランクを持つ単一の中央リポジトリの明快さを信じられないほど貴重だと考えています。ここだ方法についてのプレゼンテーションGoogleは単一のコードトランクの中、2000年にわたり、そのすべてのプロジェクトのソースコードを保持して 5000人の以上の開発者が同じリポジトリにアクセスして、コードの行数百万を含有します。5000台のサーバーと、全員の机にある2000件のプロジェクトの履歴を希望しますか?)
ジョナスプラッカ

21
Katy Perryの参照の場合は-1。;)
アマディエール

回答:


331

注:現在の質問に対する回答については、「編集」を参照してください


まず、Joel SpolskyによるSubversion Re-educationをお読みください。あなたの質問のほとんどはそこで答えられると思います。

もう一つの推薦、Gitリポジトリ上のLinus Torvalds氏話:http://www.youtube.com/watch?v=4XpnKHJAok8。この他の質問もあなたの質問のほとんどに答えるかもしれませんが、それは非常に面白い質問です。

ところで、私が非常におもしろいと思うもの:転覆の元の作成者の2人であるBrian FitzpatrickとBen Collins-Sussmanでさえ、転覆が水銀(およびDVCS全般)に劣ることについて言及した1つのGoogleトークで「それについてごめん」と述べました。

現在、IMOおよび一般的に、チームダイナミクスはどのDVCSでもより自然に発達します。顕著な利点は、次のことを暗示しているため、オフラインでコミットできることです。

  • サーバーと接続に依存しないため、時間が短縮されます。
  • コミットするためだけにインターネットアクセス(またはVPN)を取得できる場所の奴隷ではありません。
  • サーバーだけでなく、誰もがすべて(ファイル、履歴)のバックアップを持っています。誰でもサーバーになることができます
  • 他の人のコードを台無しにすることなく、必要に応じて強制的にコミットできます。コミットはローカルです。コミット中にお互いのつま先を踏むことはありません。コミットするだけで他の人のビルドや環境を壊すことはありません。
  • 「コミットアクセス」のない人はコミットできます(DVCSでのコミットはコードのアップロードを意味しないので)、貢献の障壁を下げて、変更をインテグレーターとしてプルするかしないかを決定できます。
  • DVCSがこれを本質的にするので、自然なコミュニケーションを強化できます... Subversionでは、代わりにコミットレースであり、コミュニケーションを強制しますが、作業を妨害します。
  • コントリビューターはチームを組んで独自のマージを処理できるため、最終的にインテグレーターの作業が少なくなります。
  • コントリビューターは、他のユーザーに影響を与えることなく、独自のブランチを持つことができます(ただし、必要に応じて共有できます)。

あなたのポイントについて:

  • DVCSlandには地獄の融合は存在しません。処理する必要はありません。次のポイントを参照してください
  • DVCSでは、全員が「ブランチ」を表します。つまり、変更が行われるたびにマージが行われます。名前付きブランチは別のものです。
  • 必要に応じて継続的インテグレーションを使用し続けることができます。私見は必要ありませんが、なぜ複雑さを増すのでしょうか?あなたの文化/ポリシーの一部としてテストを続けてください。
  • Mercurialはいくつかの点で高速で、gitは他の点で高速です。一般的にはDVCSではなく、特定の実装に限ります。
  • あなただけでなく、誰もが常に完全なプロジェクトを持ちます。分散されたものは、ローカルでコミット/更新できることと関係があり、コンピューターの外部からの共有/取得はプッシュ/プルと呼ばれます。
  • 繰り返しますが、Subversion Re-educationをお読みください。DVCSはより簡単で自然ですが、異なるため、cvs / svn ===すべてのバージョン管理のベースと考えないでください。

DVCSへの移行の説教を支援するために、Joomlaプロジェクトにいくつかのドキュメントを提供していました。ここでは、集中型と分散型を示す図を作成しました。

一元化

代替テキスト

一般診療で配布

代替テキスト

最大限に配布

代替テキスト

図にあるように、まだ「集中型リポジトリ」があり、これは集中型バージョン管理ファンのお気に入りの引数の1つです。「集中型」リポジトリは単なるリポジトリであるため、「まだ集中型」です。すべてが同意します(たとえば、公式のgithubリポジトリ)が、これはいつでも変更できます。

現在、これはDVCSを使用したオープンソースプロジェクト(大規模なコラボレーションを伴うプロジェクトなど)の一般的なワークフローです。

代替テキスト

Bitbucket.orgは、mercurialのgithubに相当します。スペースが無制限のプライベートリポジトリが無制限であることに注意してください。チームが5未満の場合は無料で使用できます。

DVCSを使用して自分を納得させる最良の方法は、DVCSを試すことです。svn/ cvsを使用した経験のあるDVCS開発者は、それだけの価値があり、それなしではいつまで生き延びたかはわかりません。


編集:2番目の編集に答えるために、DVCSでは異なるワークフローを持っていることを繰り返しますが、ベストプラクティスのために試さない理由を探さないことをお勧めします、OOPはそうではないと主張しているように感じます常にパラダイムXYZで行うことで、複雑な設計パターンを回避できるためです。とにかく利益を得ることができます。

それを試してみると、「プライベートブランチ」での作業が実際にはより良いオプションであることがわかります。最後の理由がわかる理由の1つは、コミットすることへの恐怖を失い、いつでもコミットしてより自然な方法でコミットできるようにすることです。

「地獄の融合」については、「実験している場合を除き」と言い、「実験中+メンテナンス+ 改良v2.0で同時に作業している場合でも」と言います。先ほど言ったように、地獄のマージは存在しません。なぜなら:

  • コミットするたびに名前のないブランチが生成され、変更が他の人の変更に合うたびに自然なマージが発生します。
  • DVCSはコミットごとにより多くのメタデータを収集するため、マージ中に発生する競合が少なくなるため、「インテリジェントマージ」と呼ぶこともできます。
  • マージの競合にぶつかった場合、次のように使用できます。

代替テキスト

また、プロジェクトのサイズは重要ではありません。subversionから切り替えたとき、実際にはすでに単独で作業しているときに利点があり、すべてが適切に感じられました。変更セット(正確なリビジョンではなく、コミットを含む特定のファイルの特定の一連の変更、コードベースの状態から分離)を使用すると、特定のファイルグループに対して行ったことを正確に視覚化できます。コードベース全体ではありません。

チェンジセットの仕組みとパフォーマンスの向上について。紹介したい例を使って説明します:githubネットワークグラフに示されているsvnからmootoolsプロジェクトに切り替えます

代替テキスト

代替テキスト

あなたが見ているのは、開発者がコミットしながら自分の作業に集中できることです。他のコードを壊すことを恐れることなく、彼らはプッシュ/プル後に他のコードを壊すことを心配しています(DVCS:最初のコミット、次にプッシュ/プル、そして更新)しかし、ここではマージがより賢いため、マージが競合することはまれですが、マージの競合が発生することはほとんどありません。

あなたへの私の推薦は、mercurial / gitの使い方を知っている人を探し、実際にあなたに説明するように彼/彼女に言うことです。私たちのデスクトップとbitbucketアカウントでMercurialを使用してマージする方法を示しながら、コマンドラインで友人と約30分を費やすことで、ばかげた時間で修正する方法を確認するために競合を作り上げることで、 DVCSの真の力。

最後に、Windowsを使用している場合は、git + githubではなくmercurial + bitbucketを使用することをお勧めします。Mercurialも少しシンプルですが、gitはより複雑なリポジトリ管理(たとえばgit rebase)に対してより強力です。

いくつかの追加の推奨読書:


18
素晴らしい答えですが、OPと同じボートに乗っている私たちにとっての1つの質問:地獄の合併がどのように存在しないのか説明できますか?インテグレーターまたはコントリビューターは、フォークが古くなったときに同じアクションを実行する必要はありませんか?
ニコール

17
いい答えだ。ちょっとした注意:Spolskyにはいい点があるかもしれないが、彼はそれらの点を販売材料として使用して製品を販売しようとしていることを覚えておいてください。
マーティンウィックマン

5
私はその再教育のページを読みましたが、多くの理由で関連性が見つかりませんでした。主題に関する個人的な見解で質問を編集します。

15
また、GitがSubversionクライアントとして機能できることを指摘する価値があります。つまり、全員を一度にGitに変換する必要はありません。一部のチームメンバーは、必要に応じてGitを使用するだけで、個々のワークフローが改善されます(特に、マージがはるかに簡単になるため)。
-greyfade

6
@ Pierre、DVCS は個々のプログラマーからのソフトウェアの変更をマージしますが、実際にソフトウェアをコンパイルしたり、既存の単体テストに合格させたりするのではありません。ソースが変更されるたびにこれを行うには他のソフトウェアが必要であり、最近の最善の策はCIエンジンを使用することです(そして適切に実行します)

59

あなたが言っていることは、本質的に単一のブランチにとどまっている場合、分散バージョン管理を必要としないことです。

それは事実ですが、それはあなたの働き方に対する不必要に強い制限ではなく、複数のタイムゾーンの複数の場所にうまく拡張できないものではありませんか?中央のSubversionサーバーはどこに配置する必要がありますか。何らかの理由でそのサーバーがダウンした場合、全員が帰宅する必要がありますか?

DVCSesはSubversionへ、Bittorrentはftpへ

(技術的に、法的ではありません)。おそらくあなたがそれを考えると、なぜこれほど大きな前進であるのか理解できるでしょうか?

私にとっては、gitに切り替えるとすぐに

  • バックアップが簡単になりました(「git remote update」だけで完了です)
  • 中央リポジトリにアクセスせずに作業する場合、小さな手順を簡単にコミットできます。ただ作業し、中央リポジトリをホストするネットワークに戻ったときに同期します。
  • より高速なハドソンビルド。更新よりもはるかに高速でgit pullを使用します。

だから、なぜBitTorrentがFTPよりも優れているのかを考えて、あなたの立場を再考してください:)


注:ftpがbittorrentよりも高速であるユースケースがあることが言及されています。これは、お気に入りのエディターが保持しているバックアップファイルがバージョン管理システムよりも速く使用できるのと同じ方法で当てはまります。


実際のプロジェクトで試してみることにしました。

良いアイデア。「私は本当にこれが好きです!」という考え方でそれに入ることを忘れないでください。「これをしたくない!」の代わりに。学ぶべきことがたくさんあります。gitを選択した場合、githubには多くの優れたオンラインヘルプがあります。hgを選択した場合、Joelは優れたオンライン資料を作成しました。bzrを選択した場合、Canonicalには多くの優れたオンライン資料があります。その他?

3
うーん、あなたはbittorrentがFTPよりも優れていると思うと仮定しています
マーフ

2
@Murph、私もそうだし、Blizzardもそうだ(大規模なオンライン同期に対処する方法を知っているのは誰だと思うか?)。 wowwiki.com/Blizzard_Downloader

2
@Murph、サーバーでトレントサーバーを起動し、クライアントでトレントクライアントを起動します。難しくない。変更されたファイルのみを更新する必要があることがすぐにわかるはずです。また、ftpの代わりにrsyncを使用してインクリメンタル更新を購入することを検討しましたか?

46

分散バージョン管理システムのキラー機能は、分散部分です。リポジトリから「作業用コピー」をチェックアウトするのではなく、リポジトリのコピー全体を複製します。強力な利点を提供するため、これは巨大です。

  • あなたは、このような...などのインターネットアクセスを持っていない場合でも、バージョン管理のメリットを享受することができ 、それだけの多くの強力なセールスポイントではありません---この1はDVCSは素晴らしいです理由として、残念ながら使い古さとoverhypedですカエルの雨が降り始めるのと同じくらいの頻度で、インターネットにアクセスせずにコーディングしていることがわかります。

  • ローカルリポジトリを持っている本当の理由は、マスターリポジトリにプッシュされる前にコミット履歴を完全に制御できるからです

バグを修正して、次のような結果になりました。

r321 Fixed annoying bug.
r322 Argh, unexpected corner case to annoying bug in r321!
r323 Ok, really fixed corner case in r322
r324 Oops, forgot to remove some debugging code related to r321
...

等々。そのような歴史は厄介です---実際には1つの修正しかありませんでしたが、現在は実装はデバッグステートメントの追加や削除などの不要なアーティファクトを含む多くのコミットに分散しています。SVNのようなシステムでは、履歴をきれいに保つためにすべてが機能するまでコミットない(!!!)ことです。それでも、ミスがすり抜けてしまい、マーフィーの法則は、かなりの量の作業がバージョン管理によって保護されていないときにあなたを残忍にするのを待っています。

自分が所有するリポジトリのローカルクローンを使用すると、「修正」コミットと「おっと」コミットを「バグ修正」コミットに継続的にロールすることで履歴を書き直すことができるため、これを修正します。1日の終わりに、1つのクリーンコミットが次のようなマスターリポジトリに送信されます。

r321 Fixed annoying bug.

それはあるべき姿です。

履歴を書き換える機能は、分岐モデルと組み合わせるとさらに強力になります。開発者は、ブランチ内で完全に分離された作業を行うことができ、そのブランチをトランクに入れるときは、あらゆる種類の興味深いオプションがあります。

  • プレーンバニラマージを実行します。いぼとすべてにすべてをもたらします。

  • やるリベースを。ブランチの履歴をソートしたり、コミットの順序を変更したり、コミットを破棄したり、コミットを結合したり、コミットメッセージを書き直したりできます。分散バージョン管理システムは、コードレビューを強力にサポートしています。

仲間のプログラマーの正気と私の将来のために、ローカルリポジトリがどのように私の歴史を編集できるかを学んだ後、私はSVNを永久に切断しました。私のSubversionクライアントは今git svnです。

開発者と管理者がコミット履歴を編集制御できるようにすることで、プロジェクトの履歴が改善され、クリーンな履歴を使用できるため、プログラマとしての生産性が向上します。「歴史の書き直し」についてのこのすべての話があなたを怖がらせても、それが中央、公開、またはマスターリポジトリの目的であるので心配しないでください。履歴は、誰かがそれを他の人が引き出しているリポジトリのブランチに持ち込むまで書き直されるかもしれません(そうすべきです!)。その時点で、歴史は石版に刻まれているかのように扱われるべきです。


6
履歴の書き換え:それは単なるGitのことですか?それともMercurialでも簡単ですか?(もしそうなら、私は本当にそれを始めなければなりません。)
ポールD.ウェイト

3
これを行うときは、Linuxカーネルの規律に注意する必要があります。つまり、公開したブランチをリベース(または履歴の書き換え)しないでください。短期使用のために公開されているブランチがある場合(linux-nextのように頻繁に破棄されるブランチにマージするため、または誰かがローカルコピーをレビューして破棄するため)、それらのブランチをリベースできます-しかし、他のユーザーは、そのブランチの規則はリベースでき、他の人々の長期ブランチにマージすべきではないということを明確にする必要があります。
ケンブルーム

4
完全に内部ネットワークにアクセスしなくても、インターネットにアクセスできる可能性があります。それは旅行中によく起こります。

5
インターネットアクセスを必要としないことは非常に重要です。DVCS の速度がそこから来るからです。ネットワーク経由でパケットを送信する必要があるとすぐに、接続の状態に関係なく、処理が1桁程度遅くなります。
アダムラセック

6
@ Paul、Mercurialでできることは理解できますが、基本的な機能や哲学ではありません。
ベンジョー

18

dukofgamingsの答えはおそらく得られるものとほぼ同じくらいですが、私はこれを別の方向からアプローチしたいと思います。

あなたの言うことは絶対に真実であり、良い慣行を適用することで、DVCSが修正するように設計された問題を回避できると仮定しましょう。これは、DVCSが利点を提供しないことを意味しますか?人々はベストプラクティスに従うことに悪臭を放ちます。人々がされて行く台無しに。では、なぜ、一連の問題を修正するように設計されたソフトウェアを避け、代わりに、人々がやらないことを事前に予測できることをするように人々に頼ることを選択しますか?


2
実際 DCVS に対してこの議論を提案します。私の会社は最近、CVSからMercurialに切り替えました。CVS上では、マージ中に他の人の変更をより頻繁に消去します。
Juozas Kontvainis

@JuozasKontvainis:Mercurialについてあまりよく知りませんが、gitでは、親としてHEADを持たないマージを含むプッシュを禁止できます。水銀にも似たようなものがあると思います。
naught101

@ naught101:実際、私の会社ではその設定が有効になっています。プログラマーは自分の変更をローカルにコミットしてからプッシュを試みます。彼は、プッシュする前にマージが必要なサーバーから応答を受け取ります。彼はサーバーから更新を取得し、マージコミットを試みます。この時点では、これらの人がどのようにマージコミットを行ったかは正確にはわかりませんが、マージコミットを行うと、サーバーから取得した変更が基本的に消去されることがあります。
Juozas Kontvainis

1
人々が変更を引き出し、マージ時にサーバーから取得した変更を実際に削除したようです(これは可能です)。もちろん、サーバーからの変更セットはまだそこにあるため、リポジトリを変更前の状態にリセットできます。
哲学者

1
:実際に、それはこのように聞こえるrandyfay.com/content/avoiding-git-disasters-gory-storyあなたがやっているかわからない場合Gitのレポと間違って行くことができるかについての素晴らしい、非クリティカル品。
gbjbaanb

9

はい、subversionで大きなコミットをマージする必要がある場合は痛いです。しかし、これは素晴らしい学習体験でもあり、競合をマージしないようにあらゆることを実行できます。つまり、頻繁チェックインすることを学びます。早期統合は、同じ場所にあるプロジェクトにとって非常に良いことです。誰もがそれをしている限り、subversionを使用することはあまり問題になりません。

たとえば、Git は分散作業向けに設計されており、人々が自分のプロジェクトに取り組み、後で(最終的に)マージするために独自のフォークを作成することを奨励しています。OPが求めているのは、「小規模で高度に協力的なチーム」での継続的な統合のために特別に設計されたものではありません。それはむしろ反対です、それについて考えるようになります。同じコードで一緒に作業している同じ部屋に座っているだけなら、その派手な分散機能を使用することはできません。

したがって、同じ場所に配置されたCIを使用するチームにとって、分散システムを使用するかどうかはそれほど重要ではないと思います。味と経験の問題に要約されます。


2
Gitは世界中に分散した作業用に設計されており、人々が独自のプロジェクトに取り組み、独自のフォークを作成することを奨励しています。OPが求めているのは、「小規模で高度に協力的なチーム」での継続的な統合のために特別に設計されたものではありません
マーティンウィックマン

4
推測すると、より小さい/簡単な競合が発生して解決できます。しかし、2人の従業員がコードの同じ部分を変更している場合、チームに計画上の問題があり、それはどのVCSでも解決できません。分散しているかどうか。
マーティンウィックマン

4
OPは、CIを使用する同じ場所に配置されたチーム内にあります。これは、多くの小さなチェックインを頻繁に(1日に数回)行うことを意味します。これを考えると、dvcsを使用することで特定の利点が得られる理由は見当たりません。また、巨大なマージが発生するため、地獄がマージされない理由も見当たりません。ただし、分散チームにはsvnをお勧めしませんが、ここではそうではありません。
マーティンウィックマン

2
@MartinWickman-Mercurialは、高速かつ安価にコミット、分岐、およびマージするように設計されています。継続的な統合に最適です。個人的には、アリスが彼女の変更をブランチし、ボブがそれらをプルして問題をチェックするためにそのブランチに変更をマージする能力を持っていると思うと思います-中央サーバーに触れたり、どこにでもプッシュすることなく-素晴らしい方法のように聞こえます小規模で高度に協力的なチームが作業するため。
哲学者

2
私の0.02ドル。Subversion、Mercurial、およびGitをさまざまなプロジェクトに使用しました。Subversionは、継続的な統合を行う非常に緊密に統合されたグループにとって最適な選択肢であるようです。Mercurialは、1日に1つのビルドのみを実行し、そのたびにコードをより多く変更する(SVNでマージの問題が発生する)グループに適しています。Gitは、ビルドを行うために実際にコードを一緒にプッシュすることなく、数日/数週間行くことができるチームを持つ人々のために行く方法のようです。
ブライアンノブラウチ

8

自分の知識に継続的に挑戦する必要があるからです。あなたは転覆が好きです、そして私はそれを長年使っていて、それについて非常に満足していたので、私は理解できますが、それはそれがそれがあなたに最も合うツールであることをまだ意味しません。

私はそれを使い始めたとき、それが当時最良の選択だったと信じています。しかし、時間の経過とともに他のツールが登場し、今では自分の空き時間プロジェクトでもgitを好みます。

また、Subversionにはいくつかの欠点があります。たとえば、ディスク上のディレクトリの名前を変更しても、リポジトリ内の名前は変更されません。ファイルの移動はサポートされていません。ファイルの移動をコピー/削除操作にし、ファイルの移動/名前変更が行われたときに変更をマージすることを困難にします。また、マージ追跡は実際にはシステムに組み込まれているのではなく、回避策の形で実装されています。

Gitはこれらの問題を解決します(ファイルが移動されたかどうかを自動的に検出するなど、事実であることを伝える必要さえありません)。

一方、gitでは、subversionのように個々のディレクトリレベルで分岐することはできません。

ですから、私の答えは、代替案を調査し、慣れているものよりもニーズに合っているかどうかを確認してから決定することです。


非常に真実であり、代替案の実験は自動的に行われるべきです。

gitは、特定のヒューリスティックを使用して、ファイルが移動したかどうかを判断します。ファイルは良好ですが完全ではありません。
gbjbaanb

それに同意します。たとえあなたがいまいましい子供たちが使う新しいツールを嫌いでも、特にこれらが大きな波を作っている場合は、少なくとも新しいことを試してみることを強制することが重要だと思います。
Tjaart

7

パフォーマンスに関しては、Gitや他のDVCSは、あるブランチから別のブランチに切り替えたり、あるリビジョンから別のリビジョンにジャンプしたりする必要がある場合にSVNよりも大きな利点があります。すべてがローカルに保存されるため、物事はSVN よりはるかに高速です。

これだけで切り替えが可能になります!


同意して、gitチェックアウトは非常に高速です。

指摘するための+1、ブランチ/チェンジセット間のジャンプは非常に高速です
-dukeofgaming

3

その代わりに、「DVCSを必要としないベストプラクティスを適用することで」という考えに固執し、SVNワークフローはベストプラクティスのセットを含む1つのワークフローであり、GIT / Hgワークフローは異なるワークフローであると考えてください。別のベストプラクティスのセットを使用します。

git bisect (およびそのメインリポジトリへの影響のすべて)

Gitでは、非常に重要な原則は、を使用してバグを見つけることができるということですgit bisect。これを行うには、動作することがわかっている最後に実行したバージョンと、失敗することがわかっている最初に実行したバージョンを使用し、(Gitの助けを借りて)バイナリ検索を実行して、どのコミットがバグを引き起こしたかを特定します。これを行うには、修正履歴全体にバグ検索を妨げる可能性のある他のバグが比較的ない必要があります(信じられないかもしれませんが、実際にはこれは実際に非常にうまく機能し、Linuxカーネル開発者は常にこれを行います)。

git bisect機能を実現するには、独自の機能ブランチで新しい機能を開発し、リベースして履歴をクリーンアップします(したがって、履歴に既知の非機能リビジョンが存在しないようにします。問題を修正するため)、機能が完了したら、作業履歴を使用してメインブランチにマージします。

また、これを機能させるには、機能ブランチを開始するメインブランチのバージョンに関する規律が必要です。master関係のないバグがある可能性があるため、ブランチの現在の状態から開始することはできません-カーネルコミュニティでのアドバイスは、カーネルの最新の安定バージョン(大きな機能の場合)から作業を開始するか、作業を開始することです最新のタグ付きリリース候補から。

その間に機能ブランチをサーバーにプッシュすることで中間の進捗をバックアップすることもできます。また、機能ブランチをサーバーにプッシュして他の人と共有し、機能が完了する前にフィードバックを引き出すことができます。コードをプロジェクトの全員*が対処しなければならないコードベースの永続的な機能に変えます。

gitworkflowsの manページには、Gitがために設計されているワークフローの入門です。また、GitがXよりも優れている理由は、 gitワークフローについて説明しています。

大規模な分散プロジェクト

優れた実践と優れた設計習慣を備えた高度に協力するチームに中liが必要なのはなぜですか?

Linuxのようなプロジェクトでは、地理的に分散している非常に多くの人々が関与しているため、会議室を共有する小さなチームほど高度に協力することは困難です。(Microsoft Windowsのような大規模な製品を開発する場合、全員が同じ建物内にいるとしても、チームが大きすぎて共同作業のレベルを維持できないため、集中型VCSが中euなしで動作すると思われます。)


最初の点はわかりません。参考文献はありますか?最後のものについては、代わりにプロジェクトを個別のコンポーネントに分割します。このような大規模なプロジェクトに取り組んだことはありません。同じプロジェクトに参加した開発者の最大数は20 人です。

@ピエール。プロジェクトを個別のコンポーネントに分割することは確かに合理的です。Linuxはモノリシックカーネルであるため、それぞれが本質的に別個のプロジェクトであっても、(本質的に)すべてのデバイスドライバーを同じリポジトリで開発する必要があります。同時に、経験豊富なアーキテクトがこれらのドライバーすべてに影響を与える広範な変更を行う敏a性を求めているため、それらを異なるリポジトリーに分割するのは苦痛になります。したがって、git(および中li)は、これらのさまざまな懸念を管理するのに適しています。
ケンブルーム

また、SVN対GitおよびMercurialのワークフローについてMartin Fowlerが言わなければならないことを読むことに興味があるかもしれません。martinfowler.com/bliki/VersionControlTools.html
ケン・ブルーム

2
バグを見つけるためにSVNを定期的に二分します。Gitとの唯一の違いは、すべてが自動ではないことです。しかし、これだけでは、切り替えるには十分ではありません。
ザビエルノード

1
小規模チームに対するgit bisectの関連性はほとんどありません。さまざまな人々からの何百もの変更が一度にマージされて物事を壊しているカーネルに対してそれを手に入れますが、5人のチームがある場合、通常、ログ。
blucz

2

一緒に使用してみませんか?私の現在のプロジェクトでは、CVSを使用せざるを得ません。ただし、機能の開発を行うためにローカルgitリポジトリも保持しています。さまざまなソリューションを試して、作業中のバージョンを自分のマシンに保存できるので、これは両方の世界で最も優れています。これにより、以前のバージョンの機能にロールバックしたり、コードを台無しにしたときに問題に陥ることなくいくつかのアプローチを試すことができます。中央リポジトリを使用すると、中央リポジトリを使用する利点が得られます。


ただし、DVCSを使用して中央リポジトリを設定するだけで済みます(
CVCS

確かに、Windows環境を使用している場合、中央のgitリポジトリはセットアップが難しい場合があります。考えられるのはそれだけだと思います。私たちは企業レベルでCVSを使用せざるを得なかったので、選択肢があまりありませんでした。
ワディム

1

私はDVCSの個人的な経験はありませんが、ここでの回答とリンクされたドキュメントから収集したものから、DVCSとCVCSの最も基本的な違いは、使用されている作業モデルです

DVCS

DVCSの作業モデルは、独立した開発を行っているということです。チームの他のメンバーにリリースするまで、他のすべての変更から分離して新しい機能/バグ修正を開発しています。それまでは、他の誰も気にしないので、好きなチェックインを何でもできます。

CVCS

CVCS(特にSubversion)の作業モデルは、共同開発を行っているということです。他のすべてのチームメンバーと直接コラボレーションして新しい機能/バグ修正を開発しており、すべての変更はすべてのユーザーがすぐに利用できます。

その他の違い

リビジョンと変更セットなど、svngit/のその他の違いhgは偶発的です。リビジョンに基づくDVCS(Subversionに含まれる)またはチェンジセットに基づくCVCS(Git / Mercurialに含まれる)を作成することは非常に可能です。

特定のツールを推奨するつもりはありません。なぜなら、それは主にあなた(そしてあなたのチーム)が最も快適な作業モデルに依存しているからです。
個人的には、CVCSでの作業に問題はありません。

  • 不完全だがコンパイル可能な状態にするのに問題はないので、チェックインする心配はありません。
  • 私はマージ-地獄を経験したとき、それは両方で発生していた状況にあったsvngit/ hg。たとえば、一部のソフトウェアのV2は、V3の開発中に別のVCSを使用して別のチームによって保守されていました。時々、バグ修正をV2 VCS​​からV3 VCSにインポートする必要があります。これは基本的に、V3 VCSで非常に大きなチェックインを行うことを意味します(すべてのバグ修正を単一のチェンジセットで)。私はそれが理想的ではなかったことを知っていますが、異なるVCSシステムを使用することは管理上の決定でした。

孤立した開発が実際にDVCSの作業モデルであるとは思わない。DVCSの重要な機能の1つは、チームの他のメンバーがローカルの変更をプルしたり、ローカルリポジトリを複製したりできることです。あなたが好きなときにコミットし、あなたの変更は常に利用可能であり、あなたのバグは大混乱を引き起こすことはできません。
哲学者

@philosodad:他の人がそのコードの状態を知らずに私のリポジトリからコードをプルした場合、それは大混乱を引き起こす可能性があります。唯一の違いは、誰の責任であるかです。そして、私のコードは常に利用できるとは限りません。私のシステムが外部アクセス用に構成されているかどうかに依存します。
バートヴァンインゲンシェナウ

リポジトリからコードを引き出して自分のコードとマージすると、大規模な問題を発生させることなく、独立してロールバックできます。第二に、コードベースへのアクセスを拒否し、システムの主要な機能を損なうことを決定した場合は、自分自身を強制的に分離できます。これは、分離開発用にモデル化されているシステムとは大きく異なります。DVCSはそうではありません。DVCSの作業モデルの理解は、単に間違っています。
哲学者

1
@philosodad:私はそれをより良く理解し始めていると思います:CVCSの場合と同じように、誰もがあなたの混乱を得ることができますが、あなたは彼らにそれを押し付けなかったので、もはやあなたのせいではありません。:-)
バートヴァンインゲンシェナウ

ええと… しかし、一般的に、アリスは、クローンまたはブランチ最初となり、その後、それが簡単にちょうど彼女が最初の場所であなたのバギーのコードを見たことがないふりをすることができた、あなたの変更をマージ!
哲学者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.