0

私は DVCS システム、特にバザーについて多くの良いことを聞いてきました。分散リポジトリの概念とは別に、宣伝されている主な利点が 2 つあります。マージがより自動化されていることと、名前の変更が適切に処理されていることです。

改善がどのように機能するかを正確に説明しているテキストを教えてください。私がファイルの名前を変更したことをbazaarはどうやって知るのですか? 同じコミットの一部として 2 つのファイルの名前を変更するとどうなりますか? ファイルの内容の半分を新しいファイルに入れ、すべてを再インデントし、ほぼすべての行で空白を失うことによってリファクタリングするとどうなりますか?

言い換えれば、実生活で bazaar (または別の DVCS) を使用している人、またはそれがどのように機能するかを知っている人から聞きたいです。マージは本当にそれほど優れていますか? そして、それはどのように達成されますか?


関連する質問、有用な回答:

Subversion よりも Mercurial の方が分岐とマージが簡単なのはなぜですか?

4

5 に答える 5

3

DVCS は、マージの親リビジョンを追跡することにより、より良いマージを実現します。Subversion では、あるブランチを別のブランチにマージすると、マージ元の情報が失われます。Bazaar や Git のような DVCS では、「マージされた」リビジョンは最終的に 2 つの親リビジョンになります。

名前の変更は、DVCS 間で異なる方法で処理されます。たとえば、Git は名前の変更をまったく追跡しません。なぜなら、それは Linus にとって重要ではなかったからです。Mercurial はそれらを「古いファイルを新しいファイルにコピーし、古いファイルを削除する」と記録します。Canonical の創設者であるMark Shuttleworth 氏によると、ファイルの名前変更を正しく処理できる DVCS は Darcs と Bazaar だけです。

私がファイルの名前を変更したことをbazaarはどうやって知るのですか?

ファイルの追加や削除と同様に、名前の変更はユーザーが指定します。" bzr rename <old> <new>" コマンドを使用して、名前を変更するファイルまたはディレクトリをマークします。ツリー内のファイルの名前を既に変更している場合は、" --after" オプションを使用できます。

同じコミットの一部として 2 つのファイルの名前を変更するとどうなりますか?

次にbzr rename <old> <new>、ファイルごとに " " を 1 回入力します。Bazaar は、どのファイルがリネームされたかを推測しようとしません。

ファイルの内容の半分を新しいファイルに入れ、すべてを再インデントし、ほぼすべての行で空白を失うことによってリファクタリングするとどうなりますか?

次にbzr add、実際には名前を変更していないため、新しいファイルに「 」と入力します。

于 2008-09-05T18:49:48.463 に答える
2

マージは DVCS で本質的に優れているわけではありません。ブランチ/マージが正しく機能しない場合 (svn は間違いなくブランチ/マージを正しく実装していません)、チェックアウトを行う代わりに、あなたが既存のコードからプロジェクトの作業を開始するたびに、新しいブランチを作成します。独自の集中型 SCS の中には、マージ/分岐を正しく処理しているものがあると思います。

それらすべてに対して機能する方法は、すべてのコミットを直接非循環グラフ (DAG) に記録することです。これにより、さまざまなマージ戦略を利用できます。詳細については、次を参照してください。

http://revctrl.org/CategoryMergeAlgorithm

少なくとも hg、bzr、および git は、外部のマージ ユーティリティを使用できます。

于 2008-09-16T11:33:12.850 に答える
1

きちんと読める記事

http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/

于 2008-10-22T05:22:55.923 に答える
1

以下は、darcs ( http://darcs.net ) がパッチをどのように扱うかについての議論です - http://darcs.net/manual/node9.html

于 2008-09-16T11:48:33.280 に答える
0

私は bazaar に詳しくありませんが、git はファイルの名前変更を追跡しません。git にとって、これは削除と追加のように見えます。ただし、git は、ファイルの内容がリポジトリに既に存在することを確認できるほどスマートであり、システム内の位置を追跡します。ファイルを分割またはマージする場合、コードのセグメント (ブロブ) を追跡し、その情報も保存するのに十分スマートです。

于 2008-09-05T16:54:21.453 に答える